/ Hex Artifact Content
Login

Artifact 2a0d5da39dbab4e1501d458202e7b22040df05270e0fa043b6c98b61d34315e2:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
4d20: 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
4d30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 74 72   /* Database str
4d40: 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20  ucture for this 
4d50: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74  iterator */.  Ft
4d60: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
4d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d80: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
4d90: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
4da0: 73 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  st */.  Fts5Cols
4db0: 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
4dc0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
4dd0: 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
4de0: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  hese columns */.
4df0: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64 20 74 6f  .  /* Invoked to
4e00: 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   set output vari
4e10: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76 6f 69 64  ables. */.  void
4e20: 20 28 2a 78 53 65 74 4f 75 74 70 75 74 73 29 28   (*xSetOutputs)(
4e30: 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 53  Fts5Iter*, Fts5S
4e40: 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20 69 6e 74  egIter*);..  int
4e50: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e70: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4e80: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4e90: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4eb0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4ec0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4ed0: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ef0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4f00: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4f10: 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20 69 53 77  es */..  i64 iSw
4f20: 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20 20 20  itchRowid;      
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4f40: 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20 6f 74  test rowid of ot
4f50: 68 65 72 20 74 68 61 6e 20 61 46 69 72 73 74 5b  her than aFirst[
4f60: 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  1] */.  Fts5CRes
4f70: 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20 20 20  ult *aFirst;    
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f90: 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28  nt merge state (
4fa0: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
4fb0: 46 74 73 35 53 65 67 49 74 65 72 20 61 53 65 67  Fts5SegIter aSeg
4fc0: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
4fd0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
4fe0: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f  ent iterators */
4ff0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  .};.../*.** An i
5000: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5010: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
5020: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5030: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5040: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5050: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5060: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5070: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5080: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5090: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
50a0: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
50b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
50c0: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
50d0: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
50e0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
50f0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5100: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5110: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5120: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
5130: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
5140: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5150: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5160: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
5170: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
5180: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
51b0: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
51c0: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51e0: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
5200: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5210: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5220: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
5230: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
5240: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5250: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5280: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5290: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
52a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
52b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
52c0: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
52d0: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
52e0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
52f0: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
5300: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5310: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5320: 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  [1];.};..static 
5330: 76 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28  void fts5PutU16(
5340: 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56  u8 *aOut, u16 iV
5350: 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d  al){.  aOut[0] =
5360: 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f   (iVal>>8);.  aO
5370: 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78  ut[1] = (iVal&0x
5380: 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  FF);.}..static u
5390: 31 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f  16 fts5GetU16(co
53a0: 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20  nst u8 *aIn){.  
53b0: 72 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e  return ((u16)aIn
53c0: 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b  [0] << 8) + aIn[
53d0: 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c  1];.} ../*.** Al
53e0: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
53f0: 6e 20 61 20 62 75 66 66 65 72 20 61 74 20 6c 65  n a buffer at le
5400: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20  ast nByte bytes 
5410: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
5420: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
5430: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72  s encountered, r
5440: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73  eturn NULL and s
5450: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
5460: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35  e in.** the Fts5
5470: 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73  Index handle pas
5480: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5490: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49  atic void *fts5I
54b0: 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64  dxMalloc(Fts5Ind
54c0: 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ex *p, int nByte
54d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
54e0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
54f0: 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
5500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
5510: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5520: 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75 66  of the pLeft buf
5530: 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52 69  fer with the pRi
5540: 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e  ght/nRight blob.
5550: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
5560: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
5570: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
5580: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
5590: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
55a0: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
55b0: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
55c0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
55d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
55e0: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
55f0: 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ht.*/.#ifdef SQL
5600: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5610: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
5620: 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74  ompareBlob(.  Ft
5630: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5650: 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20   Left hand side 
5660: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
5670: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
5680: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20  ght, int nRight 
5690: 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64     /* Right hand
56a0: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
56b0: 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
56c0: 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74  nCmp = MIN(pLeft
56d0: 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20  ->n, nRight);.  
56e0: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
56f0: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5700: 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  t, nCmp);.  retu
5710: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
5720: 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29  eft->n - nRight)
5730: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
5740: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  f../*.** Compare
5750: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
5760: 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
5770: 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
5780: 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a   If one buffer.*
5790: 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  * is a prefix of
57a0: 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
57b0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65  s considered the
57c0: 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   lesser..**.** R
57d0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
57e0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
57f0: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
5800: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
5810: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
5820: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
5830: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
5840: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
5850: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
5860: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
5870: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
5880: 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42  ferCompare(Fts5B
5890: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74  uffer *pLeft, Ft
58a0: 73 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74  s5Buffer *pRight
58b0: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
58c0: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52  MIN(pLeft->n, pR
58d0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20  ight->n);.  int 
58e0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
58f0: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70  ft->p, pRight->p
5900: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
5910: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
5920: 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e  ft->n - pRight->
5930: 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73 74  n) : res);.}..st
5940: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65 61  atic int fts5Lea
5950: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46 74  fFirstTermOff(Ft
5960: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a  s5Data *pLeaf){.
5970: 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74 73    int ret;.  fts
5980: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
5990: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
59a0: 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20 72  Leaf], ret);.  r
59b0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
59c0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
59d0: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
59e0: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
59f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
5a00: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
5a10: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
5a20: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
5a30: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
5a40: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20  3_blob *pReader 
5a50: 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20  = p->pReader;.  
5a60: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
5a70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  ;.    sqlite3_bl
5a80: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
5a90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5aa0: 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f 72  Retrieve a recor
5ab0: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
5ac0: 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
5ad0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
5ae0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
5af0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
5b00: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a   left in the .**
5b10: 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63   Fts5Index objec
5b20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  t..*/.static Fts
5b30: 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52  5Data *fts5DataR
5b40: 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ead(Fts5Index *p
5b50: 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
5b60: 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74 20   Fts5Data *pRet 
5b70: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
5b80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5b90: 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
5ba0: 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20  TE_OK;..    if( 
5bb0: 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20  p->pReader ){.  
5bc0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
5bd0: 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
5be0: 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65 72  TE_ABORT if ther
5bf0: 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61 76  e has been a sav
5c00: 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20  epoint.      ** 
5c10: 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20 69  rollback since i
5c20: 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
5c30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 20   In this case a 
5c40: 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a  new blob handle.
5c50: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
5c60: 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ired.  */.      
5c70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
5c80: 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65 72  lob = p->pReader
5c90: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64  ;.      p->pRead
5ca0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  er = 0;.      rc
5cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
5cc0: 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52  reopen(pBlob, iR
5cd0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73 73  owid);.      ass
5ce0: 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d  ert( p->pReader=
5cf0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 );.      p->p
5d00: 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b 0a  Reader = pBlob;.
5d10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
5d20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5d30: 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
5d40: 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  er(p);.      }. 
5d50: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
5d60: 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20 3d  ITE_ABORT ) rc =
5d70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5d80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
5d90: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20   blob handle is 
5da0: 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69 73  not open at this
5db0: 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74 20   point, open it 
5dc0: 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a 2a  and seek .    **
5dd0: 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74 65   to the requeste
5de0: 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 20  d entry.  */.   
5df0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d   if( p->pReader=
5e00: 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
5e10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73  _OK ){.      Fts
5e20: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
5e30: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
5e40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5e50: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e  3_blob_open(pCon
5e60: 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20  fig->db, .      
5e70: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
5e80: 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22  , p->zDataTbl, "
5e90: 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20  block", iRowid, 
5ea0: 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20  0, &p->pReader. 
5eb0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
5ec0: 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
5ed0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  of the sqlite3_b
5ee0: 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  lob_open() or sq
5ef0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
5f00: 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a  n() calls.    **
5f10: 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20   above returned 
5f20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65  SQLITE_ERROR, re
5f30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
5f40: 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64  UPT_VTAB instead
5f50: 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65  ..    ** All the
5f60: 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66   reasons those f
5f70: 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72  unctions might r
5f80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5f90: 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20  OR - missing.   
5fa0: 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69   ** table, missi
5fb0: 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62  ng row, non-blob
5fc0: 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63  /text in block c
5fd0: 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65  olumn - indicate
5fe0: 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67   .    ** backing
5ff0: 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f   store corruptio
6000: 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  n.  */.    if( r
6010: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
6020: 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
6030: 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  UPT;..    if( rc
6040: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6050: 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20       u8 *aOut = 
6060: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6070: 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61   /* Read blob da
6080: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  ta into this buf
6090: 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  fer */.      int
60a0: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
60b0: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
60c0: 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69  Reader);.      i
60d0: 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65  nt nAlloc = size
60e0: 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 6e  of(Fts5Data) + n
60f0: 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41 54 41  Byte + FTS5_DATA
6100: 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PADDING;.      
6110: 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74 61  pRet = (Fts5Data
6120: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6130: 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  (nAlloc);.      
6140: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
6150: 20 20 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e      pRet->nn = n
6160: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 61 4f  Byte;.        aO
6170: 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28  ut = pRet->p = (
6180: 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20  u8*)&pRet[1];.  
6190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
61b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OMEM;.      }.. 
61c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
61d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
61e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
61f0: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61  lob_read(p->pRea
6200: 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65  der, aOut, nByte
6210: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6220: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6240: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
6250: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  et);.        pRe
6260: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
6270: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
6280: 4f 44 4f 31 3a 20 46 69 78 20 74 68 69 73 20 2a  ODO1: Fix this *
6290: 2f 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  /.        pRet->
62a0: 70 5b 6e 42 79 74 65 5d 20 3d 20 30 78 30 30 3b  p[nByte] = 0x00;
62b0: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 73  .        pRet->s
62c0: 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
62d0: 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b  16(&pRet->p[2]);
62e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
62f0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
6300: 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20     p->nRead++;. 
6310: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
6320: 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21  Ret==0)==(p->rc!
6330: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20  =SQLITE_OK) );. 
6340: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
6350: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6360: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64 61   reference to da
6370: 74 61 20 72 65 63 6f 72 64 20 72 65 74 75 72 6e  ta record return
6380: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
6390: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35   call to.** fts5
63a0: 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73  DataRead()..*/.s
63b0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
63c0: 61 74 61 52 65 6c 65 61 73 65 28 46 74 73 35 44  ataRelease(Fts5D
63d0: 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 73  ata *pData){.  s
63e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
63f0: 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74  a);.}..static Ft
6400: 73 35 44 61 74 61 20 2a 66 74 73 35 4c 65 61 66  s5Data *fts5Leaf
6410: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
6420: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
6430: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
6440: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
6450: 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  p, iRowid);.  if
6460: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 66  ( pRet ){.    if
6470: 28 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 3e 70  ( pRet->szLeaf>p
6480: 52 65 74 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20  Ret->nn ){.     
6490: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
64a0: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 66 74 73  RRUPT;.      fts
64b0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 52 65  5DataRelease(pRe
64c0: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
64d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
64e0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
64f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
6500: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6510: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
6520: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
6530: 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72  **ppStmt,.  char
6540: 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20   *zSql.){.  if( 
6550: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
6560: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
6570: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
6580: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6590: 65 5f 76 33 28 70 2d 3e 70 43 6f 6e 66 69 67 2d  e_v3(p->pConfig-
65a0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20  >db, zSql, -1,. 
65b0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
65c0: 50 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45  PREPARE_PERSISTE
65d0: 4e 54 7c 53 51 4c 49 54 45 5f 50 52 45 50 41 52  NT|SQLITE_PREPAR
65e0: 45 5f 4e 4f 5f 56 54 41 42 2c 0a 20 20 20 20 20  E_NO_VTAB,.     
65f0: 20 20 20 20 20 70 70 53 74 6d 74 2c 20 30 29 3b       ppStmt, 0);
6600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6610: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
6620: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
6630: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
6640: 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zSql);.  return
6650: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   p->rc;.}.../*.*
6660: 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c  * INSERT OR REPL
6670: 41 43 45 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ACE a record int
6680: 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  o the %_data tab
6690: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
66a0: 69 64 20 66 74 73 35 44 61 74 61 57 72 69 74 65  id fts5DataWrite
66b0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
66c0: 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74  64 iRowid, const
66d0: 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
66e0: 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d  nData){.  if( p-
66f0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
6700: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
6710: 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b  p->pWriter==0 ){
6720: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
6730: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
6740: 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
6750: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6760: 70 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20  p, &p->pWriter, 
6770: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6780: 0a 20 20 20 20 20 20 20 20 20 20 22 52 45 50 4c  .          "REPL
6790: 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25  ACE INTO '%q'.'%
67a0: 71 5f 64 61 74 61 27 28 69 64 2c 20 62 6c 6f 63  q_data'(id, bloc
67b0: 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c  k) VALUES(?,?)",
67c0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
67d0: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
67e0: 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
67f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
6800: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
6810: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6820: 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31  64(p->pWriter, 1
6830: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  , iRowid);.  sql
6840: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
6850: 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44  ->pWriter, 2, pD
6860: 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49  ata, nData, SQLI
6870: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
6880: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57  lite3_step(p->pW
6890: 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  riter);.  p->rc 
68a0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
68b0: 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 73  p->pWriter);.  s
68c0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
68d0: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 29 3b  (p->pWriter, 2);
68e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
68f0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
6900: 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  SQL:.**.**     D
6910: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
6920: 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45  a WHERE id BETWE
6930: 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24  EN $iFirst AND $
6940: 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  iLast.*/.static 
6950: 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c  void fts5DataDel
6960: 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ete(Fts5Index *p
6970: 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36  , i64 iFirst, i6
6980: 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20  4 iLast){.  if( 
6990: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
69a0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
69b0: 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30  ( p->pDeleter==0
69c0: 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
69d0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
69e0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68  >pConfig;.    ch
69f0: 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
6a00: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6a10: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6a20: 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20   '%q'.'%q_data' 
6a30: 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20  WHERE id>=? AND 
6a40: 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20  id<=?", .       
6a50: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
6a60: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
6a70: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 66      );.    if( f
6a80: 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
6a90: 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44 65 6c 65  tmt(p, &p->pDele
6aa0: 74 65 72 2c 20 7a 53 71 6c 29 20 29 20 72 65 74  ter, zSql) ) ret
6ab0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  urn;.  }..  sqli
6ac0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
6ad0: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  ->pDeleter, 1, i
6ae0: 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  First);.  sqlite
6af0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
6b00: 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61  pDeleter, 2, iLa
6b10: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
6b20: 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  tep(p->pDeleter)
6b30: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
6b40: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65  te3_reset(p->pDe
6b50: 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  leter);.}../*.**
6b60: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f   Remove all reco
6b70: 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  rds associated w
6b80: 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67  ith segment iSeg
6b90: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  id..*/.static vo
6ba0: 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76  id fts5DataRemov
6bb0: 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64  eSegment(Fts5Ind
6bc0: 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69  ex *p, int iSegi
6bd0: 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74  d){.  i64 iFirst
6be0: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
6bf0: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 29  ROWID(iSegid, 0)
6c00: 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
6c10: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6c20: 49 44 28 69 53 65 67 69 64 2b 31 2c 20 30 29 2d  ID(iSegid+1, 0)-
6c30: 31 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c  1;.  fts5DataDel
6c40: 65 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69  ete(p, iFirst, i
6c50: 4c 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Last);.  if( p->
6c60: 70 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29  pIdxDeleter==0 )
6c70: 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
6c80: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
6c90: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
6ca0: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
6cb0: 28 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65  (p, &p->pIdxDele
6cc0: 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  ter, sqlite3_mpr
6cd0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
6ce0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
6cf0: 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45  '.'%q_idx' WHERE
6d00: 20 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20   segid=?",.     
6d10: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
6d20: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
6d30: 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20  e.    ));.  }.  
6d40: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
6d50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6d60: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
6d70: 70 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20  pIdxDeleter, 1, 
6d80: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c  iSegid);.    sql
6d90: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64  ite3_step(p->pId
6da0: 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70  xDeleter);.    p
6db0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6dc0: 65 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65  eset(p->pIdxDele
6dd0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
6de0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
6df0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73  erence to an Fts
6e00: 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
6e10: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  t returned by an
6e20: 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c   earlier .** cal
6e30: 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75  l to fts5Structu
6e40: 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35  reRead() or fts5
6e50: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
6e60: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
6e70: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  d fts5StructureR
6e80: 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63  elease(Fts5Struc
6e90: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
6ea0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
6eb0: 20 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e   0>=(--pStruct->
6ec0: 6e 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74  nRef) ){.    int
6ed0: 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
6ee0: 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30  pStruct->nRef==0
6ef0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
6f00: 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   i<pStruct->nLev
6f10: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
6f20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
6f30: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
6f40: 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aSeg);.    }.   
6f50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
6f60: 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  truct);.  }.}..s
6f70: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
6f80: 74 72 75 63 74 75 72 65 52 65 66 28 46 74 73 35  tructureRef(Fts5
6f90: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
6fa0: 63 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e  ct){.  pStruct->
6fb0: 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nRef++;.}../*.**
6fc0: 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64   Deserialize and
6fd0: 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75   return the stru
6fe0: 63 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72  cture record cur
6ff0: 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
7000: 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66   serialized.** f
7010: 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65  orm within buffe
7020: 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a  r pData/nData..*
7030: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72  *.** The Fts5Str
7040: 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20  ucture.aLevel[] 
7050: 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72  and each Fts5Str
7060: 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67  uctureLevel.aSeg
7070: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
7080: 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62  over-allocated b
7090: 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73  y one slot. This
70a0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75   allows the stru
70b0: 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  cture contents.*
70c0: 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73  * to be more eas
70d0: 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a  ily edited..**.*
70e0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
70f0: 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20  curs, *ppOut is 
7100: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
7110: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
7120: 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
7130: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70  . Otherwise, *pp
7140: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
7150: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
7160: 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c  bject and.** SQL
7170: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
7180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7190: 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
71a0: 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  de(.  const u8 *
71b0: 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
71c0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
71d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61  containing seria
71e0: 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20  lized structure 
71f0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7220: 62 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20  buffer pData in 
7230: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  bytes */.  int *
7240: 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20  piCookie,       
7250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7260: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
7270: 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74  ie value */.  Ft
7280: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
7290: 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Out           /*
72a0: 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a   OUT: Deserializ
72b0: 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ed object */.){.
72c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
72d0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20  E_OK;.  int i = 
72e0: 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20  0;.  int iLvl;. 
72f0: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b   int nLevel = 0;
7300: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
7310: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
7320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7330: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
7340: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
7350: 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a  cate at pRet */.
7360: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7370: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
7380: 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
7390: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
73a0: 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  */..  /* Grab th
73b0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  e cookie value *
73c0: 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65  /.  if( piCookie
73d0: 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73   ) *piCookie = s
73e0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28  qlite3Fts5Get32(
73f0: 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b  pData);.  i = 4;
7400: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
7410: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7420: 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65  levels and segme
7430: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
7440: 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  rt of the.  ** s
7450: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
7460: 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35    */.  i += fts5
7470: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7480: 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a  ta[i], nLevel);.
7490: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
74a0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
74b0: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69  , nSegment);.  i
74c0: 66 28 20 6e 4c 65 76 65 6c 3e 46 54 53 35 5f 4d  f( nLevel>FTS5_M
74d0: 41 58 5f 53 45 47 4d 45 4e 54 20 20 20 7c 7c 20  AX_SEGMENT   || 
74e0: 6e 4c 65 76 65 6c 3c 30 0a 20 20 20 7c 7c 20 6e  nLevel<0.   || n
74f0: 53 65 67 6d 65 6e 74 3e 46 54 53 35 5f 4d 41 58  Segment>FTS5_MAX
7500: 5f 53 45 47 4d 45 4e 54 20 7c 7c 20 6e 53 65 67  _SEGMENT || nSeg
7510: 6d 65 6e 74 3c 30 0a 20 20 29 7b 0a 20 20 20 20  ment<0.  ){.    
7520: 72 65 74 75 72 6e 20 46 54 53 35 5f 43 4f 52 52  return FTS5_CORR
7530: 55 50 54 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  UPT;.  }.  nByte
7540: 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f   = (.      sizeo
7550: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
7560: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
7570: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
7580: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
7590: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
75a0: 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e  ctureLevel) * (n
75b0: 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61  Level-1)    /* a
75c0: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
75d0: 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28  .  );.  pRet = (
75e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73  Fts5Structure*)s
75f0: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
7600: 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29  Zero(&rc, nByte)
7610: 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  ;..  if( pRet ){
7620: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20  .    pRet->nRef 
7630: 3d 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  = 1;.    pRet->n
7640: 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a  Level = nLevel;.
7650: 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65      pRet->nSegme
7660: 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20  nt = nSegment;. 
7670: 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46     i += sqlite3F
7680: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
7690: 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e  ata[i], &pRet->n
76a0: 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a  WriteCounter);..
76b0: 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
76c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
76d0: 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c   iLvl<nLevel; iL
76e0: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  vl++){.      Fts
76f0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
7700: 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61  *pLvl = &pRet->a
7710: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
7720: 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20     int nTotal = 
7730: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  0;.      int iSe
7740: 67 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3e  g;..      if( i>
7750: 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  =nData ){.      
7760: 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52    rc = FTS5_CORR
7770: 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
7780: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66  {.        i += f
7790: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
77a0: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
77b0: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 20  nMerge);.       
77c0: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
77d0: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
77e0: 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20   nTotal);.      
77f0: 20 20 69 66 28 20 6e 54 6f 74 61 6c 3c 70 4c 76    if( nTotal<pLv
7800: 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 63 20 3d  l->nMerge ) rc =
7810: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
7820: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65         pLvl->aSe
7830: 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  g = (Fts5Structu
7840: 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74  reSegment*)sqlit
7850: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
7860: 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20  (&rc, .         
7870: 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65     nTotal * size
7880: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7890: 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 20  Segment).       
78a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 67   );.        nSeg
78b0: 6d 65 6e 74 20 2d 3d 20 6e 54 6f 74 61 6c 3b 0a  ment -= nTotal;.
78c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
78d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
78e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c   ){.        pLvl
78f0: 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b  ->nSeg = nTotal;
7900: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
7910: 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c  g=0; iSeg<nTotal
7920: 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
7930: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
7940: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
7950: 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
7960: 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
7970: 66 28 20 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20  f( i>=nData ){. 
7980: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
7990: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
79a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
79b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
79c0: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
79d0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
79e0: 74 61 5b 69 5d 2c 20 70 53 65 67 2d 3e 69 53 65  ta[i], pSeg->iSe
79f0: 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gid);.          
7a00: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7a10: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7a20: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29  pSeg->pgnoFirst)
7a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
7a40: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7a50: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 53 65 67  (&pData[i], pSeg
7a60: 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20  ->pgnoLast);.   
7a70: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d         if( pSeg-
7a80: 3e 70 67 6e 6f 4c 61 73 74 3c 70 53 65 67 2d 3e  >pgnoLast<pSeg->
7a90: 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20  pgnoFirst ){.   
7aa0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54           rc = FT
7ab0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
7ac0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7ad0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7ae0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7af0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 67 6d   }.    if( nSegm
7b00: 65 6e 74 21 3d 30 20 26 26 20 72 63 3d 3d 53 51  ent!=0 && rc==SQ
7b10: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46  LITE_OK ) rc = F
7b20: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
7b30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7b40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 74 73  _OK ){.      fts
7b50: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
7b60: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 70  e(pRet);.      p
7b70: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Ret = 0;.    }. 
7b80: 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70   }..  *ppOut = p
7b90: 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Ret;.  return rc
7ba0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74  ;.}../*.**.*/.st
7bb0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
7bc0: 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28  ructureAddLevel(
7bd0: 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53 74  int *pRc, Fts5St
7be0: 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
7bf0: 63 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d  ct){.  if( *pRc=
7c00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7c10: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7c20: 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
7c30: 72 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c  ruct;.    int nL
7c40: 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e  evel = pStruct->
7c50: 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20  nLevel;.    int 
7c60: 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20  nByte = (.      
7c70: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7c80: 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20  ucture) +       
7c90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7ca0: 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  in structure */.
7cb0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46          sizeof(F
7cc0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7cd0: 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20  l) * (nLevel+1) 
7ce0: 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72   /* aLevel[] arr
7cf0: 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20  ay */.    );..  
7d00: 20 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69    pStruct = sqli
7d10: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72  te3_realloc(pStr
7d20: 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  uct, nByte);.   
7d30: 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
7d40: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
7d50: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c  truct->aLevel[nL
7d60: 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  evel], 0, sizeof
7d70: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
7d80: 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53 74  vel));.      pSt
7d90: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a  ruct->nLevel++;.
7da0: 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74 20        *ppStruct 
7db0: 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d  = pStruct;.    }
7dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63  else{.      *pRc
7dd0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7de0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
7df0: 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65 6c  .** Extend level
7e00: 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74 68   iLvl so that th
7e10: 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20  ere is room for 
7e20: 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61 20  at least nExtra 
7e30: 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73  more.** segments
7e40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7e50: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
7e60: 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74  tendLevel(.  int
7e70: 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53 74   *pRc, .  Fts5St
7e80: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
7e90: 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a  , .  int iLvl, .
7ea0: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20    int nExtra, . 
7eb0: 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a   int bInsert.){.
7ec0: 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
7ed0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
7ee0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
7ef0: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
7f00: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
7f10: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
7f20: 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a  eSegment *aNew;.
7f30: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a      int nByte;..
7f40: 20 20 20 20 6e 42 79 74 65 20 3d 20 28 70 4c 76      nByte = (pLv
7f50: 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72 61  l->nSeg + nExtra
7f60: 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  ) * sizeof(Fts5S
7f70: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
7f80: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
7f90: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76  ite3_realloc(pLv
7fa0: 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65 29 3b  l->aSeg, nByte);
7fb0: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 20 29 7b  .    if( aNew ){
7fc0: 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 73 65  .      if( bInse
7fd0: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rt==0 ){.       
7fe0: 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c   memset(&aNew[pL
7ff0: 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69  vl->nSeg], 0, si
8000: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
8010: 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78  reSegment) * nEx
8020: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tra);.      }els
8030: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
8040: 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  Move = pLvl->nSe
8050: 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  g * sizeof(Fts5S
8060: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
8070: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76  ;.        memmov
8080: 65 28 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c  e(&aNew[nExtra],
8090: 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20   aNew, nMove);. 
80a0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 4e         memset(aN
80b0: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  ew, 0, sizeof(Ft
80c0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
80d0: 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20  nt) * nExtra);. 
80e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 76       }.      pLv
80f0: 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a  l->aSeg = aNew;.
8100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8110: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
8120: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
8130: 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 53 74  }..static Fts5St
8140: 72 75 63 74 75 72 65 20 2a 66 74 73 35 53 74 72  ructure *fts5Str
8150: 75 63 74 75 72 65 52 65 61 64 55 6e 63 61 63 68  uctureReadUncach
8160: 65 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ed(Fts5Index *p)
8170: 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
8180: 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 46  e *pRet = 0;.  F
8190: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
81a0: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
81b0: 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20  .  int iCookie; 
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
81e0: 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20  ion cookie */.  
81f0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
8200: 0a 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35  ..  pData = fts5
8210: 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
8220: 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
8230: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
8240: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8250: 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20   /* TODO: Do we 
8260: 6e 65 65 64 20 74 68 69 73 20 69 66 20 74 68 65  need this if the
8270: 20 6c 65 61 66 2d 69 6e 64 65 78 20 69 73 20 61   leaf-index is a
8280: 70 70 65 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c  ppended? Probabl
8290: 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  y... */.    mems
82a0: 65 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 44 61  et(&pData->p[pDa
82b0: 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35  ta->nn], 0, FTS5
82c0: 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a  _DATA_PADDING);.
82d0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35      p->rc = fts5
82e0: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
82f0: 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d  pData->p, pData-
8300: 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26  >nn, &iCookie, &
8310: 70 52 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70  pRet);.    if( p
8320: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8330: 26 26 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f  && pConfig->iCoo
8340: 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a  kie!=iCookie ){.
8350: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
8360: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c  lite3Fts5ConfigL
8370: 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f  oad(pConfig, iCo
8380: 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  okie);.    }.   
8390: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
83a0: 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  (pData);.    if(
83b0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
83c0: 4b 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  K ){.      fts5S
83d0: 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
83e0: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65  pRet);.      pRe
83f0: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
8400: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
8410: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66  .}..static i64 f
8420: 74 73 35 49 6e 64 65 78 44 61 74 61 56 65 72 73  ts5IndexDataVers
8430: 69 6f 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ion(Fts5Index *p
8440: 29 7b 0a 20 20 69 36 34 20 69 56 65 72 73 69 6f  ){.  i64 iVersio
8450: 6e 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  n = 0;..  if( p-
8460: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
8470: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 44 61  {.    if( p->pDa
8480: 74 61 56 65 72 73 69 6f 6e 3d 3d 30 20 29 7b 0a  taVersion==0 ){.
8490: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 66 74        p->rc = ft
84a0: 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74  s5IndexPrepareSt
84b0: 6d 74 28 70 2c 20 26 70 2d 3e 70 44 61 74 61 56  mt(p, &p->pDataV
84c0: 65 72 73 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20  ersion, .       
84d0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
84e0: 74 66 28 22 50 52 41 47 4d 41 20 25 51 2e 64 61  tf("PRAGMA %Q.da
84f0: 74 61 5f 76 65 72 73 69 6f 6e 22 2c 20 70 2d 3e  ta_version", p->
8500: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 29 0a 20 20  pConfig->zDb).  
8510: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
8520: 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
8530: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
8540: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
8550: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
8560: 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 29 20  ->pDataVersion) 
8570: 29 7b 0a 20 20 20 20 20 20 69 56 65 72 73 69 6f  ){.      iVersio
8580: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
8590: 6d 6e 5f 69 6e 74 36 34 28 70 2d 3e 70 44 61 74  mn_int64(p->pDat
85a0: 61 56 65 72 73 69 6f 6e 2c 20 30 29 3b 0a 20 20  aVersion, 0);.  
85b0: 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20    }.    p->rc = 
85c0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
85d0: 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a  >pDataVersion);.
85e0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 56    }..  return iV
85f0: 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ersion;.}../*.**
8600: 20 52 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69   Read, deseriali
8610: 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ze and return th
8620: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  e structure reco
8630: 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74  rd..**.** The Ft
8640: 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76  s5Structure.aLev
8650: 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74  el[] and each Ft
8660: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
8670: 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a  .aSeg[] array.**
8680: 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61   are over-alloca
8690: 74 65 64 20 61 73 20 64 65 73 63 72 69 62 65 64  ted as described
86a0: 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74   for function ft
86b0: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
86c0: 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a  e() .** above..*
86d0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
86e0: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
86f0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
8700: 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74   error code left
8710: 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49   in the.** Fts5I
8720: 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20  ndex handle. If 
8730: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
8740: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
8750: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
8760: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  .** is called, i
8770: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
8780: 0a 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75  .static Fts5Stru
8790: 63 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63  cture *fts5Struc
87a0: 74 75 72 65 52 65 61 64 28 46 74 73 35 49 6e 64  tureRead(Fts5Ind
87b0: 65 78 20 2a 70 29 7b 0a 0a 20 20 69 66 28 20 70  ex *p){..  if( p
87c0: 2d 3e 70 53 74 72 75 63 74 3d 3d 30 20 29 7b 0a  ->pStruct==0 ){.
87d0: 20 20 20 20 70 2d 3e 69 53 74 72 75 63 74 56 65      p->iStructVe
87e0: 72 73 69 6f 6e 20 3d 20 66 74 73 35 49 6e 64 65  rsion = fts5Inde
87f0: 78 44 61 74 61 56 65 72 73 69 6f 6e 28 70 29 3b  xDataVersion(p);
8800: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
8810: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8820: 20 20 20 70 2d 3e 70 53 74 72 75 63 74 20 3d 20     p->pStruct = 
8830: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
8840: 64 55 6e 63 61 63 68 65 64 28 70 29 3b 0a 20 20  dUncached(p);.  
8850: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20    }.  }..#if 0. 
8860: 20 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 53   else{.    Fts5S
8870: 74 72 75 63 74 75 72 65 20 2a 70 54 65 73 74 20  tructure *pTest 
8880: 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
8890: 65 61 64 55 6e 63 61 63 68 65 64 28 70 29 3b 0a  eadUncached(p);.
88a0: 20 20 20 20 69 66 28 20 70 54 65 73 74 20 29 7b      if( pTest ){
88b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
88c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
88d0: 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 53  ( p->pStruct->nS
88e0: 65 67 6d 65 6e 74 3d 3d 70 54 65 73 74 2d 3e 6e  egment==pTest->n
88f0: 53 65 67 6d 65 6e 74 20 29 3b 0a 20 20 20 20 20  Segment );.     
8900: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70   assert_nc( p->p
8910: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d  Struct->nLevel==
8920: 70 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b  pTest->nLevel );
8930: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8940: 69 3c 70 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 3b  i<pTest->nLevel;
8950: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
8960: 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74  ssert_nc( p->pSt
8970: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
8980: 6e 4d 65 72 67 65 3d 3d 70 54 65 73 74 2d 3e 61  nMerge==pTest->a
8990: 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 20  Level[i].nMerge 
89a0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
89b0: 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74  t_nc( p->pStruct
89c0: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67  ->aLevel[i].nSeg
89d0: 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b  ==pTest->aLevel[
89e0: 69 5d 2e 6e 53 65 67 20 29 3b 0a 20 20 20 20 20  i].nSeg );.     
89f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
8a00: 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e  est->aLevel[i].n
8a10: 53 65 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Seg; j++){.     
8a20: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
8a30: 72 65 53 65 67 6d 65 6e 74 20 2a 70 31 20 3d 20  reSegment *p1 = 
8a40: 26 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69  &pTest->aLevel[i
8a50: 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20  ].aSeg[j];.     
8a60: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
8a70: 72 65 53 65 67 6d 65 6e 74 20 2a 70 32 20 3d 20  reSegment *p2 = 
8a80: 26 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65  &p->pStruct->aLe
8a90: 76 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a  vel[i].aSeg[j];.
8aa0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8ab0: 5f 6e 63 28 20 70 31 2d 3e 69 53 65 67 69 64 3d  _nc( p1->iSegid=
8ac0: 3d 70 32 2d 3e 69 53 65 67 69 64 20 29 3b 0a 20  =p2->iSegid );. 
8ad0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
8ae0: 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 46 69 72 73  nc( p1->pgnoFirs
8af0: 74 3d 3d 70 32 2d 3e 70 67 6e 6f 46 69 72 73 74  t==p2->pgnoFirst
8b00: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
8b10: 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e  sert_nc( p1->pgn
8b20: 6f 4c 61 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 4c  oLast==p2->pgnoL
8b30: 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ast );.        }
8b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
8b50: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
8b60: 61 73 65 28 70 54 65 73 74 29 3b 0a 20 20 20 20  ase(pTest);.    
8b70: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
8b80: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
8b90: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 30 3b  E_OK ) return 0;
8ba0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53  .  assert( p->iS
8bb0: 74 72 75 63 74 56 65 72 73 69 6f 6e 21 3d 30 20  tructVersion!=0 
8bc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
8bd0: 70 53 74 72 75 63 74 21 3d 30 20 29 3b 0a 20 20  pStruct!=0 );.  
8be0: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66  fts5StructureRef
8bf0: 28 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20  (p->pStruct);.  
8c00: 72 65 74 75 72 6e 20 70 2d 3e 70 53 74 72 75 63  return p->pStruc
8c10: 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  t;.}..static voi
8c20: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49  d fts5StructureI
8c30: 6e 76 61 6c 69 64 61 74 65 28 46 74 73 35 49 6e  nvalidate(Fts5In
8c40: 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dex *p){.  if( p
8c50: 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ->pStruct ){.   
8c60: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
8c70: 6c 65 61 73 65 28 70 2d 3e 70 53 74 72 75 63 74  lease(p->pStruct
8c80: 29 3b 0a 20 20 20 20 70 2d 3e 70 53 74 72 75 63  );.    p->pStruc
8c90: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
8ca0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
8cb0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
8cc0: 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78  egments in index
8cd0: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
8ce0: 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ct. This.** func
8cf0: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
8d00: 72 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  r used as part o
8d10: 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64 69  f assert() condi
8d20: 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  tions..*/.#ifdef
8d30: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
8d40: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74 72  atic int fts5Str
8d50: 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
8d60: 6e 74 73 28 46 74 73 35 53 74 72 75 63 74 75 72  nts(Fts5Structur
8d70: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
8d80: 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b  nt nSegment = 0;
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8da0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
8db0: 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  f segments */.  
8dc0: 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
8dd0: 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20     int iLvl;    
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8df0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
8e00: 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
8e10: 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c  ls */.    for(iL
8e20: 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
8e30: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
8e40: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d  ++){.      nSegm
8e50: 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e  ent += pStruct->
8e60: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
8e70: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
8e80: 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b  return nSegment;
8e90: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .}.#endif..#defi
8ea0: 6e 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66  ne fts5BufferSaf
8eb0: 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
8ec0: 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20  , pBlob, nBlob) 
8ed0: 7b 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74  {     \.  assert
8ee0: 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65  ( (pBuf)->nSpace
8ef0: 3e 3d 28 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c  >=((pBuf)->n+nBl
8f00: 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20 20 20  ob) );          
8f10: 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28     \.  memcpy(&(
8f20: 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d  pBuf)->p[(pBuf)-
8f30: 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  >n], pBlob, nBlo
8f40: 62 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  b);             
8f50: 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d  \.  (pBuf)->n +=
8f60: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
8f90: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ..#define fts5Bu
8fa0: 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
8fb0: 72 69 6e 74 28 70 42 75 66 2c 20 69 56 61 6c 29  rint(pBuf, iVal)
8fc0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
8fd0: 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20    \.  (pBuf)->n 
8fe0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
8ff0: 74 56 61 72 69 6e 74 28 26 28 70 42 75 66 29 2d  tVarint(&(pBuf)-
9000: 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28  >p[(pBuf)->n], (
9010: 69 56 61 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73  iVal));  \.  ass
9020: 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70  ert( (pBuf)->nSp
9030: 61 63 65 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29  ace>=(pBuf)->n )
9040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9050: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
9060: 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65  ./*.** Serialize
9070: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22   and store the "
9080: 73 74 72 75 63 74 75 72 65 22 20 72 65 63 6f 72  structure" recor
9090: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
90a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
90b0: 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ve an error code
90c0: 20 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65   in the Fts5Inde
90d0: 78 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a  x object. If an.
90e0: 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  ** error has alr
90f0: 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
9100: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9110: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
9120: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
9130: 63 74 75 72 65 57 72 69 74 65 28 46 74 73 35 49  ctureWrite(Fts5I
9140: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72  ndex *p, Fts5Str
9150: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
9160: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
9170: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9180: 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20  Fts5Buffer buf; 
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91a0: 20 42 75 66 66 65 72 20 74 6f 20 73 65 72 69 61   Buffer to seria
91b0: 6c 69 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  lize record into
91c0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   */.    int iLvl
91d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
91e0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
91f0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
9200: 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69   levels */.    i
9210: 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20  nt iCookie;     
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9230: 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f 20  Cookie value to 
9240: 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73  store */..    as
9250: 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
9260: 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72  Segment==fts5Str
9270: 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
9280: 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a  nts(pStruct) );.
9290: 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c      memset(&buf,
92a0: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
92b0: 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a  uffer));..    /*
92c0: 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72 72   Append the curr
92d0: 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ent configuratio
92e0: 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20  n cookie */.    
92f0: 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f  iCookie = p->pCo
9300: 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20  nfig->iCookie;. 
9310: 20 20 20 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30     if( iCookie<0
9320: 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a   ) iCookie = 0;.
9330: 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
9340: 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
9350: 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  e(&p->rc, &buf, 
9360: 34 2b 39 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20  4+9+9+9) ){.    
9370: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74    sqlite3Fts5Put
9380: 33 32 28 62 75 66 2e 70 2c 20 69 43 6f 6f 6b 69  32(buf.p, iCooki
9390: 65 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 6e 20  e);.      buf.n 
93a0: 3d 20 34 3b 0a 20 20 20 20 20 20 66 74 73 35 42  = 4;.      fts5B
93b0: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
93c0: 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74 72  arint(&buf, pStr
93d0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20  uct->nLevel);.  
93e0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
93f0: 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  feAppendVarint(&
9400: 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53  buf, pStruct->nS
9410: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 66  egment);.      f
9420: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
9430: 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20  endVarint(&buf, 
9440: 28 69 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57  (i64)pStruct->nW
9450: 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20  riteCounter);.  
9460: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76    }..    for(iLv
9470: 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
9480: 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
9490: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  +){.      int iS
94a0: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
94b0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
94c0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
94d0: 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
94e0: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
94f0: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
9500: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
9510: 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74  [iLvl];.      ft
9520: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9530: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9540: 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29  f, pLvl->nMerge)
9550: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
9560: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
9570: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
9580: 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20 20  l->nSeg);.      
9590: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d  assert( pLvl->nM
95a0: 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67  erge<=pLvl->nSeg
95b0: 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   );..      for(i
95c0: 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c  Seg=0; iSeg<pLvl
95d0: 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ->nSeg; iSeg++){
95e0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
95f0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
9600: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
9610: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl->aSeg[iSeg].i
9620: 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
9630: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9640: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9650: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
9660: 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29  iSeg].pgnoFirst)
9670: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
9680: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
9690: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
96a0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
96b0: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20  pgnoLast);.     
96c0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74   }.    }..    ft
96d0: 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
96e0: 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
96f0: 57 49 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  WID, buf.p, buf.
9700: 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  n);.    fts5Buff
9710: 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20  erFree(&buf);.  
9720: 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69  }.}..#if 0.stati
9730: 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
9740: 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46  Structure(int*,F
9750: 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53  ts5Buffer*,Fts5S
9760: 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74  tructure*);.stat
9770: 69 63 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e  ic void fts5Prin
9780: 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74  tStructure(const
9790: 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c   char *zCaption,
97a0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
97b0: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
97c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
97d0: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
97e0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c  ;.  memset(&buf,
97f0: 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29   0, sizeof(buf))
9800: 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72  ;.  fts5DebugStr
9810: 75 63 74 75 72 65 28 26 72 63 2c 20 26 62 75 66  ucture(&rc, &buf
9820: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70  , pStruct);.  fp
9830: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25  rintf(stdout, "%
9840: 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69  s: %s\n", zCapti
9850: 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66  on, buf.p);.  ff
9860: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
9870: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
9880: 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  buf);.}.#else.# 
9890: 64 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74  define fts5Print
98a0: 53 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23  Structure(x,y).#
98b0: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e  endif..static in
98c0: 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a  t fts5SegmentSiz
98d0: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  e(Fts5StructureS
98e0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20  egment *pSeg){. 
98f0: 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67   return 1 + pSeg
9900: 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65  ->pgnoLast - pSe
9910: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a  g->pgnoFirst;.}.
9920: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
9930: 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74  copy of index st
9940: 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
9950: 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65   Except, promote
9960: 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67   as many .** seg
9970: 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c  ments as possibl
9980: 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d  e to level iProm
9990: 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f  ote. If an OOM o
99a0: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a  ccurs, NULL is .
99b0: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
99c0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
99d0: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
99e0: 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  To(.  Fts5Index 
99f0: 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f  *p,.  int iPromo
9a00: 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d  te,.  int szProm
9a10: 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63  ote,.  Fts5Struc
9a20: 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b  ture *pStruct.){
9a30: 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20  .  int il, is;. 
9a40: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9a50: 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74  vel *pOut = &pSt
9a60: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72  ruct->aLevel[iPr
9a70: 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70  omote];..  if( p
9a80: 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29  Out->nMerge==0 )
9a90: 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72  {.    for(il=iPr
9aa0: 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72  omote+1; il<pStr
9ab0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b  uct->nLevel; il+
9ac0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
9ad0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
9ae0: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
9af0: 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20  Level[il];.     
9b00: 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
9b10: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
9b20: 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e    for(is=pLvl->n
9b30: 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73  Seg-1; is>=0; is
9b40: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  --){.        int
9b50: 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e   sz = fts5Segmen
9b60: 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65  tSize(&pLvl->aSe
9b70: 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20  g[is]);.        
9b80: 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65  if( sz>szPromote
9b90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
9ba0: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
9bb0: 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
9bc0: 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72  rc, pStruct, iPr
9bd0: 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  omote, 1, 1);.  
9be0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
9bf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
9c00: 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61    memcpy(pOut->a
9c10: 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Seg, &pLvl->aSeg
9c20: 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73  [is], sizeof(Fts
9c30: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
9c40: 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75  t));.        pOu
9c50: 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20  t->nSeg++;.     
9c60: 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b     pLvl->nSeg--;
9c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9c80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65   }.}../*.** A ne
9c90: 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75  w segment has ju
9ca0: 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  st been written 
9cb0: 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66  to level iLvl of
9cc0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
9cd0: 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69  .** pStruct. Thi
9ce0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
9cf0: 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67  mines if any seg
9d00: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
9d10: 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61  promoted.** as a
9d20: 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74   result. Segment
9d30: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69  s are promoted i
9d40: 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
9d50: 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74  .**.**   a) If t
9d60: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
9d70: 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c  written is small
9d80: 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d  er than one or m
9d90: 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20  ore segments.** 
9da0: 20 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20       within the 
9db0: 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74  previous populat
9dc0: 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20  ed level, it is 
9dd0: 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20  promoted to the 
9de0: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20  previous.**     
9df0: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
9e00: 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20  ..**.**   b) If 
9e10: 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74  the segment just
9e20: 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67   written is larg
9e30: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65  er than the newe
9e40: 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a  st segment on.**
9e50: 20 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70        the next p
9e60: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20  opulated level, 
9e70: 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e  then that segmen
9e80: 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  t, and any other
9e90: 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20   adjacent.**    
9ea0: 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20    segments that 
9eb0: 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72  are also smaller
9ec0: 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75   than the one ju
9ed0: 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20  st written, are 
9ee0: 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65  .**      promote
9ef0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  d. .**.** If one
9f00: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
9f10: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20  s are promoted, 
9f20: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62  the structure ob
9f30: 6a 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a  ject is updated.
9f40: 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ** to reflect th
9f50: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  is..*/.static vo
9f60: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
9f70: 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49  Promote(.  Fts5I
9f80: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
9f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
9fa0: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
9fb0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  t */.  int iLvl,
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9fe0: 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74  level just updat
9ff0: 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ed */.  Fts5Stru
a000: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20  cture *pStruct  
a010: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
a020: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
a030: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
a040: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
a050: 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74  nt iTst;.    int
a060: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a   iPromote = -1;.
a070: 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74      int szPromot
a080: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
a090: 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79    /* Promote any
a0a0: 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20  thing this size 
a0b0: 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  or smaller */.  
a0c0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
a0d0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
a0e0: 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20  /* Segment just 
a0f0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
a100: 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20  nt szSeg;       
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a120: 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20  Size of segment 
a130: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
a140: 20 20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70      int nSeg = p
a150: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a160: 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20  Lvl].nSeg;..    
a170: 69 66 28 20 6e 53 65 67 3d 3d 30 20 29 20 72 65  if( nSeg==0 ) re
a180: 74 75 72 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d  turn;.    pSeg =
a190: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
a1a0: 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74  l[iLvl].aSeg[pSt
a1b0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
a1c0: 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20  l].nSeg-1];.    
a1d0: 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65  szSeg = (1 + pSe
a1e0: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53  g->pgnoLast - pS
a1f0: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg->pgnoFirst);.
a200: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
a210: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  r condition (a) 
a220: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d  */.    for(iTst=
a230: 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20  iLvl-1; iTst>=0 
a240: 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
a250: 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30  el[iTst].nSeg==0
a260: 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69  ; iTst--);.    i
a270: 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20  f( iTst>=0 ){.  
a280: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
a290: 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a   int szMax = 0;.
a2a0: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
a2b0: 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d  ureLevel *pTst =
a2c0: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
a2d0: 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 61  l[iTst];.      a
a2e0: 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65  ssert( pTst->nMe
a2f0: 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rge==0 );.      
a300: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d  for(i=0; i<pTst-
a310: 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
a320: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 54       int sz = pT
a330: 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f  st->aSeg[i].pgno
a340: 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61 53 65  Last - pTst->aSe
a350: 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b  g[i].pgnoFirst +
a360: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
a370: 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78  sz>szMax ) szMax
a380: 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20   = sz;.      }. 
a390: 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d       if( szMax>=
a3a0: 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20  szSeg ){.       
a3b0: 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61   /* Condition (a
a3c0: 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f  ) is true. Promo
a3d0: 74 65 20 74 68 65 20 6e 65 77 65 73 74 20 73 65  te the newest se
a3e0: 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a  gment on level .
a3f0: 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20          ** iLvl 
a400: 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e 20 20  to level iTst.  
a410: 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72 6f 6d  */.        iProm
a420: 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20 20 20  ote = iTst;.    
a430: 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20      szPromote = 
a440: 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20  szMax;.      }. 
a450: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a460: 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  condition (a) is
a470: 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d 65   not met, assume
a480: 20 28 62 29 20 69 73 20 74 72 75 65 2e 20 53 74   (b) is true. St
a490: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
a4a0: 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 6e  ().    ** is a n
a4b0: 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20 6e 6f  o-op if it is no
a4c0: 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  t.  */.    if( i
a4d0: 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20  Promote<0 ){.   
a4e0: 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c     iPromote = iL
a4f0: 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d  vl;.      szProm
a500: 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20  ote = szSeg;.   
a510: 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
a520: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c  turePromoteTo(p,
a530: 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f   iPromote, szPro
a540: 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a  mote, pStruct);.
a550: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64    }.}.../*.** Ad
a560: 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
a570: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
a580: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20   only argument. 
a590: 49 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  If the end of th
a5a0: 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e  e .** doclist-in
a5b0: 64 65 78 20 70 61 67 65 20 69 73 20 72 65 61 63  dex page is reac
a5c0: 68 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  hed, return non-
a5d0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
a5e0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  int fts5DlidxLvl
a5f0: 4e 65 78 74 28 46 74 73 35 44 6c 69 64 78 4c 76  Next(Fts5DlidxLv
a600: 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35  l *pLvl){.  Fts5
a610: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70 4c  Data *pData = pL
a620: 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66  vl->pData;..  if
a630: 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20  ( pLvl->iOff==0 
a640: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a650: 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a  Lvl->bEof==0 );.
a660: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
a670: 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f   1;.    pLvl->iO
a680: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
a690: 69 6e 74 33 32 28 26 70 44 61 74 61 2d 3e 70 5b  int32(&pData->p[
a6a0: 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50  1], pLvl->iLeafP
a6b0: 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  gno);.    pLvl->
a6c0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
a6d0: 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
a6e0: 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36  pLvl->iOff], (u6
a6f0: 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64  4*)&pLvl->iRowid
a700: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69  );.    pLvl->iFi
a710: 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69  rstOff = pLvl->i
a720: 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Off;.  }else{.  
a730: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
a740: 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69  for(iOff=pLvl->i
a750: 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d  Off; iOff<pData-
a760: 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20  >nn; iOff++){.  
a770: 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70      if( pData->p
a780: 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b 20  [iOff] ) break; 
a790: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
a7a0: 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29  iOff<pData->nn )
a7b0: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56 61 6c  {.      i64 iVal
a7c0: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c  ;.      pLvl->iL
a7d0: 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66  eafPgno += (iOff
a7e0: 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b   - pLvl->iOff) +
a7f0: 20 31 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b   1;.      iOff +
a800: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
a810: 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c  &pData->p[iOff],
a820: 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20   (u64*)&iVal);. 
a830: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69       pLvl->iRowi
a840: 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20  d += iVal;.     
a850: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f   pLvl->iOff = iO
a860: 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ff;.    }else{. 
a870: 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20       pLvl->bEof 
a880: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
a890: 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62    return pLvl->b
a8a0: 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  Eof;.}../*.** Ad
a8b0: 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
a8c0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
a8d0: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
a8e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
a8f0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
a900: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
a910: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
a920: 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a  ter, int iLvl){.
a930: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
a940: 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
a950: 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73  Lvl[iLvl];..  as
a960: 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72  sert( iLvl<pIter
a970: 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20  ->nLvl );.  if( 
a980: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
a990: 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66  (pLvl) ){.    if
a9a0: 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74  ( (iLvl+1) < pIt
a9b0: 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20  er->nLvl ){.    
a9c0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
a9d0: 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20 69  extR(p, pIter, i
a9e0: 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  Lvl+1);.      if
a9f0: 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d  ( pLvl[1].bEof==
aa00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
aa10: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
aa20: 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
aa30: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
aa40: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
aa50: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
aa60: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
aa70: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
aa80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53  .            FTS
aa90: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49  5_DLIDX_ROWID(pI
aaa0: 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76  ter->iSegid, iLv
aab0: 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66  l, pLvl[1].iLeaf
aac0: 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
aad0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
aae0: 6c 2d 3e 70 44 61 74 61 20 29 20 66 74 73 35 44  l->pData ) fts5D
aaf0: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c  lidxLvlNext(pLvl
ab00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ab10: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
ab20: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
ab30: 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  of;.}.static int
ab40: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
ab50: 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
ab60: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
ab70: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
ab80: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
ab90: 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29  xtR(p, pIter, 0)
aba0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
abb0: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
abc0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
abd0: 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c  ment has the fol
abe0: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65  lowing fields se
abf0: 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e  t.** as follows.
ac00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
ac10: 65 74 73 20 75 70 20 74 68 65 20 72 65 73 74 20  ets up the rest 
ac20: 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  of the iterator 
ac30: 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f  so that it.** po
ac40: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
ac50: 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64  t rowid in the d
ac60: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a  oclist-index..**
ac70: 0a 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20  .**   pData:.** 
ac80: 20 20 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64      pointer to d
ac90: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63  oclist-index rec
aca0: 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ord, .**.** When
acb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
acc0: 73 20 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e  s called pIter->
acd0: 69 4c 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65  iLeafPgno is the
ace0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65   page number the
acf0: 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61  .** doclist is a
ad00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 28  ssociated with (
ad10: 74 68 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e  the one featurin
ad20: 67 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a  g the term)..*/.
ad30: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
ad40: 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 46 74  lidxIterFirst(Ft
ad50: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
ad60: 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
ad70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
ad80: 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nLvl; i++){.  
ad90: 20 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65    fts5DlidxLvlNe
ada0: 78 74 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  xt(&pIter->aLvl[
adb0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
adc0: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
add0: 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69  .bEof;.}...stati
ade0: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
adf0: 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
ae00: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
ae10: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
ae20: 74 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49  turn p->rc!=SQLI
ae30: 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  TE_OK || pIter->
ae40: 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a  aLvl[0].bEof;.}.
ae50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ae60: 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46  5DlidxIterLast(F
ae70: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
ae80: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
ae90: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  r){.  int i;..  
aea0: 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20  /* Advance each 
aeb0: 6c 65 76 65 6c 20 74 6f 20 74 68 65 20 6c 61 73  level to the las
aec0: 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c  t entry on the l
aed0: 61 73 74 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f  ast page */.  fo
aee0: 72 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d  r(i=pIter->nLvl-
aef0: 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  1; p->rc==SQLITE
af00: 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d  _OK && i>=0; i--
af10: 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  ){.    Fts5Dlidx
af20: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  Lvl *pLvl = &pIt
af30: 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  er->aLvl[i];.   
af40: 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
af50: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d  xLvlNext(pLvl)==
af60: 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62  0 );.    pLvl->b
af70: 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Eof = 0;..    if
af80: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 46  ( i>0 ){.      F
af90: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68  ts5DlidxLvl *pCh
afa0: 69 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b  ild = &pLvl[-1];
afb0: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
afc0: 65 6c 65 61 73 65 28 70 43 68 69 6c 64 2d 3e 70  elease(pChild->p
afd0: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Data);.      mem
afe0: 73 65 74 28 70 43 68 69 6c 64 2c 20 30 2c 20 73  set(pChild, 0, s
aff0: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
b000: 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 43 68 69  vl));.      pChi
b010: 6c 64 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  ld->pData = fts5
b020: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
b030: 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44         FTS5_DLID
b040: 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69  X_ROWID(pIter->i
b050: 53 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c  Segid, i-1, pLvl
b060: 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ->iLeafPgno).   
b070: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
b080: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
b090: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
b0a0: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
b0b0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72  gument to the pr
b0c0: 65 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f  evious entry..*/
b0d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b0e0: 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 46 74 73  DlidxLvlPrev(Fts
b0f0: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29  5DlidxLvl *pLvl)
b100: 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70  {.  int iOff = p
b110: 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73  Lvl->iOff;..  as
b120: 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66  sert( pLvl->bEof
b130: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66  ==0 );.  if( iOf
b140: 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  f<=pLvl->iFirstO
b150: 66 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e  ff ){.    pLvl->
b160: 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  bEof = 1;.  }els
b170: 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  e{.    u8 *a = p
b180: 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20  Lvl->pData->p;. 
b190: 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
b1a0: 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20   int iLimit;.   
b1b0: 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
b1c0: 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20   nZero = 0;..   
b1d0: 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f   /* Currently iO
b1e0: 66 66 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ff points to the
b1f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
b200: 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c   varint. This bl
b210: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72  ock .    ** decr
b220: 65 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69  ements iOff unti
b230: 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  l it points to t
b240: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
b250: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20   the previous . 
b260: 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61     ** varint. Ta
b270: 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f  king care not to
b280: 20 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79   read any memory
b290: 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20   locations that 
b2a0: 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66  occur.    ** bef
b2b0: 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69  ore the buffer i
b2c0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20  n memory.  */.  
b2d0: 20 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66    iLimit = (iOff
b2e0: 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29  >9 ? iOff-9 : 0)
b2f0: 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d  ;.    for(iOff--
b300: 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69  ; iOff>iLimit; i
b310: 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  Off--){.      if
b320: 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30  ( (a[iOff-1] & 0
b330: 78 38 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  x80)==0 ) break;
b340: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
b350: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
b360: 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29  f], (u64*)&iVal)
b370: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77  ;.    pLvl->iRow
b380: 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20  id -= iVal;.    
b390: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  pLvl->iLeafPgno-
b3a0: 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20  -;..    /* Skip 
b3b0: 62 61 63 6b 77 61 72 64 73 20 70 61 73 74 20 61  backwards past a
b3c0: 6e 79 20 30 78 30 30 20 76 61 72 69 6e 74 73 2e  ny 0x00 varints.
b3d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 69   */.    for(ii=i
b3e0: 4f 66 66 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d  Off-1; ii>=pLvl-
b3f0: 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 61 5b  >iFirstOff && a[
b400: 69 69 5d 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29  ii]==0x00; ii--)
b410: 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b  {.      nZero++;
b420: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
b430: 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  i>=pLvl->iFirstO
b440: 66 66 20 26 26 20 28 61 5b 69 69 5d 20 26 20 30  ff && (a[ii] & 0
b450: 78 38 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  x80) ){.      /*
b460: 20 54 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69   The byte immedi
b470: 61 74 65 6c 79 20 62 65 66 6f 72 65 20 74 68 65  ately before the
b480: 20 6c 61 73 74 20 30 78 30 30 20 62 79 74 65 20   last 0x00 byte 
b490: 68 61 73 20 74 68 65 20 30 78 38 30 20 62 69 74  has the 0x80 bit
b4a0: 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 53  .      ** set. S
b4b0: 6f 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20  o the last 0x00 
b4c0: 69 73 20 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74  is only a varint
b4d0: 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
b4e0: 38 20 6d 6f 72 65 20 30 78 38 30 0a 20 20 20 20  8 more 0x80.    
b4f0: 20 20 2a 2a 20 62 79 74 65 73 20 62 65 66 6f 72    ** bytes befor
b500: 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20  e a[ii]. */.    
b510: 20 20 69 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b    int bZero = 0;
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b530: 20 54 72 75 65 20 69 66 20 6c 61 73 74 20 30 78   True if last 0x
b540: 30 30 20 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20  00 counts */.   
b550: 20 20 20 69 66 28 20 28 69 69 2d 38 29 3e 3d 70     if( (ii-8)>=p
b560: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29  Lvl->iFirstOff )
b570: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  {.        int j;
b580: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  .        for(j=1
b590: 3b 20 6a 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d  ; j<=8 && (a[ii-
b5a0: 6a 5d 20 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29  j] & 0x80); j++)
b5b0: 3b 0a 20 20 20 20 20 20 20 20 62 5a 65 72 6f 20  ;.        bZero 
b5c0: 3d 20 28 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d  = (j>8);.      }
b5d0: 0a 20 20 20 20 20 20 69 66 28 20 62 5a 65 72 6f  .      if( bZero
b5e0: 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20  ==0 ) nZero--;. 
b5f0: 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69     }.    pLvl->i
b600: 4c 65 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72  LeafPgno -= nZer
b610: 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  o;.    pLvl->iOf
b620: 66 20 3d 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f  f = iOff - nZero
b630: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
b640: 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73  pLvl->bEof;.}..s
b650: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
b660: 69 64 78 49 74 65 72 50 72 65 76 52 28 46 74 73  idxIterPrevR(Fts
b670: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
b680: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c  lidxIter *pIter,
b690: 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74   int iLvl){.  Ft
b6a0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
b6b0: 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   = &pIter->aLvl[
b6c0: 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iLvl];..  assert
b6d0: 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c  ( iLvl<pIter->nL
b6e0: 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35  vl );.  if( fts5
b6f0: 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 70 4c 76  DlidxLvlPrev(pLv
b700: 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69  l) ){.    if( (i
b710: 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e  Lvl+1) < pIter->
b720: 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74  nLvl ){.      ft
b730: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52  s5DlidxIterPrevR
b740: 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b  (p, pIter, iLvl+
b750: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  1);.      if( pL
b760: 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b  vl[1].bEof==0 ){
b770: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
b780: 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70  aRelease(pLvl->p
b790: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d  Data);.        m
b7a0: 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73  emset(pLvl, 0, s
b7b0: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
b7c0: 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  vl));.        pL
b7d0: 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
b7e0: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
b7f0: 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
b800: 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  IDX_ROWID(pIter-
b810: 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70  >iSegid, iLvl, p
b820: 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f  Lvl[1].iLeafPgno
b830: 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
b840: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
b850: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
b860: 20 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69    while( fts5Dli
b870: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d  dxLvlNext(pLvl)=
b880: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
b890: 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a  pLvl->bEof = 0;.
b8a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b8b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
b8c0: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
b8d0: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61  l[0].bEof;.}.sta
b8e0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
b8f0: 78 49 74 65 72 50 72 65 76 28 46 74 73 35 49 6e  xIterPrev(Fts5In
b900: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
b910: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
b920: 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64   return fts5Dlid
b930: 78 49 74 65 72 50 72 65 76 52 28 70 2c 20 70 49  xIterPrevR(p, pI
b940: 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ter, 0);.}../*.*
b950: 2a 20 46 72 65 65 20 61 20 64 6f 63 6c 69 73 74  * Free a doclist
b960: 2d 69 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20  -index iterator 
b970: 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64  object allocated
b980: 20 62 79 20 66 74 73 35 44 6c 69 64 78 49 74 65   by fts5DlidxIte
b990: 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  rInit()..*/.stat
b9a0: 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64  ic void fts5Dlid
b9b0: 78 49 74 65 72 46 72 65 65 28 46 74 73 35 44 6c  xIterFree(Fts5Dl
b9c0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
b9d0: 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
b9e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
b9f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
ba00: 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
ba10: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
ba20: 73 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  se(pIter->aLvl[i
ba30: 5d 2e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ].pData);.    }.
ba40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ba50: 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pIter);.  }.}..
ba60: 73 74 61 74 69 63 20 46 74 73 35 44 6c 69 64 78  static Fts5Dlidx
ba70: 49 74 65 72 20 2a 66 74 73 35 44 6c 69 64 78 49  Iter *fts5DlidxI
ba80: 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
ba90: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
baa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
bab0: 73 35 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74  s5 Backend to it
bac0: 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
bad0: 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52    /* True for OR
bb00: 44 45 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20  DER BY ASC */.  
bb10: 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20  int iSegid,     
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f  /* Segment id */
bb40: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 20 20  .  int iLeafPg  
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
bb70: 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20 64  number to load d
bb80: 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20  lidx for */.){. 
bb90: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
bba0: 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  pIter = 0;.  int
bbb0: 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20   i;.  int bDone 
bbc0: 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
bbd0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
bbe0: 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69  K && bDone==0; i
bbf0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  ++){.    int nBy
bc00: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
bc10: 44 6c 69 64 78 49 74 65 72 29 20 2b 20 69 20 2a  DlidxIter) + i *
bc20: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
bc30: 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74 73 35 44  xLvl);.    Fts5D
bc40: 6c 69 64 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a  lidxIter *pNew;.
bc50: 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73  .    pNew = (Fts
bc60: 35 44 6c 69 64 78 49 74 65 72 2a 29 73 71 6c 69  5DlidxIter*)sqli
bc70: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65  te3_realloc(pIte
bc80: 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  r, nByte);.    i
bc90: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
bca0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
bcb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
bcc0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69  lse{.      i64 i
bcd0: 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 44 4c 49  Rowid = FTS5_DLI
bce0: 44 58 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  DX_ROWID(iSegid,
bcf0: 20 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20 20   i, iLeafPg);.  
bd00: 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
bd10: 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e   *pLvl = &pNew->
bd20: 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70  aLvl[i];.      p
bd30: 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Iter = pNew;.   
bd40: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
bd50: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
bd60: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
bd70: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
bd80: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
bd90: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
bda0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26 20   pLvl->pData && 
bdb0: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b  (pLvl->pData->p[
bdc0: 30 5d 20 26 20 30 78 30 30 30 31 29 3d 3d 30 20  0] & 0x0001)==0 
bdd0: 29 7b 0a 20 20 20 20 20 20 20 20 62 44 6f 6e 65  ){.        bDone
bde0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
bdf0: 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20      pIter->nLvl 
be00: 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = i+1;.    }.  }
be10: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
be20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
be30: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  pIter->iSegid = 
be40: 69 53 65 67 69 64 3b 0a 20 20 20 20 69 66 28 20  iSegid;.    if( 
be50: 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20  bRev==0 ){.     
be60: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69   fts5DlidxIterFi
be70: 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20  rst(pIter);.    
be80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
be90: 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70  5DlidxIterLast(p
bea0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a  , pIter);.    }.
beb0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
bec0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bed0: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
bee0: 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20  Free(pIter);.   
bef0: 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a   pIter = 0;.  }.
bf00: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 3b  .  return pIter;
bf10: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66  .}..static i64 f
bf20: 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
bf30: 64 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  d(Fts5DlidxIter 
bf40: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
bf50: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
bf60: 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74 69  .iRowid;.}.stati
bf70: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
bf80: 74 65 72 50 67 6e 6f 28 46 74 73 35 44 6c 69 64  terPgno(Fts5Dlid
bf90: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
bfa0: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
bfb0: 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e 6f  Lvl[0].iLeafPgno
bfc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
bfd0: 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61  the next leaf pa
bfe0: 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d  ge into the segm
bff0: 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f  ent iterator..*/
c000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c010: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
c020: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
c030: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c040: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
c050: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
c060: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
c070: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
c080: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
c090: 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70  dvance to next p
c0a0: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  age */.){.  Fts5
c0b0: 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 46  Data *pLeaf;.  F
c0c0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
c0d0: 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
c0e0: 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35 44  r->pSeg;.  fts5D
c0f0: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
c100: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65  ->pLeaf);.  pIte
c110: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a  r->iLeafPgno++;.
c120: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4e 65    if( pIter->pNe
c130: 78 74 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49  xtLeaf ){.    pI
c140: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74  ter->pLeaf = pIt
c150: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20  er->pNextLeaf;. 
c160: 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
c170: 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  eaf = 0;.  }else
c180: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
c190: 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e  fPgno<=pSeg->pgn
c1a0: 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74  oLast ){.    pIt
c1b0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35  er->pLeaf = fts5
c1c0: 4c 65 61 66 52 65 61 64 28 70 2c 20 0a 20 20 20  LeafRead(p, .   
c1d0: 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e       FTS5_SEGMEN
c1e0: 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
c1f0: 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65  egid, pIter->iLe
c200: 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20  afPgno).    );. 
c210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
c220: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
c230: 7d 0a 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65  }.  pLeaf = pIte
c240: 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66 28  r->pLeaf;..  if(
c250: 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49   pLeaf ){.    pI
c260: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
c270: 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a   pLeaf->szLeaf;.
c280: 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66      if( fts5Leaf
c290: 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66  IsTermless(pLeaf
c2a0: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  ) ){.      pIter
c2b0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
c2c0: 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20  = pLeaf->nn+1;. 
c2d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c2e0: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
c2f0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
c300: 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 49  t32(&pLeaf->p[pI
c310: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c  ter->iPgidxOff],
c320: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
c330: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a  ->iEndofDoclist.
c340: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
c350: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75   }.}../*.** Argu
c360: 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f  ment p points to
c370: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
c380: 6e 69 6e 67 20 61 20 76 61 72 69 6e 74 20 74 6f  ning a varint to
c390: 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20   be interpreted 
c3a0: 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  as a.** position
c3b0: 20 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64   list size field
c3c0: 2e 20 52 65 61 64 20 74 68 65 20 76 61 72 69 6e  . Read the varin
c3d0: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
c3e0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c3f0: 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f 72 65  .** read. Before
c400: 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20   returning, set 
c410: 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d  *pnSz to the num
c420: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
c430: 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20  the position.** 
c440: 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c  list, and *pbDel
c450: 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
c460: 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73  delete flag is s
c470: 65 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  et, or false oth
c480: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
c490: 63 20 69 6e 74 20 66 74 73 35 47 65 74 50 6f 73  c int fts5GetPos
c4a0: 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73 74 20 75  listSize(const u
c4b0: 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c  8 *p, int *pnSz,
c4c0: 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20   int *pbDel){.  
c4d0: 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e  int nSz;.  int n
c4e0: 20 3d 20 30 3b 0a 20 20 66 74 73 35 46 61 73 74   = 0;.  fts5Fast
c4f0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e  GetVarint32(p, n
c500: 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72 74  , nSz);.  assert
c510: 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20  _nc( nSz>=0 );. 
c520: 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a   *pnSz = nSz/2;.
c530: 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26    *pbDel = nSz &
c540: 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75 72   0x0001;.  retur
c550: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74  n n;.}../*.** Ft
c560: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
c570: 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20  ffset currently 
c580: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
c590: 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a  rst byte of a.**
c5a0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
c5b0: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
c5c0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
c5d0: 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72 65   field and store
c5e0: 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f   it.** in the fo
c5f0: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
c600: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53  s:.**.**   Fts5S
c610: 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20  egIter.nPos.**  
c620: 20 46 74 73 35 53 65 67 49 74 65 72 2e 62 44 65   Fts5SegIter.bDe
c630: 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74  l.**.** Leave Ft
c640: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
c650: 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20 74  ffset pointing t
c660: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
c670: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69   of the .** posi
c680: 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e  tion list conten
c690: 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73  t (if any)..*/.s
c6a0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
c6b0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46  egIterLoadNPos(F
c6c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
c6d0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
c6e0: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
c6f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c700: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
c710: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ->iLeafOffset;  
c720: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61  /* Offset to rea
c730: 64 20 61 74 20 2a 2f 0a 20 20 20 20 41 53 53 45  d at */.    ASSE
c740: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
c750: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
c760: 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  if( p->pConfig->
c770: 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
c780: 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
c790: 20 20 20 69 6e 74 20 69 45 6f 64 20 3d 20 4d 49     int iEod = MI
c7a0: 4e 28 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  N(pIter->iEndofD
c7b0: 6f 63 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 70  oclist, pIter->p
c7c0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 29 3b 0a 20  Leaf->szLeaf);. 
c7d0: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c       pIter->bDel
c7e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65   = 0;.      pIte
c7f0: 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20  r->nPos = 1;.   
c800: 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45 6f 64     if( iOff<iEod
c810: 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66   && pIter->pLeaf
c820: 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a  ->p[iOff]==0 ){.
c830: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
c840: 44 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Del = 1;.       
c850: 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20   iOff++;.       
c860: 20 69 66 28 20 69 4f 66 66 3c 69 45 6f 64 20 26   if( iOff<iEod &
c870: 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  & pIter->pLeaf->
c880: 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20  p[iOff]==0 ){.  
c890: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e          pIter->n
c8a0: 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Pos = 1;.       
c8b0: 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20     iOff++;.     
c8c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c8d0: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
c8e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
c8f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
c900: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b  {.      int nSz;
c910: 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47  .      fts5FastG
c920: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
c930: 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 69 4f 66 66  ->pLeaf->p, iOff
c940: 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70 49  , nSz);.      pI
c950: 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a  ter->bDel = (nSz
c960: 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20   & 0x0001);.    
c970: 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20    pIter->nPos = 
c980: 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73  nSz>>1;.      as
c990: 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e  sert_nc( pIter->
c9a0: 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  nPos>=0 );.    }
c9b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
c9c0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
c9d0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
c9e0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
c9f0: 61 64 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65  adRowid(Fts5Inde
ca00: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
ca10: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20  r *pIter){.  u8 
ca20: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
ca30: 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  f->p;        /* 
ca40: 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64  Buffer to read d
ca50: 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ata from */.  in
ca60: 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
ca70: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20  iLeafOffset;..  
ca80: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
ca90: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
caa0: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65    if( iOff>=pIte
cab0: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
cac0: 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49   ){.    fts5SegI
cad0: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
cae0: 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
caf0: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
cb00: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
cb10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
cb20: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
cb30: 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  UPT;.      retur
cb40: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66  n;.    }.    iOf
cb50: 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70  f = 4;.    a = p
cb60: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
cb70: 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71    }.  iOff += sq
cb80: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
cb90: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
cba0: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
cbb0: 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  d);.  pIter->iLe
cbc0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
cbd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65  .}../*.** Fts5Se
cbe0: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
cbf0: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
cc00: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
cc10: 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  byte of the .** 
cc20: 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c 64 20  "nSuffix" field 
cc30: 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e 63 74  of a term. Funct
cc40: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 6e 4b  ion parameter nK
cc50: 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  eep contains the
cc60: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
cc70: 20 22 6e 50 72 65 66 69 78 22 20 66 69 65 6c 64   "nPrefix" field
cc80: 20 28 69 66 20 74 68 65 72 65 20 77 61 73 20 6f   (if there was o
cc90: 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73 73 65  ne - it is passe
cca0: 64 20 30 20 69 66 20 74 68 69 73 20 69 73 0a 2a  d 0 if this is.*
ccb0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  * the first term
ccc0: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 29   in the segment)
ccd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
cce0: 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a  ction populates:
ccf0: 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67  .**.**   Fts5Seg
cd00: 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46  Iter.term.**   F
cd10: 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64  ts5SegIter.rowid
cd20: 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  .**.** according
cd30: 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20 28 46  ly and leaves (F
cd40: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
cd50: 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f 20 74  Offset) set to t
cd60: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
cd70: 20 74 68 65 20 66 69 72 73 74 20 70 6f 73 69 74   the first posit
cd80: 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f  ion list. The po
cd90: 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f  sition list belo
cda0: 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e  nging to documen
cdb0: 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67 49 74  t .** (Fts5SegIt
cdc0: 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73  er.iRowid)..*/.s
cdd0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
cde0: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46  egIterLoadTerm(F
cdf0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
ce00: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
ce10: 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75   int nKeep){.  u
ce20: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
ce30: 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f  eaf->p;        /
ce40: 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64  * Buffer to read
ce50: 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20   data from */.  
ce60: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
ce70: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ->iLeafOffset;  
ce80: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61  /* Offset to rea
ce90: 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  d at */.  int nN
cea0: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
ceb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
cec0: 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a  es of new data *
ced0: 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  /..  iOff += fts
cee0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
cef0: 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
cf00: 69 66 28 20 69 4f 66 66 2b 6e 4e 65 77 3e 70 49  if( iOff+nNew>pI
cf10: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 7c  ter->pLeaf->nn |
cf20: 7c 20 6e 4b 65 65 70 3e 70 49 74 65 72 2d 3e 74  | nKeep>pIter->t
cf30: 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e  erm.n ){.    p->
cf40: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
cf50: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
cf60: 20 7d 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d   }.  pIter->term
cf70: 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74  .n = nKeep;.  ft
cf80: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
cf90: 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  ob(&p->rc, &pIte
cfa0: 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26  r->term, nNew, &
cfb0: 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 61 73 73 65  a[iOff]);.  asse
cfc0: 72 74 28 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e  rt( pIter->term.
cfd0: 6e 3c 3d 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e  n<=pIter->term.n
cfe0: 53 70 61 63 65 20 29 3b 0a 20 20 69 4f 66 66 20  Space );.  iOff 
cff0: 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72  += nNew;.  pIter
d000: 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
d010: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65  t = iOff;.  pIte
d020: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
d030: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50   = pIter->iLeafP
d040: 67 6e 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  gno;.  pIter->iL
d050: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
d060: 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
d070: 69 50 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72  iPgidxOff>=pIter
d080: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20  ->pLeaf->nn ){. 
d090: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
d0a0: 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Doclist = pIter-
d0b0: 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20  >pLeaf->nn+1;.  
d0c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
d0d0: 45 78 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72  Extra;.    pIter
d0e0: 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66  ->iPgidxOff += f
d0f0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
d100: 61 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f  a[pIter->iPgidxO
d110: 66 66 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20  ff], nExtra);.  
d120: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
d130: 6f 63 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61  oclist += nExtra
d140: 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  ;.  }..  fts5Seg
d150: 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c  IterLoadRowid(p,
d160: 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74   pIter);.}..stat
d170: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d180: 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65  terNext(Fts5Inde
d190: 78 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a  x*, Fts5SegIter*
d1a0: 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  , int*);.static 
d1b0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d1c0: 4e 65 78 74 5f 52 65 76 65 72 73 65 28 46 74 73  Next_Reverse(Fts
d1d0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
d1e0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74  Iter*, int*);.st
d1f0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d200: 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 46  gIterNext_None(F
d210: 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53  ts5Index*, Fts5S
d220: 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a  egIter*, int*);.
d230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d240: 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
d250: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d260: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d270: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ){.  if( pIter->
d280: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
d290: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a  ITER_REVERSE ){.
d2a0: 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74      pIter->xNext
d2b0: 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65   = fts5SegIterNe
d2c0: 78 74 5f 52 65 76 65 72 73 65 3b 0a 20 20 7d 65  xt_Reverse;.  }e
d2d0: 6c 73 65 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66  lse if( p->pConf
d2e0: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
d2f0: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
d300: 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78  .    pIter->xNex
d310: 74 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e  t = fts5SegIterN
d320: 65 78 74 5f 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73  ext_None;.  }els
d330: 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e  e{.    pIter->xN
d340: 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65  ext = fts5SegIte
d350: 72 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rNext;.  }.}../*
d360: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
d370: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
d380: 63 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72  ct pIter to iter
d390: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
d3a0: 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65  entries in.** se
d3b0: 67 6d 65 6e 74 20 70 53 65 67 2e 20 54 68 65 20  gment pSeg. The 
d3c0: 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
d3d0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
d3e0: 20 66 69 72 73 74 20 65 6e 74 72 79 20 77 68 65   first entry whe
d3f0: 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  n .** this funct
d400: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ion returns..**.
d410: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d420: 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78  ccurs, Fts5Index
d430: 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  .rc is set to an
d440: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
d450: 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20  or code. If .** 
d460: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
d470: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
d480: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d490: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
d4a0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
d4b0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d4c0: 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  gIterInit(.  Fts
d4d0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d4f0: 46 54 53 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  FTS index object
d500: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
d510: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
d520: 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
d530: 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20  tion of segment 
d540: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
d550: 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
d560: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
d570: 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b  o populate */.){
d580: 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e  .  if( pSeg->pgn
d590: 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  oFirst==0 ){.   
d5a0: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
d5b0: 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   if the segment 
d5c0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 61 73  is being used as
d5d0: 20 61 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e 20   an input to an 
d5e0: 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20  incremental.    
d5f0: 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c  ** merge and all
d600: 20 64 61 74 61 20 68 61 73 20 61 6c 72 65 61 64   data has alread
d610: 79 20 62 65 65 6e 20 22 74 72 69 6d 6d 65 64 22  y been "trimmed"
d620: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20  . See function. 
d630: 20 20 20 2a 2a 20 66 74 73 35 54 72 69 6d 53 65     ** fts5TrimSe
d640: 67 6d 65 6e 74 73 28 29 20 66 6f 72 20 64 65 74  gments() for det
d650: 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ails. In this ca
d660: 73 65 20 6c 65 61 76 65 20 74 68 65 20 69 74 65  se leave the ite
d670: 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20  rator empty..   
d680: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 77   ** The caller w
d690: 69 6c 6c 20 73 65 65 20 74 68 65 20 28 70 49 74  ill see the (pIt
d6a0: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e  er->pLeaf==0) an
d6b0: 64 20 61 73 73 75 6d 65 20 74 68 65 20 69 74 65  d assume the ite
d6c0: 72 61 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20  rator is.    ** 
d6d0: 61 74 20 45 4f 46 20 61 6c 72 65 61 64 79 2e 20  at EOF already. 
d6e0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
d6f0: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
d700: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
d710: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
d720: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d730: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
d740: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
d750: 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  );.    fts5SegIt
d760: 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74  erSetNext(p, pIt
d770: 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  er);.    pIter->
d780: 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20  pSeg = pSeg;.   
d790: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
d7a0: 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  o = pSeg->pgnoFi
d7b0: 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53  rst-1;.    fts5S
d7c0: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
d7d0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  , pIter);.  }.. 
d7e0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
d7f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74  TE_OK ){.    pIt
d800: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d810: 3d 20 34 3b 0a 20 20 20 20 61 73 73 65 72 74 5f  = 4;.    assert_
d820: 6e 63 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  nc( pIter->pLeaf
d830: 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20 20 20 61 73  ->nn>4 );.    as
d840: 73 65 72 74 5f 6e 63 28 20 66 74 73 35 4c 65 61  sert_nc( fts5Lea
d850: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49  fFirstTermOff(pI
d860: 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29  ter->pLeaf)==4 )
d870: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67  ;.    pIter->iPg
d880: 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  idxOff = pIter->
d890: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b  pLeaf->szLeaf+1;
d8a0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
d8b0: 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65  LoadTerm(p, pIte
d8c0: 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53  r, 0);.    fts5S
d8d0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
d8e0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
d8f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
d900: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
d910: 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  r called on iter
d920: 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79  ators created by
d930: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73   calls to.** Fts
d940: 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69  5IndexQuery() wi
d950: 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58  th the FTS5INDEX
d960: 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67  _QUERY_DESC flag
d970: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   set..**.** The 
d980: 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61  iterator is in a
d990: 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20  n unusual state 
d9a0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
d9b0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68  on is called: th
d9c0: 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  e.** Fts5SegIter
d9d0: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72  .iLeafOffset var
d9e0: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
d9f0: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
da00: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
da10: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
da20: 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74  size field for t
da30: 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
da40: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
da50: 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49  age..** Fts5SegI
da60: 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74  ter.rowid is set
da70: 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62  , but nPos and b
da80: 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a  Del are not..**.
da90: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
daa0: 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 69 74   advances the it
dab0: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
dac0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
dad0: 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e  last .** relevan
dae0: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
daf0: 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  age and, if nece
db00: 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a  ssary, initializ
db10: 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69  es the .** aRowi
db20: 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52  dOffset[] and iR
db30: 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61  owidOffset varia
db40: 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f  bles. At this po
db50: 69 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  int the iterator
db60: 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65  .** is in its re
db70: 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74  gular state - Ft
db80: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
db90: 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20  ffset points to 
dba0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74  the first.** byt
dbb0: 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  e of the positio
dbc0: 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61  n list content a
dbd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
dbe0: 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74  aid rowid..*/.st
dbf0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
dc00: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
dc10: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
dc20: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
dc30: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 65 44  pIter){.  int eD
dc40: 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66  etail = p->pConf
dc50: 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69  ig->eDetail;.  i
dc60: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
dc70: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69  eaf->szLeaf;.  i
dc80: 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c  nt i = pIter->iL
dc90: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  eafOffset;.  u8 
dca0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
dcb0: 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77  f->p;.  int iRow
dcc0: 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  idOffset = 0;.. 
dcd0: 20 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45   if( n>pIter->iE
dce0: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ndofDoclist ){. 
dcf0: 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45     n = pIter->iE
dd00: 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d  ndofDoclist;.  }
dd10: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
dd20: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
dd30: 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  f);.  while( 1 )
dd40: 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  {.    i64 iDelta
dd50: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 65   = 0;..    if( e
dd60: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
dd70: 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
dd80: 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20    /* todo */.   
dd90: 20 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b     if( i<n && a[
dda0: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
ddb0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   i++;.        if
ddc0: 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30  ( i<n && a[i]==0
ddd0: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) i++;.      }.
dde0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ddf0: 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
de00: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
de10: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50     i += fts5GetP
de20: 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d  oslistSize(&a[i]
de30: 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
de40: 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50  );.      i += nP
de50: 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  os;.    }.    if
de60: 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a  ( i>=n ) break;.
de70: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
de80: 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75  Varint(&a[i], (u
de90: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
dea0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
deb0: 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
dec0: 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  /* If necessary,
ded0: 20 67 72 6f 77 20 74 68 65 20 70 49 74 65 72 2d   grow the pIter-
dee0: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20  >aRowidOffset[] 
def0: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66  array. */.    if
df00: 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d  ( iRowidOffset>=
df10: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
df20: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  set ){.      int
df30: 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e   nNew = pIter->n
df40: 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b  RowidOffset + 8;
df50: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  .      int *aNew
df60: 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
df70: 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e  _realloc(pIter->
df80: 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e  aRowidOffset, nN
df90: 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  ew*sizeof(int));
dfa0: 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d  .      if( aNew=
dfb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
dfc0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
dfd0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  EM;.        brea
dfe0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
dff0: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
e000: 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20  fset = aNew;.   
e010: 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64     pIter->nRowid
e020: 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  Offset = nNew;. 
e030: 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d     }..    pIter-
e040: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52  >aRowidOffset[iR
e050: 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20  owidOffset++] = 
e060: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e070: 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  et;.    pIter->i
e080: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a  LeafOffset = i;.
e090: 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f    }.  pIter->iRo
e0a0: 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  widOffset = iRow
e0b0: 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35  idOffset;.  fts5
e0c0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
e0d0: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
e0e0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
e0f0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
e100: 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73  verseNewPage(Fts
e110: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
e120: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
e130: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
e140: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e150: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
e160: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
e170: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
e180: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
e190: 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  ;..  fts5DataRel
e1a0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
e1b0: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65  f);.  pIter->pLe
e1c0: 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  af = 0;.  while(
e1d0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
e1e0: 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61  K && pIter->iLea
e1f0: 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65  fPgno>pIter->iTe
e200: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
e210: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
e220: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
e230: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e  afPgno--;.    pN
e240: 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
e250: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
e260: 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20  T_ROWID(.       
e270: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e     pIter->pSeg->
e280: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
e290: 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b  LeafPgno.    ));
e2a0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
e2b0: 0a 20 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c  .      /* iTermL
e2c0: 65 61 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65  eafOffset may be
e2d0: 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66   equal to szLeaf
e2e0: 20 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   if the term is 
e2f0: 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
e300: 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70  * thing on the p
e310: 61 67 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66  age - i.e. the f
e320: 69 72 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e  irst rowid is on
e330: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
e340: 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  age..      ** In
e350: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
e360: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
e370: 2c 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  , this iterator 
e380: 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20  is at EOF. */.  
e390: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
e3a0: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
e3b0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
e3c0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e3d0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
e3e0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
e3f0: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
e400: 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a  fOffset<pNew->sz
e410: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
e420: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
e430: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
e440: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e450: 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65  set = pIter->iTe
e460: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  rmLeafOffset;.  
e470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e480: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
e490: 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
e4a0: 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
e4b0: 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
e4c0: 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20  idOff(pNew);.   
e4d0: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
e4e0: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
e4f0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
e500: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
e510: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e520: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  t = iRowidOff;. 
e530: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e540: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
e550: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
e560: 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74      u8 *a = &pIt
e570: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74  er->pLeaf->p[pIt
e580: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  er->iLeafOffset]
e590: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
e5a0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20  >iLeafOffset += 
e5b0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c  fts5GetVarint(a,
e5c0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
e5d0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
e5e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
e5f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
e600: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
e610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e620: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
e630: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
e640: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
e650: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
e660: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66  eaf->nn+1;.    f
e670: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
e680: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
e690: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
e6a0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
e6b0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
e6c0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
e6d0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
e6e0: 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20  ently.** points 
e6f0: 74 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b  to a delete mark
e700: 65 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72  er. A delete mar
e710: 6b 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20  ker is an entry 
e720: 77 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a  with a 0 byte.**
e730: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a   position-list..
e740: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
e750: 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
e760: 74 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ty(Fts5Index *p,
e770: 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
e780: 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
e790: 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
e7a0: 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69  >aSeg[pIter->aFi
e7b0: 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a  rst[1].iFirst];.
e7c0: 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
e7d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53  =SQLITE_OK && pS
e7e0: 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65  eg->pLeaf && pSe
e7f0: 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a  g->nPos==0);.}..
e800: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  /*.** Advance it
e810: 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20  erator pIter to 
e820: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a  the next entry..
e830: 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  **.** This versi
e840: 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49 74 65  on of fts5SegIte
e850: 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c 79 20  rNext() is only 
e860: 75 73 65 64 20 62 79 20 72 65 76 65 72 73 65 20  used by reverse 
e870: 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
e880: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
e890: 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73  gIterNext_Revers
e8a0: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
e8b0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
e8c0: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
e8d0: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
e8e0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
e8f0: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
e900: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
e910: 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
e920: 20 2a 70 62 55 6e 75 73 65 64 20 20 20 20 20 20   *pbUnused      
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e940: 55 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  Unused */.){.  a
e950: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
e960: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e970: 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20  ER_REVERSE );.  
e980: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
e990: 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  NextLeaf==0 );. 
e9a0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 62   UNUSED_PARAM(pb
e9b0: 55 6e 75 73 65 64 29 3b 0a 0a 20 20 69 66 28 20  Unused);..  if( 
e9c0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
e9d0: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 75 38 20  set>0 ){.    u8 
e9e0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
e9f0: 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 69 4f  f->p;.    int iO
ea00: 66 66 3b 0a 20 20 20 20 69 36 34 20 69 44 65 6c  ff;.    i64 iDel
ea10: 74 61 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e  ta;..    pIter->
ea20: 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a  iRowidOffset--;.
ea30: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ea40: 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Offset = pIter->
ea50: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74  aRowidOffset[pIt
ea60: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
ea70: 5d 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ];.    fts5SegIt
ea80: 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
ea90: 74 65 72 29 3b 0a 20 20 20 20 69 4f 66 66 20 3d  ter);.    iOff =
eaa0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
eab0: 73 65 74 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  set;.    if( p->
eac0: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
ead0: 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  !=FTS5_DETAIL_NO
eae0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66  NE ){.      iOff
eaf0: 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b   += pIter->nPos;
eb00: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 47  .    }.    fts5G
eb10: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
eb20: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
eb30: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
eb40: 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  owid -= iDelta;.
eb50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
eb60: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
eb70: 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  ewPage(p, pIter)
eb80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
eb90: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
eba0: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
ebb0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
ebc0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  his version of f
ebd0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29  ts5SegIterNext()
ebe0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
ebf0: 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 61 6e 64   detail=none and
ec00: 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72   the.** iterator
ec10: 20 69 73 20 6e 6f 74 20 61 20 72 65 76 65 72 73   is not a revers
ec20: 65 20 64 69 72 65 63 74 69 6f 6e 20 69 74 65 72  e direction iter
ec30: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
ec40: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
ec50: 4e 65 78 74 5f 4e 6f 6e 65 28 0a 20 20 46 74 73  Next_None(.  Fts
ec60: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec80: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
ec90: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
eca0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
ecb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
ecc0: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
ecd0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54  */.  int *pbNewT
ece0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
ecf0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
ed00: 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f   for new term */
ed10: 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  .){.  int iOff;.
ed20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
ed30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
ed40: 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d   assert( (pIter-
ed50: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
ed60: 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d  GITER_REVERSE)==
ed70: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ed80: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
ed90: 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
eda0: 4e 4f 4e 45 20 29 3b 0a 0a 20 20 41 53 53 45 52  NONE );..  ASSER
edb0: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65  T_SZLEAF_OK(pIte
edc0: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66  r->pLeaf);.  iOf
edd0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
ede0: 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 4e 65  Offset;..  /* Ne
edf0: 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74  xt entry is on t
ee00: 68 65 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  he next page */.
ee10: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65    if( pIter->pSe
ee20: 67 20 26 26 20 69 4f 66 66 3e 3d 70 49 74 65 72  g && iOff>=pIter
ee30: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
ee40: 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ){.    fts5SegIt
ee50: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
ee60: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ter);.    if( p-
ee70: 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c  >rc || pIter->pL
ee80: 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  eaf==0 ) return;
ee90: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
eea0: 69 64 20 3d 20 30 3b 0a 20 20 20 20 69 4f 66 66  id = 0;.    iOff
eeb0: 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 4;.  }..  if(
eec0: 20 69 4f 66 66 3c 70 49 74 65 72 2d 3e 69 45 6e   iOff<pIter->iEn
eed0: 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  dofDoclist ){.  
eee0: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
eef0: 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  is on the curren
ef00: 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 36  t page */.    i6
ef10: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 69 4f  4 iDelta;.    iO
ef20: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
ef30: 35 47 65 74 56 61 72 69 6e 74 28 26 70 49 74 65  5GetVarint(&pIte
ef40: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  r->pLeaf->p[iOff
ef50: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
ef60: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
ef70: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
ef80: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
ef90: 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  wid += iDelta;. 
efa0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 74 65   }else if( (pIte
efb0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
efc0: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29  SEGITER_ONETERM)
efd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
efe0: 49 74 65 72 2d 3e 70 53 65 67 20 29 7b 0a 20 20  Iter->pSeg ){.  
eff0: 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20      int nKeep = 
f000: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  0;.      if( iOf
f010: 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74  f!=fts5LeafFirst
f020: 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70  TermOff(pIter->p
f030: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
f040: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
f050: 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d  Varint32(&pIter-
f060: 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  >pLeaf->p[iOff],
f070: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d   nKeep);.      }
f080: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
f090: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
f0a0: 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  ;.      fts5SegI
f0b0: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
f0c0: 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Iter, nKeep);.  
f0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
f0e0: 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
f0f0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   0;.      const 
f100: 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b  char *zTerm = 0;
f110: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74  .      int nList
f120: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
f130: 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28  ts5HashScanNext(
f140: 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 20  p->pHash);.     
f150: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
f160: 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61  ScanEntry(p->pHa
f170: 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69  sh, &zTerm, &pLi
f180: 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
f190: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
f1a0: 29 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65  ) goto next_none
f1b0: 5f 65 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65  _eof;.      pIte
f1c0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75  r->pLeaf->p = (u
f1d0: 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  8*)pList;.      
f1e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
f1f0: 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20   = nList;.      
f200: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
f210: 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  Leaf = nList;.  
f220: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
f230: 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74  fDoclist = nList
f240: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
f250: 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
f260: 3e 72 63 2c 26 70 49 74 65 72 2d 3e 74 65 72 6d  >rc,&pIter->term
f270: 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  , (int)strlen(zT
f280: 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d  erm), (u8*)zTerm
f290: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
f2a0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
f2b0: 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73  s5GetVarint(pLis
f2c0: 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  t, (u64*)&pIter-
f2d0: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  >iRowid);.    }.
f2e0: 0a 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65  .    if( pbNewTe
f2f0: 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20  rm ) *pbNewTerm 
f300: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
f310: 20 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65    goto next_none
f320: 5f 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  _eof;.  }..  fts
f330: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
f340: 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 72  (p, pIter);..  r
f350: 65 74 75 72 6e 3b 0a 20 6e 65 78 74 5f 6e 6f 6e  eturn;. next_non
f360: 65 5f 65 6f 66 3a 0a 20 20 66 74 73 35 44 61 74  e_eof:.  fts5Dat
f370: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
f380: 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d  pLeaf);.  pIter-
f390: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 0a  >pLeaf = 0;.}...
f3a0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  /*.** Advance it
f3b0: 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20  erator pIter to 
f3c0: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
f3d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
f3e0: 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
f3f0: 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
f400: 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
f410: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20   error code. It 
f420: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  .** is not consi
f430: 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
f440: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  f the iterator r
f450: 65 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61  eaches EOF. If a
f460: 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
f470: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
f480: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
f490: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
f4a0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
f4b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
f4c0: 35 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20  5SegIterNext(.  
f4d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
f500: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
f510: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
f520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f530: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
f540: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e  ce */.  int *pbN
f550: 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
f560: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f570: 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d  Set for new term
f580: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74   */.){.  Fts5Dat
f590: 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
f5a0: 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69  ->pLeaf;.  int i
f5b0: 4f 66 66 3b 0a 20 20 69 6e 74 20 62 4e 65 77 54  Off;.  int bNewT
f5c0: 65 72 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  erm = 0;.  int n
f5d0: 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75 38 20 2a  Keep = 0;.  u8 *
f5e0: 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61  a;.  int n;..  a
f5f0: 73 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d  ssert( pbNewTerm
f600: 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72  ==0 || *pbNewTer
f610: 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
f620: 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
f630: 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
f640: 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 2f 2a  IL_NONE );..  /*
f650: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
f660: 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74  end of the posit
f670: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20  ion list within 
f680: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f690: 2e 20 2a 2f 0a 20 20 61 20 3d 20 70 4c 65 61 66  . */.  a = pLeaf
f6a0: 2d 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c 65 61 66  ->p;.  n = pLeaf
f6b0: 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 41 53 53  ->szLeaf;..  ASS
f6c0: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
f6d0: 65 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70  eaf);.  iOff = p
f6e0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f6f0: 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b  t + pIter->nPos;
f700: 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29  ..  if( iOff<n )
f710: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78  {.    /* The nex
f720: 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68  t entry is on th
f730: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
f740: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63  */.    assert_nc
f750: 28 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69  ( iOff<=pIter->i
f760: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 3b 0a  EndofDoclist );.
f770: 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49      if( iOff>=pI
f780: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
f790: 73 74 20 29 7b 0a 20 20 20 20 20 20 62 4e 65 77  st ){.      bNew
f7a0: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
f7b0: 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35 4c 65  if( iOff!=fts5Le
f7c0: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
f7d0: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
f7e0: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
f7f0: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
f800: 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  ], nKeep);.     
f810: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
f820: 20 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a      u64 iDelta;.
f830: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
f840: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
f850: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44  nt(&a[iOff], &iD
f860: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49 74  elta);.      pIt
f870: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
f880: 65 6c 74 61 3b 0a 20 20 20 20 20 20 61 73 73 65  elta;.      asse
f890: 72 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20  rt_nc( iDelta>0 
f8a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  );.    }.    pIt
f8b0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
f8c0: 3d 20 69 4f 66 66 3b 0a 0a 20 20 7d 65 6c 73 65  = iOff;..  }else
f8d0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67   if( pIter->pSeg
f8e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
f8f0: 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a   u8 *pList = 0;.
f900: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f910: 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 69  zTerm = 0;.    i
f920: 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20  nt nList = 0;.  
f930: 20 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72    assert( (pIter
f940: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
f950: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
f960: 7c 7c 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a  || pbNewTerm );.
f970: 20 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65      if( 0==(pIte
f980: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
f990: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29  SEGITER_ONETERM)
f9a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f9b0: 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78  3Fts5HashScanNex
f9c0: 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20  t(p->pHash);.   
f9d0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
f9e0: 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
f9f0: 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70  Hash, &zTerm, &p
fa00: 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
fa10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
fa20: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
fa30: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
fa40: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
fa50: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
fa60: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
fa70: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
fa80: 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
fa90: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
faa0: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c  ->pLeaf->nn = nL
fab0: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
fac0: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
fad0: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
fae0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
faf0: 69 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20  ist = nList+1;. 
fb00: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
fb10: 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
fb20: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
fb30: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72  (int)strlen(zTer
fb40: 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 75  m),.          (u
fb50: 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
fb60: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
fb70: 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  set = fts5GetVar
fb80: 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a  int(pList, (u64*
fb90: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
fba0: 3b 0a 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65  ;.      *pbNewTe
fbb0: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rm = 1;.    }.  
fbc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4f 66 66 20  }else{.    iOff 
fbd0: 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 65 78 74  = 0;.    /* Next
fbe0: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e   entry is not on
fbf0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
fc00: 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  e */.    while( 
fc10: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
fc20: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
fc30: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
fc40: 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49        pLeaf = pI
fc50: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20  ter->pLeaf;.    
fc60: 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
fc70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 41 53   break;.      AS
fc80: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
fc90: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28  Leaf);.      if(
fca0: 20 28 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61   (iOff = fts5Lea
fcb0: 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
fcc0: 4c 65 61 66 29 29 20 26 26 20 69 4f 66 66 3c 70  Leaf)) && iOff<p
fcd0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
fce0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
fcf0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
fd00: 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
fd10: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
fd20: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
fd30: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
fd40: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
fd50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
fd60: 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a  af->nn>pLeaf->sz
fd70: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
fd80: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
fd90: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
fda0: 61 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69  af + fts5GetVari
fdb0: 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20  nt32(.          
fdc0: 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c      &pLeaf->p[pL
fdd0: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 70 49  eaf->szLeaf], pI
fde0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
fdf0: 73 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  st.          );.
fe00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fe10: 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
fe20: 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66   pLeaf->nn>pLeaf
fe30: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
fe40: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
fe50: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
fe60: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
fe70: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
fe80: 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c      &pLeaf->p[pL
fe90: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f  eaf->szLeaf], iO
fea0: 66 66 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ff.        );.  
feb0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
fec0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
fed0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
fee0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
fef0: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 62 4e  iOff;.        bN
ff00: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
ff10: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
ff20: 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d  _nc( iOff<pLeaf-
ff30: 3e 73 7a 4c 65 61 66 20 29 3b 0a 20 20 20 20 20  >szLeaf );.     
ff40: 20 69 66 28 20 69 4f 66 66 3e 70 4c 65 61 66 2d   if( iOff>pLeaf-
ff50: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
ff60: 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
ff70: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
ff80: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
ff90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ffa0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 74   Check if the it
ffb0: 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74  erator is now at
ffc0: 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74   EOF. If so, ret
ffd0: 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20  urn early. */.  
ffe0: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
fff0: 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4e 65 77   ){.    if( bNew
10000 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66  Term ){.      if
10010 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
10020 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
10030 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20  ETERM ){.       
10040 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
10050 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
10060 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
10070 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
10080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
10090 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
100a0 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65  rm(p, pIter, nKe
100b0 65 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ep);.        fts
100c0 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
100d0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
100e0 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72      if( pbNewTer
100f0 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d  m ) *pbNewTerm =
10100 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
10110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
10120 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
10130 75 6c 64 20 62 65 20 64 6f 6e 65 20 62 79 20 63  uld be done by c
10140 61 6c 6c 69 6e 67 20 66 74 73 35 53 65 67 49 74  alling fts5SegIt
10150 65 72 4c 6f 61 64 4e 50 6f 73 28 29 2e 20 42 75  erLoadNPos(). Bu
10160 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  t.      ** this 
10170 62 6c 6f 63 6b 20 69 73 20 70 61 72 74 69 63 75  block is particu
10180 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63  larly performanc
10190 65 20 63 72 69 74 69 63 61 6c 2c 20 73 6f 20 65  e critical, so e
101a0 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
101b0 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  ** code is inlin
101c0 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ed. .      **.  
101d0 20 20 20 20 2a 2a 20 4c 61 74 65 72 3a 20 53 77      ** Later: Sw
101e0 69 74 63 68 65 64 20 62 61 63 6b 20 74 6f 20 66  itched back to f
101f0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
10200 6f 73 28 29 20 62 65 63 61 75 73 65 20 69 74 20  os() because it 
10210 73 75 70 70 6f 72 74 73 0a 20 20 20 20 20 20 2a  supports.      *
10220 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f  * detail=none mo
10230 64 65 2e 20 4e 6f 74 20 69 64 65 61 6c 2e 0a 20  de. Not ideal.. 
10240 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
10250 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 61 73 73  t nSz;.      ass
10260 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
10270 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
10280 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c  ssert( pIter->iL
10290 65 61 66 4f 66 66 73 65 74 3c 3d 70 49 74 65 72  eafOffset<=pIter
102a0 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 3b 0a 20  ->pLeaf->nn );. 
102b0 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
102c0 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e  Varint32(pIter->
102d0 70 4c 65 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d  pLeaf->p, pIter-
102e0 3e 69 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e 53  >iLeafOffset, nS
102f0 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  z);.      pIter-
10300 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30  >bDel = (nSz & 0
10310 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49  x0001);.      pI
10320 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e  ter->nPos = nSz>
10330 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  >1;.      assert
10340 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73  _nc( pIter->nPos
10350 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  >=0 );.    }.  }
10360 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .}..#define SWAP
10370 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54  VAL(T, a, b) { T
10380 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62   tmp; tmp=a; a=b
10390 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66  ; b=tmp; }..#def
103a0 69 6e 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69  ine fts5IndexSki
103b0 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29  pVarint(a, iOff)
103c0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a   {            \.
103d0 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66    int iEnd = iOf
103e0 66 2b 39 3b 20 20 20 20 20 20 20 20 20 20 20 20  f+9;            
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 20 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b    \.  while( (a[
10410 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20  iOff++] & 0x80) 
10420 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20  && iOff<iEnd ); 
10430 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
10440 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
10450 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
10460 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
10470 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74  wid in a doclist
10480 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10490 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74 65 72  on sets the iter
104a0 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20  ator up so that 
104b0 69 74 65 72 61 74 65 73 20 69 6e 20 72 65 76 65  iterates in reve
104c0 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67  rse order throug
104d0 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74  h.** the doclist
104e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
104f0 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
10500 72 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  rse(Fts5Index *p
10510 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
10520 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 6c 69  Iter){.  Fts5Dli
10530 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
10540 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a   pIter->pDlidx;.
10550 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73    Fts5Data *pLas
10560 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e  t = 0;.  int pgn
10570 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66  oLast = 0;..  if
10580 28 20 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( pDlidx ){.    
10590 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74  int iSegid = pIt
105a0 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
105b0 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d  ;.    pgnoLast =
105c0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
105d0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
105e0 70 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74 61  pLast = fts5Data
105f0 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
10600 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
10610 64 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20  d, pgnoLast));. 
10620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35   }else{.    Fts5
10630 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
10640 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20  ter->pLeaf;     
10650 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
10660 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20  eaf data */..   
10670 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46   /* Currently, F
10680 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
10690 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f  Offset points to
106a0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
106b0 6f 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69  of.    ** positi
106c0 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20  on-list content 
106d0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
106e0 72 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75  rowid. Back it u
106f0 70 20 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20  p so that it.   
10700 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   ** points to th
10710 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70  e start of the p
10720 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
10730 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20  e field. */.    
10740 69 6e 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20  int iPoslist;.  
10750 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
10760 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  rmLeafPgno==pIte
10770 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
10780 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d        iPoslist =
10790 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
107a0 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c  fOffset;.    }el
107b0 73 65 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69  se{.      iPosli
107c0 73 74 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  st = 4;.    }.  
107d0 20 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56    fts5IndexSkipV
107e0 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20  arint(pLeaf->p, 
107f0 69 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70  iPoslist);.    p
10800 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10810 74 20 3d 20 69 50 6f 73 6c 69 73 74 3b 0a 0a 20  t = iPoslist;.. 
10820 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f     /* If this co
10830 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
10840 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74  then the largest
10850 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
10860 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65  urrent.    ** te
10870 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74  rm may not be st
10880 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
10890 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61  ent page. So sea
108a0 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20  rch forward to. 
108b0 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20     ** see where 
108c0 73 61 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c  said rowid reall
108d0 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66  y is.  */.    if
108e0 28 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  ( pIter->iEndofD
108f0 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73  oclist>=pLeaf->s
10900 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  zLeaf ){.      i
10910 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46  nt pgno;.      F
10920 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
10930 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
10940 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20  r->pSeg;..      
10950 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69  /* The last rowi
10960 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
10970 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74   may not be on t
10980 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
10990 20 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a   Search.      **
109a0 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64   forward to find
109b0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
109c0 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f  ning the last ro
109d0 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  wid.  */.      f
109e0 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69  or(pgno=pIter->i
109f0 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e  LeafPgno+1; !p->
10a00 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67  rc && pgno<=pSeg
10a10 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f  ->pgnoLast; pgno
10a20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ++){.        i64
10a30 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47   iAbs = FTS5_SEG
10a40 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
10a50 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a  >iSegid, pgno);.
10a60 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61          Fts5Data
10a70 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74   *pNew = fts5Dat
10a80 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a  aRead(p, iAbs);.
10a90 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
10aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
10ab0 74 20 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c  t iRowid, bTerml
10ac0 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ess;.          i
10ad0 52 6f 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66  Rowid = fts5Leaf
10ae0 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e  FirstRowidOff(pN
10af0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ew);.          b
10b00 54 65 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c  Termless = fts5L
10b10 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e  eafIsTermless(pN
10b20 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ew);.          i
10b30 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  f( iRowid ){.   
10b40 20 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c           SWAPVAL
10b50 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77  (Fts5Data*, pNew
10b60 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  , pLast);.      
10b70 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d        pgnoLast =
10b80 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20   pgno;.         
10b90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
10ba0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
10bb0 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
10bc0 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29  ( bTermless==0 )
10bd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10be0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10bf0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61    }..  /* If pLa
10c00 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68  st is NULL at th
10c10 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
10c20 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f  he last rowid fo
10c30 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20  r this doclist. 
10c40 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20   ** lies on the 
10c50 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69  page currently i
10c60 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
10c70 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69  iterator. In thi
10c80 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74  s case .  ** pIt
10c90 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
10ca0 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
10cb0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
10cc0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
10cd0 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73  e.  ** field ass
10ce0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
10cf0 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20   first relevant 
10d00 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
10d10 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c  e..  **.  ** Or,
10d20 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e   if pLast is non
10d30 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69  -NULL, then it i
10d40 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
10d50 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73  contains the las
10d60 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e  t.  ** rowid. In
10d70 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69   this case confi
10d80 67 75 72 65 20 74 68 65 20 69 74 65 72 61 74 6f  gure the iterato
10d90 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
10da0 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  nts to the.  ** 
10db0 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74  first rowid on t
10dc0 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  his page..  */. 
10dd0 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20   if( pLast ){.  
10de0 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
10df0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
10e00 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
10e10 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
10e20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74  = pLast;.    pIt
10e30 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
10e40 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f  pgnoLast;.    iO
10e50 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
10e60 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74  stRowidOff(pLast
10e70 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
10e80 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
10e90 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ast->p[iOff], (u
10ea0 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
10eb0 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  id);.    pIter->
10ec0 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
10ed0 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73  ff;..    if( fts
10ee0 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
10ef0 70 4c 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pLast) ){.      
10f00 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
10f10 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e  list = pLast->nn
10f20 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
10f30 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
10f40 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35  ofDoclist = fts5
10f50 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
10f60 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a  (pLast);.    }..
10f70 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
10f80 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
10f90 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  e(p, pIter);.}..
10fa0 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
10fb0 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
10fc0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
10fd0 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f  st rowid of a do
10fe0 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20  clist..** There 
10ff0 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
11000 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
11010 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72  th the final ter
11020 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  m on the current
11030 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68   .** page. If th
11040 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
11050 73 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  s the last term 
11060 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61  on the page, loa
11070 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  d the .** doclis
11080 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73  t-index from dis
11090 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  k and initialize
110a0 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20   an iterator at 
110b0 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e  (pIter->pDlidx).
110c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
110d0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
110e0 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  lidx(Fts5Index *
110f0 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
11100 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53  pIter){.  int iS
11110 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
11120 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20  ->iSegid;.  int 
11130 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66  bRev = (pIter->f
11140 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
11150 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20  TER_REVERSE);.  
11160 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
11170 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20  = pIter->pLeaf; 
11180 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
11190 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  data */..  asser
111a0 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
111b0 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
111c0 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
111d0 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
111e0 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  x==0 );..  /* Ch
111f0 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65  eck if the curre
11200 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20  nt doclist ends 
11210 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49 66  on this page. If
11220 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e   it does, return
11230 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68  .  ** early with
11240 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  out loading the 
11250 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61  doclist-index (a
11260 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20  s it belongs to 
11270 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a  a different.  **
11280 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20   term. */.  if( 
11290 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
112a0 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno==pIter->iLe
112b0 61 66 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49  afPgno .   && pI
112c0 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
112d0 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  st<pLeaf->szLeaf
112e0 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
112f0 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  n;.  }..  pIter-
11300 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c  >pDlidx = fts5Dl
11310 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62  idxIterInit(p, b
11320 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72  Rev, iSeg, pIter
11330 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
11340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
11350 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
11360 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
11370 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72  ond argument cur
11380 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a  rently contains.
11390 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75  ** no valid valu
113a0 65 73 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  es except for th
113b0 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c  e Fts5SegIter.pL
113c0 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61  eaf member varia
113d0 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ble. This.** fun
113e0 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74  ction searches t
113f0 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72  he leaf page for
11400 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67   a term matching
11410 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a   (pTerm/nTerm)..
11420 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65  **.** If the spe
11430 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 66  cified term is f
11440 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65  ound on the page
11450 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
11460 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70  tor is left.** p
11470 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49  ointing to it. I
11480 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69  f argument bGe i
11490 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74  s zero and the t
114a0 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  erm is not found
114b0 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f  ,.** the iterato
114c0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
114d0 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  ng at EOF..**.**
114e0 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a   If bGe is non-z
114f0 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63  ero and the spec
11500 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f  ified term is no
11510 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
11520 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73  e.** iterator is
11530 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
11540 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74  o the smallest t
11550 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65  erm in the segme
11560 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61  nt that.** is la
11570 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70  rger than the sp
11580 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76  ecified term, ev
11590 65 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20  en if this term 
115a0 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a  is not on the.**
115b0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a   current page..*
115c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
115d0 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74  s5LeafSeek(.  Ft
115e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11600 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
11610 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20   code here */.  
11620 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20 20 20  int bGe,        
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d  /* True for a >=
11650 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73   search */.  Fts
11660 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11680 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b  Iterator to seek
11690 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
116a0 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
116b0 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f        /* Term to
116c0 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29   search for */.)
116d0 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20  {.  int iOff;.  
116e0 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49  const u8 *a = pI
116f0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
11700 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49   int szLeaf = pI
11710 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
11720 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49  af;.  int n = pI
11730 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  ter->pLeaf->nn;.
11740 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20  .  int nMatch = 
11750 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d  0;.  int nKeep =
11760 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   0;.  int nNew =
11770 20 30 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f   0;.  int iTermO
11780 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78  ff;.  int iPgidx
11790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
117a0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
117b0 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69 64 78   offset in pgidx
117c0 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66   */.  int bEndOf
117d0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
117e0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
117f0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69  TE_OK );..  iPgi
11800 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69  dx = szLeaf;.  i
11810 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74  Pgidx += fts5Get
11820 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
11830 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a  dx], iTermOff);.
11840 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
11850 66 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 6e 20  f;.  if( iOff>n 
11860 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
11870 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
11880 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
11890 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20  while( 1 ){..   
118a0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
118b0 6f 77 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65  ow many new byte
118c0 73 20 61 72 65 20 69 6e 20 74 68 69 73 20 74 65  s are in this te
118d0 72 6d 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61  rm */.    fts5Fa
118e0 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  stGetVarint32(a,
118f0 20 69 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20   iOff, nNew);.  
11900 20 20 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74    if( nKeep<nMat
11910 63 68 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  ch ){.      goto
11920 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a   search_failed;.
11930 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
11940 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68  t( nKeep>=nMatch
11950 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65   );.    if( nKee
11960 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20  p==nMatch ){.   
11970 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20     int nCmp;.   
11980 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
11990 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c  nCmp = MIN(nNew,
119a0 20 6e 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a   nTerm-nMatch);.
119b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
119c0 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCmp; i++){.   
119d0 20 20 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b       if( a[iOff+
119e0 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68  i]!=pTerm[nMatch
119f0 2b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  +i] ) break;.   
11a00 20 20 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63     }.      nMatc
11a10 68 20 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69  h += i;..      i
11a20 66 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68  f( nTerm==nMatch
11a30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11a40 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20  i==nNew ){.     
11a50 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68       goto search
11a60 5f 73 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20  _success;.      
11a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11a80 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66     goto search_f
11a90 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
11aa0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11ab0 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66   i<nNew && a[iOf
11ac0 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63  f+i]>pTerm[nMatc
11ad0 68 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  h] ){.        go
11ae0 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  to search_failed
11af0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11b00 0a 20 20 20 20 69 66 28 20 69 50 67 69 64 78 3e  .    if( iPgidx>
11b10 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62 45 6e 64  =n ){.      bEnd
11b20 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20  OfPage = 1;.    
11b30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
11b40 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74      iPgidx += ft
11b50 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
11b60 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29  [iPgidx], nKeep)
11b70 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b  ;.    iTermOff +
11b80 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66  = nKeep;.    iOf
11b90 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20  f = iTermOff;.. 
11ba0 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29     if( iOff>=n )
11bb0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
11bc0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
11bd0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
11be0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  }..    /* Read t
11bf0 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20 6f  he nKeep field o
11c00 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2e  f the next term.
11c10 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74   */.    fts5Fast
11c20 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
11c30 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 7d  Off, nKeep);.  }
11c40 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  .. search_failed
11c50 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20 29  :.  if( bGe==0 )
11c60 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  {.    fts5DataRe
11c70 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
11c80 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
11c90 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 72  pLeaf = 0;.    r
11ca0 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
11cb0 66 28 20 62 45 6e 64 4f 66 50 61 67 65 20 29 7b  f( bEndOfPage ){
11cc0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
11cd0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
11ce0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
11cf0 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
11d00 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72  pLeaf==0 ) retur
11d10 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20 70 49 74  n;.      a = pIt
11d20 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
11d30 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66      if( fts5Leaf
11d40 49 73 54 65 72 6d 6c 65 73 73 28 70 49 74 65 72  IsTermless(pIter
11d50 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a 20  ->pLeaf)==0 ){. 
11d60 20 20 20 20 20 20 20 69 50 67 69 64 78 20 3d 20         iPgidx = 
11d70 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
11d80 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 69 50  Leaf;.        iP
11d90 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
11da0 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e  arint32(&pIter->
11db0 70 4c 65 61 66 2d 3e 70 5b 69 50 67 69 64 78 5d  pLeaf->p[iPgidx]
11dc0 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20  , iOff);.       
11dd0 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69   if( iOff<4 || i
11de0 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
11df0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
11e00 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
11e10 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
11e20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
11e30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11e40 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20 3d 20          nKeep = 
11e50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54 65  0;.          iTe
11e60 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20  rmOff = iOff;.  
11e70 20 20 20 20 20 20 20 20 6e 20 3d 20 70 49 74 65          n = pIte
11e80 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20  r->pLeaf->nn;.  
11e90 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
11ea0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11eb0 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b  &a[iOff], nNew);
11ec0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11ed0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11ee0 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
11ef0 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  1 );.  }.. searc
11f00 68 5f 73 75 63 63 65 73 73 3a 0a 20 20 70 49 74  h_success:.  pIt
11f10 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
11f20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a 20  = iOff + nNew;. 
11f30 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
11f40 66 4f 66 66 73 65 74 3e 6e 20 29 7b 0a 20 20 20  fOffset>n ){.   
11f50 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
11f60 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72  RRUPT;.    retur
11f70 6e 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  n;.  }.  pIter->
11f80 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
11f90 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
11fa0 66 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69  fset;.  pIter->i
11fb0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70  TermLeafPgno = p
11fc0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
11fd0 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65  ..  fts5BufferSe
11fe0 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
11ff0 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70  ->term, nKeep, p
12000 54 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66  Term);.  fts5Buf
12010 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
12020 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
12030 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66  rm, nNew, &a[iOf
12040 66 5d 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 69  f]);..  if( iPgi
12050 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74  dx>=n ){.    pIt
12060 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
12070 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  t = pIter->pLeaf
12080 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b  ->nn+1;.  }else{
12090 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  .    int nExtra;
120a0 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66  .    iPgidx += f
120b0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
120c0 61 5b 69 50 67 69 64 78 5d 2c 20 6e 45 78 74 72  a[iPgidx], nExtr
120d0 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
120e0 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69  EndofDoclist = i
120f0 54 65 72 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61  TermOff + nExtra
12100 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69  ;.  }.  pIter->i
12110 50 67 69 64 78 4f 66 66 20 3d 20 69 50 67 69 64  PgidxOff = iPgid
12120 78 3b 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65  x;..  fts5SegIte
12130 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49  rLoadRowid(p, pI
12140 74 65 72 29 3b 0a 20 20 66 74 73 35 53 65 67 49  ter);.  fts5SegI
12150 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
12160 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Iter);.}..static
12170 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 66   sqlite3_stmt *f
12180 74 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74  ts5IdxSelectStmt
12190 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
121a0 20 20 69 66 28 20 70 2d 3e 70 49 64 78 53 65 6c    if( p->pIdxSel
121b0 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74  ect==0 ){.    Ft
121c0 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
121d0 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
121e0 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65      fts5IndexPre
121f0 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e  pareStmt(p, &p->
12200 70 49 64 78 53 65 6c 65 63 74 2c 20 73 71 6c 69  pIdxSelect, sqli
12210 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
12220 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 70         "SELECT p
12230 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27 25  gno FROM '%q'.'%
12240 71 5f 69 64 78 27 20 57 48 45 52 45 20 22 0a 20  q_idx' WHERE ". 
12250 20 20 20 20 20 20 20 20 20 22 73 65 67 69 64 3d           "segid=
12260 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52  ? AND term<=? OR
12270 44 45 52 20 42 59 20 74 65 72 6d 20 44 45 53 43  DER BY term DESC
12280 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20   LIMIT 1",.     
12290 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
122a0 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
122b0 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20  e.    ));.  }.  
122c0 72 65 74 75 72 6e 20 70 2d 3e 70 49 64 78 53 65  return p->pIdxSe
122d0 6c 65 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  lect;.}../*.** I
122e0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62  nitialize the ob
122f0 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f  ject pIter to po
12300 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72  int to term pTer
12310 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73  m/nTerm within s
12320 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20  egment.** pSeg. 
12330 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
12340 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
12350 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72 61  index, the itera
12360 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f  tor is set to EO
12370 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  F..**.** If an e
12380 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
12390 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
123a0 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
123b0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
123c0 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
123d0 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
123e0 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
123f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12400 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
12410 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12420 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
12430 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
12440 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12450 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
12460 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  ackend */.  cons
12470 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
12480 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
12490 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a  erm to seek to *
124a0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
124d0 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61  TS5INDEX_XXX fla
124e0 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  gs */.  Fts5Stru
124f0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
12500 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  eg,     /* Descr
12510 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e  iption of segmen
12520 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
12530 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
12540 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
12550 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
12560 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20 31  ){.  int iPg = 1
12570 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28 66  ;.  int bGe = (f
12580 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
12590 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20  _QUERY_SCAN);.  
125a0 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b 20  int bDlidx = 0; 
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
125d0 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
125e0 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dex */.  sqlite3
125f0 5f 73 74 6d 74 20 2a 70 49 64 78 53 65 6c 65 63  _stmt *pIdxSelec
12600 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  t = 0;..  assert
12610 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61  ( bGe==0 || (fla
12620 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
12630 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b  UERY_DESC)==0 );
12640 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d  .  assert( pTerm
12650 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d   && nTerm );.  m
12660 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
12670 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
12680 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d  .  pIter->pSeg =
12690 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54 68 69   pSeg;..  /* Thi
126a0 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74 61  s block sets sta
126b0 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67 20  ck variable iPg 
126c0 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  to the leaf page
126d0 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 79   number that may
126e0 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65  .  ** contain te
126f0 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  rm (pTerm/nTerm)
12700 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
12710 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  nt in the segmen
12720 74 2e 20 2a 2f 0a 20 20 70 49 64 78 53 65 6c 65  t. */.  pIdxSele
12730 63 74 20 3d 20 66 74 73 35 49 64 78 53 65 6c 65  ct = fts5IdxSele
12740 63 74 53 74 6d 74 28 70 29 3b 0a 20 20 69 66 28  ctStmt(p);.  if(
12750 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
12760 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
12770 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c 20  int(pIdxSelect, 
12780 31 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29  1, pSeg->iSegid)
12790 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
127a0 5f 62 6c 6f 62 28 70 49 64 78 53 65 6c 65 63 74  _blob(pIdxSelect
127b0 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  , 2, pTerm, nTer
127c0 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  m, SQLITE_STATIC
127d0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
127e0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
127f0 70 28 70 49 64 78 53 65 6c 65 63 74 29 20 29 7b  p(pIdxSelect) ){
12800 0a 20 20 20 20 69 36 34 20 76 61 6c 20 3d 20 73  .    i64 val = s
12810 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
12820 74 28 70 49 64 78 53 65 6c 65 63 74 2c 20 30 29  t(pIdxSelect, 0)
12830 3b 0a 20 20 20 20 69 50 67 20 3d 20 28 69 6e 74  ;.    iPg = (int
12840 29 28 76 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62  )(val>>1);.    b
12850 44 6c 69 64 78 20 3d 20 28 76 61 6c 20 26 20 30  Dlidx = (val & 0
12860 78 30 30 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d  x0001);.  }.  p-
12870 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
12880 73 65 74 28 70 49 64 78 53 65 6c 65 63 74 29 3b  set(pIdxSelect);
12890 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
128a0 6e 75 6c 6c 28 70 49 64 78 53 65 6c 65 63 74 2c  null(pIdxSelect,
128b0 20 32 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c   2);..  if( iPg<
128c0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
128d0 29 7b 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65  ){.    iPg = pSe
128e0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20  g->pgnoFirst;.  
128f0 20 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20    bDlidx = 0;.  
12900 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  }..  pIter->iLea
12910 66 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b  fPgno = iPg - 1;
12920 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  .  fts5SegIterNe
12930 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
12940 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
12950 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73  pLeaf ){.    fts
12960 35 4c 65 61 66 53 65 65 6b 28 70 2c 20 62 47 65  5LeafSeek(p, bGe
12970 2c 20 70 49 74 65 72 2c 20 70 54 65 72 6d 2c 20  , pIter, pTerm, 
12980 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69  nTerm);.  }..  i
12990 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
129a0 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29 7b  _OK && bGe==0 ){
129b0 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
129c0 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
129d0 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
129e0 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
129f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
12a00 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
12a10 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
12a20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
12a30 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
12a40 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
12a50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44 6c   }.      if( bDl
12a60 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66  idx ){.        f
12a70 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c  ts5SegIterLoadDl
12a80 69 64 78 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  idx(p, pIter);. 
12a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12aa0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
12ab0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
12ac0 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
12ad0 49 74 65 72 52 65 76 65 72 73 65 28 70 2c 20 70  IterReverse(p, p
12ae0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
12af0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
12b00 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 70  SegIterSetNext(p
12b10 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  , pIter);..  /* 
12b20 45 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a  Either:.  **.  *
12b30 2a 20 20 20 31 29 20 61 6e 20 65 72 72 6f 72 20  *   1) an error 
12b40 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 6f 72  has occurred, or
12b50 0a 20 20 2a 2a 20 20 20 32 29 20 74 68 65 20 69  .  **   2) the i
12b60 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
12b70 6f 20 45 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20  o EOF, or.  **  
12b80 20 33 29 20 74 68 65 20 69 74 65 72 61 74 6f 72   3) the iterator
12b90 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
12ba0 74 72 79 20 77 69 74 68 20 74 65 72 6d 20 28 70  try with term (p
12bb0 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a  Term/nTerm), or.
12bc0 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20 46 54    **   4) the FT
12bd0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
12be0 41 4e 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  AN flag was set 
12bf0 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f 72  and the iterator
12c00 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20   points.  **    
12c10 20 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69    to an entry wi
12c20 74 68 20 61 20 74 65 72 6d 20 67 72 65 61 74 65  th a term greate
12c30 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
12c40 74 6f 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  to (pTerm/nTerm)
12c50 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12c60 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
12c70 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
12ca0 2a 2f 0a 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e  */.   || pIter->
12cb0 70 4c 65 61 66 3d 3d 30 20 20 20 20 20 20 20 20  pLeaf==0        
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20         /* 2 */. 
12cf0 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43    || fts5BufferC
12d00 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65  ompareBlob(&pIte
12d10 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20  r->term, pTerm, 
12d20 6e 54 65 72 6d 29 3d 3d 30 20 20 20 20 20 20 20  nTerm)==0       
12d30 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c     /* 3 */.   ||
12d40 20 28 62 47 65 20 26 26 20 66 74 73 35 42 75 66   (bGe && fts5Buf
12d50 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
12d60 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
12d70 72 6d 2c 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f  rm, nTerm)>0)  /
12d80 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f  * 4 */.  );.}../
12d90 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
12da0 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72  the object pIter
12db0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72   to point to ter
12dc0 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69  m pTerm/nTerm wi
12dd0 74 68 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  thin the.** in-m
12de0 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
12df0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
12e00 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68   such term in th
12e10 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 74 68  e hash-table, th
12e20 65 20 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69  e .** iterator i
12e30 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a  s set to EOF..**
12e40 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
12e50 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
12e60 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
12e70 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
12e80 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
12e90 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
12ea0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
12eb0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12ec0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
12ed0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
12ee0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
12ef0 65 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a  egIterHashInit(.
12f00 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
12f30 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  d */.  const u8 
12f40 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
12f50 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
12f60 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69  o seek to */.  i
12f70 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
12f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12f90 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e  * Mask of FTS5IN
12fa0 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  DEX_XXX flags */
12fb0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
12fc0 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
12fd0 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
12fe0 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
12ff0 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74   const u8 *pList
13000 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73   = 0;.  int nLis
13010 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  t = 0;.  const u
13020 38 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20  8 *z = 0;.  int 
13030 6e 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  n = 0;..  assert
13040 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20  ( p->pHash );.  
13050 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
13060 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
13070 66 28 20 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28  f( pTerm==0 || (
13080 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
13090 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 20 29 7b  X_QUERY_SCAN) ){
130a0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
130b0 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
130c0 49 6e 69 74 28 70 2d 3e 70 48 61 73 68 2c 20 28  Init(p->pHash, (
130d0 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72  const char*)pTer
130e0 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73  m, nTerm);.    s
130f0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
13100 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68  anEntry(p->pHash
13110 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  , (const char**)
13120 26 7a 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  &z, &pList, &nLi
13130 73 74 29 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20  st);.    n = (z 
13140 3f 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63  ? (int)strlen((c
13150 6f 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20  onst char*)z) : 
13160 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
13170 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
13180 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
13190 45 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74  ETERM;.    sqlit
131a0 65 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28  e3Fts5HashQuery(
131b0 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
131c0 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
131d0 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
131e0 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54  ist);.    z = pT
131f0 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65  erm;.    n = nTe
13200 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rm;.  }..  if( p
13210 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35  List ){.    Fts5
13220 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
13230 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
13240 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
13250 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a  Iter->term, n, z
13260 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
13270 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
13280 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
13290 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
132a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
132b0 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38    pLeaf->p = (u8
132c0 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65  *)pList;.    pLe
132d0 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e  af->nn = pLeaf->
132e0 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a  szLeaf = nList;.
132f0 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
13300 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49   = pLeaf;.    pI
13310 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
13320 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
13330 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a  (pLeaf->p, (u64*
13340 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
13350 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  ;.    pIter->iEn
13360 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65  dofDoclist = pLe
13370 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28  af->nn;..    if(
13380 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
13390 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
133a0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  .      pIter->fl
133b0 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
133c0 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  TER_REVERSE;.   
133d0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
133e0 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
133f0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c   pIter);.    }el
13400 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  se{.      fts5Se
13410 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
13420 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
13430 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
13440 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65  rSetNext(p, pIte
13450 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72  r);.}../*.** Zer
13460 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  o the iterator p
13470 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
13480 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
13490 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
134a0 65 67 49 74 65 72 43 6c 65 61 72 28 46 74 73 35  egIterClear(Fts5
134b0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
134c0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
134d0 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b  e(&pIter->term);
134e0 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
134f0 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
13500 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
13510 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74  ase(pIter->pNext
13520 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69  Leaf);.  fts5Dli
13530 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72  dxIterFree(pIter
13540 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c  ->pDlidx);.  sql
13550 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
13560 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a  >aRowidOffset);.
13570 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
13580 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
13590 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64  gIter));.}..#ifd
135a0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
135b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
135c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
135d0 70 61 72 74 20 6f 66 20 74 68 65 20 62 69 67 20  part of the big 
135e0 61 73 73 65 72 74 28 29 20 70 72 6f 63 65 64 75  assert() procedu
135f0 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  re implemented b
13600 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d  y.** fts5AssertM
13610 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 29 2e  ultiIterSetup().
13620 20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61 74   It ensures that
13630 20 74 68 65 20 72 65 73 75 6c 74 20 63 75 72 72   the result curr
13640 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20  ently stored.** 
13650 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65 20  in *pRes is the 
13660 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f  correct result o
13670 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  f comparing the 
13680 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
13690 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  s of the.** two 
136a0 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
136b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
136c0 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
136d0 73 75 6c 74 28 0a 20 20 46 74 73 35 49 74 65 72  sult(.  Fts5Iter
136e0 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35   *pIter, .  Fts5
136f0 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46  SegIter *p1,.  F
13700 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a  ts5SegIter *p2,.
13710 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
13720 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20  Res.){.  int i1 
13730 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53  = p1 - pIter->aS
13740 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70  eg;.  int i2 = p
13750 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  2 - pIter->aSeg;
13760 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61  ..  if( p1->pLea
13770 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29  f || p2->pLeaf )
13780 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c  {.    if( p1->pL
13790 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
137a0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
137b0 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20  irst==i2 );.    
137c0 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
137d0 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
137e0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
137f0 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20  irst==i1 );.    
13800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
13810 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e   nMin = MIN(p1->
13820 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d  term.n, p2->term
13830 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  .n);.      int r
13840 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e  es = memcmp(p1->
13850 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d  term.p, p2->term
13860 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20  .p, nMin);.     
13870 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
13880 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d  s = p1->term.n -
13890 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20   p2->term.n;..  
138a0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
138b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
138c0 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
138d0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
138e0 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64  sert( p1->iRowid
138f0 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a  !=p2->iRowid );.
13900 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 28          res = ((
13910 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d  p1->iRowid > p2-
13920 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
13930 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b  >bRev) ? -1 : 1;
13940 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
13960 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29  es->bTermEq==0 )
13970 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13980 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
13990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
139a0 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29  es->iFirst==i1 )
139b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
139c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
139d0 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20  Res->iFirst==i2 
139e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
139f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
13a00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
13a10 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51   no-op unless SQ
13a20 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
13a30 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20  fined when this 
13a40 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d  module.** is com
13a50 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63  piled. In that c
13a60 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ase, this functi
13a70 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c  on is essentiall
13a80 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a  y an assert() .*
13a90 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  * statement used
13aa0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
13ab0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
13ac0 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73  the pIter->aFirs
13ad0 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  t[] array.** are
13ae0 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61   correct..*/.sta
13af0 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73  tic void fts5Ass
13b00 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
13b10 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  p(Fts5Index *p, 
13b20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
13b30 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
13b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13b50 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 46 69  Fts5SegIter *pFi
13b60 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  rst = &pIter->aS
13b70 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
13b80 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
13b90 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61     int i;..    a
13ba0 73 73 65 72 74 28 20 28 70 46 69 72 73 74 2d 3e  ssert( (pFirst->
13bb0 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
13bc0 2d 3e 62 61 73 65 2e 62 45 6f 66 20 29 3b 0a 0a  ->base.bEof );..
13bd0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
13be0 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  t pIter->iSwitch
13bf0 52 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f 72  Rowid is set cor
13c00 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66  rectly. */.    f
13c10 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
13c20 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
13c30 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13c40 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
13c50 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  g[i];.      asse
13c60 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20 0a  rt( p1==pFirst .
13c70 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31             || p1
13c80 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20  ->pLeaf==0 .    
13c90 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42 75         || fts5Bu
13ca0 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46 69  fferCompare(&pFi
13cb0 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e  rst->term, &p1->
13cc0 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20 20  term) .         
13cd0 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d    || p1->iRowid=
13ce0 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  =pIter->iSwitchR
13cf0 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20 20  owid.           
13d00 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70  || (p1->iRowid<p
13d10 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13d20 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
13d30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
13d40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13d50 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d  pIter->nSeg; i+=
13d60 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
13d70 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
13d80 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
13d90 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13da0 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p2 = &pIter->aSe
13db0 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74  g[i+1];.      Ft
13dc0 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
13dd0 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
13de0 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20  [(pIter->nSeg + 
13df0 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66  i) / 2];.      f
13e00 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
13e10 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
13e20 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
13e30 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
13e40 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53  =1; i<(pIter->nS
13e50 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a  eg / 2); i+=2){.
13e60 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
13e70 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  r *p1 = &pIter->
13e80 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
13e90 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20  rst[i*2].iFirst 
13ea0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
13eb0 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
13ec0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
13ed0 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46  aFirst[i*2+1].iF
13ee0 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74  irst ];.      Ft
13ef0 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
13f00 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
13f10 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41  [i];.      fts5A
13f20 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
13f30 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c  esult(pIter, p1,
13f40 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20   p2, pRes);.    
13f50 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
13f60 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65 72  define fts5Asser
13f70 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
13f80 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x,y).#endif../*.
13f90 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  ** Do the compar
13fa0 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74  ison necessary t
13fb0 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72  o populate pIter
13fc0 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a  ->aFirst[iOut]..
13fd0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74  **.** If the ret
13fe0 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e  urned value is n
13ff0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
14000 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
14010 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20   an entry.** in 
14020 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  the pIter->aSeg[
14030 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20  ] array that is 
14040 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20  (a) not at EOF, 
14050 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67  and (b) pointing
14060 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61  .** to a key tha
14070 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  t is a duplicate
14080 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67   of another, hig
14090 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a  her priority, .*
140a0 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74  * segment-iterat
140b0 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e  or in the pSeg->
140c0 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aSeg[] array..*/
140d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
140e0 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
140f0 72 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  re(Fts5Iter *pIt
14100 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20  er, int iOut){. 
14110 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20   int i1;        
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14130 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66   /* Index of lef
14140 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
14150 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20  er */.  int i2; 
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14180 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46   of right-hand F
14190 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
141a0 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35  int iRes;.  Fts5
141b0 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20  SegIter *p1;    
141c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
141d0 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  eft-hand Fts5Seg
141e0 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65  Iter */.  Fts5Se
141f0 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20  gIter *p2;      
14200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
14210 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ht-hand Fts5SegI
14220 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65  ter */.  Fts5CRe
14230 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
14240 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
14250 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f  ];..  assert( iO
14260 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26  ut<pIter->nSeg &
14270 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73  & iOut>0 );.  as
14280 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65  sert( pIter->bRe
14290 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62  v==0 || pIter->b
142a0 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28  Rev==1 );..  if(
142b0 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e   iOut>=(pIter->n
142c0 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31  Seg/2) ){.    i1
142d0 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72   = (iOut - pIter
142e0 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20  ->nSeg/2) * 2;. 
142f0 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a     i2 = i1 + 1;.
14300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20    }else{.    i1 
14310 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
14320 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a  iOut*2].iFirst;.
14330 20 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e      i2 = pIter->
14340 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d  aFirst[iOut*2+1]
14350 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70  .iFirst;.  }.  p
14360 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
14370 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49  [i1];.  p2 = &pI
14380 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a  ter->aSeg[i2];..
14390 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20    pRes->bTermEq 
143a0 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70  = 0;.  if( p1->p
143b0 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20  Leaf==0 ){      
143c0 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73       /* If p1 is
143d0 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69   at EOF */.    i
143e0 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73  Res = i2;.  }els
143f0 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d  e if( p2->pLeaf=
14400 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20  =0 ){     /* If 
14410 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  p2 is at EOF */.
14420 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20      iRes = i1;. 
14430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
14440 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72  res = fts5Buffer
14450 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72  Compare(&p1->ter
14460 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20  m, &p2->term);. 
14470 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
14480 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
14490 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73  2>i1 );.      as
144a0 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20  sert( i2!=0 );. 
144b0 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d       pRes->bTerm
144c0 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  Eq = 1;.      if
144d0 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32  ( p1->iRowid==p2
144e0 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
144f0 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70      p1->bDel = p
14500 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20  2->bDel;.       
14510 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20   return i2;.    
14520 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
14530 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70  ((p1->iRowid > p
14540 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  2->iRowid)==pIte
14550 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20  r->bRev) ? -1 : 
14560 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  +1;.    }.    as
14570 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a  sert( res!=0 );.
14580 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
14590 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 31  .      iRes = i1
145a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
145b0 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
145c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d    }.  }..  pRes-
145d0 3e 69 46 69 72 73 74 20 3d 20 28 75 31 36 29 69  >iFirst = (u16)i
145e0 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  Res;.  return 0;
145f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
14600 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74  he seg-iter so t
14610 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
14620 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
14630 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67   on page iLeafPg
14640 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  no..** It is an 
14650 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c  error if leaf iL
14660 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74  eafPgno does not
14670 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
14680 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f  ns no rowids..*/
14690 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
146a0 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65  5SegIterGotoPage
146b0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
146c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
146d0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
146e0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
146f0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
14700 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
14710 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
14720 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
14730 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61  iLeafPgno.){.  a
14740 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f  ssert( iLeafPgno
14750 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
14760 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61  o );..  if( iLea
14770 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65  fPgno>pIter->pSe
14780 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
14790 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
147a0 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65  CORRUPT;.  }else
147b0 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  {.    fts5DataRe
147c0 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65  lease(pIter->pNe
147d0 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  xtLeaf);.    pIt
147e0 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20  er->pNextLeaf = 
147f0 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  0;.    pIter->iL
14800 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
14810 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53  gno-1;.    fts5S
14820 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
14830 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73  , pIter);.    as
14840 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
14850 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d  ITE_OK || pIter-
14860 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61  >iLeafPgno==iLea
14870 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66  fPgno );..    if
14880 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14890 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
148a0 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38 20 2a  iOff;.      u8 *
148b0 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
148c0 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ->p;.      int n
148d0 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
148e0 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20  >szLeaf;..      
148f0 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
14900 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 49 74  irstRowidOff(pIt
14910 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
14920 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
14930 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  iOff>=n ){.     
14940 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
14950 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
14960 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
14970 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
14980 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
14990 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
149a0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  id);.        pIt
149b0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
149c0 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
149d0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
149e0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
149f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
14a10 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
14a20 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
14a30 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74  ond argument unt
14a40 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a  il it is at or .
14a50 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46  ** past rowid iF
14a60 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20  rom. Regardless 
14a70 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
14a80 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61  iFrom, the itera
14a90 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73  tor is.** always
14aa0 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61   advanced at lea
14ab0 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  st once..*/.stat
14ac0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
14ad0 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
14ae0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14b00 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
14b10 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
14b20 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
14b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
14b40 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
14b50 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63  e */.  i64 iMatc
14b60 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
14b70 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
14b80 65 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65  e iterator at le
14b90 61 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a  ast this far */.
14ba0 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20  ){.  int bRev = 
14bb0 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
14bc0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
14bd0 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69  ERSE);.  Fts5Dli
14be0 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
14bf0 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a   pIter->pDlidx;.
14c00 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20    int iLeafPgno 
14c10 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
14c20 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20  no;.  int bMove 
14c30 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
14c40 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
14c50 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
14c60 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ERM );.  assert(
14c70 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29   pIter->pDlidx )
14c80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
14c90 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69  r->pLeaf );..  i
14ca0 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20  f( bRev==0 ){.  
14cb0 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c    while( !fts5Dl
14cc0 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
14cd0 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3e  lidx) && iMatch>
14ce0 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
14cf0 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20  id(pDlidx) ){.  
14d00 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
14d10 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
14d20 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  o(pDlidx);.     
14d30 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
14d40 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20  xt(p, pDlidx);. 
14d50 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 5f     }.    assert_
14d60 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70  nc( iLeafPgno>=p
14d70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
14d80 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20  || p->rc );.    
14d90 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  if( iLeafPgno>pI
14da0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
14db0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
14dc0 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70  terGotoPage(p, p
14dd0 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29  Iter, iLeafPgno)
14de0 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20  ;.      bMove = 
14df0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
14e00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
14e10 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d  ter->pNextLeaf==
14e20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
14e30 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69   iMatch<pIter->i
14e40 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69  Rowid );.    whi
14e50 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74  le( !fts5DlidxIt
14e60 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
14e70 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35 44   && iMatch<fts5D
14e80 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
14e90 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 66  lidx) ){.      f
14ea0 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
14eb0 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20  (p, pDlidx);.   
14ec0 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f   }.    iLeafPgno
14ed0 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
14ee0 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
14ef0 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44     assert( fts5D
14f00 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
14f10 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50  Dlidx) || iLeafP
14f20 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno<=pIter->iLea
14f30 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66  fPgno );..    if
14f40 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65  ( iLeafPgno<pIte
14f50 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
14f60 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
14f70 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
14f80 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35  no+1;.      fts5
14f90 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
14fa0 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
14fb0 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30  .      bMove = 0
14fc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
14fd0 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76 65  o{.    if( bMove
14fe0 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
14ff0 45 5f 4f 4b 20 29 20 70 49 74 65 72 2d 3e 78 4e  E_OK ) pIter->xN
15000 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29  ext(p, pIter, 0)
15010 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
15020 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61  >pLeaf==0 ) brea
15030 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d  k;.    if( bRev=
15040 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
15050 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
15060 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65  eak;.    if( bRe
15070 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69  v!=0 && pIter->i
15080 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20  Rowid<=iMatch ) 
15090 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65  break;.    bMove
150a0 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20   = 1;.  }while( 
150b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
150c0 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72   );.}.../*.** Fr
150d0 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ee the iterator 
150e0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
150f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
15100 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
15110 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
15120 65 72 46 72 65 65 28 46 74 73 35 49 74 65 72 20  erFree(Fts5Iter 
15130 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
15140 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  Iter ){.    int 
15150 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
15160 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
15170 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  ++){.      fts5S
15180 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49 74  egIterClear(&pIt
15190 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20  er->aSeg[i]);.  
151a0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
151b0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 49 74  ctureRelease(pIt
151c0 65 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20  er->pStruct);.  
151d0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
151e0 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
151f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15200 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ree(pIter);.  }.
15210 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
15220 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
15230 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65  nced(.  Fts5Inde
15240 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
15250 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
15260 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
15270 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
15280 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
152a0 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70  * Iterator to up
152b0 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72  date aFirst[] ar
152c0 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ray for */.  int
152d0 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20   iChanged,      
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
152f0 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65  Index of sub-ite
15300 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e  rator just advan
15310 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69  ced */.  int iMi
15320 6e 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  nset            
15330 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69           /* Mini
15340 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69  mum entry in aFi
15350 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a  rst[] to set */.
15360 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
15370 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67  r(i=(pIter->nSeg
15380 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e  +iChanged)/2; i>
15390 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72  =iMinset && p->r
153a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d  c==SQLITE_OK; i=
153b0 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45  i/2){.    int iE
153c0 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45 71 20  q;.    if( (iEq 
153d0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  = fts5MultiIterD
153e0 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20  oCompare(pIter, 
153f0 69 29 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73  i)) ){.      Fts
15400 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
15410 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 45   &pIter->aSeg[iE
15420 71 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  q];.      assert
15430 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15440 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67  OK );.      pSeg
15450 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
15460 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70   0);.      i = p
15470 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71  Iter->nSeg + iEq
15480 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15490 2a 0a 2a 2a 20 53 75 62 2d 69 74 65 72 61 74 6f  *.** Sub-iterato
154a0 72 20 69 43 68 61 6e 67 65 64 20 6f 66 20 69 74  r iChanged of it
154b0 65 72 61 74 6f 72 20 70 49 74 65 72 20 68 61 73  erator pIter has
154c0 20 6a 75 73 74 20 62 65 65 6e 20 61 64 76 61 6e   just been advan
154d0 63 65 64 2e 20 49 74 20 73 74 69 6c 6c 0a 2a 2a  ced. It still.**
154e0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
154f0 61 6d 65 20 74 65 72 6d 20 74 68 6f 75 67 68 20  ame term though 
15500 2d 20 6a 75 73 74 20 61 20 64 69 66 66 65 72 65  - just a differe
15510 6e 74 20 72 6f 77 69 64 2e 20 54 68 69 73 20 66  nt rowid. This f
15520 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d  unction.** attem
15530 70 74 73 20 74 6f 20 75 70 64 61 74 65 20 74 68  pts to update th
15540 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
15550 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
15560 5d 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  ] accordingly..*
15570 2a 20 49 66 20 69 74 20 64 6f 65 73 20 73 6f 20  * If it does so 
15580 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 30 20  successfully, 0 
15590 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
155a0 65 72 77 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  erwise 1..**.** 
155b0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  If non-zero is r
155c0 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c  eturned, the cal
155d0 6c 65 72 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  ler should call 
155e0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
155f0 61 6e 63 65 64 28 29 0a 2a 2a 20 6f 6e 20 74 68  anced().** on th
15600 65 20 69 74 65 72 61 74 6f 72 20 69 6e 73 74 65  e iterator inste
15610 61 64 2e 20 54 68 61 74 20 66 75 6e 63 74 69 6f  ad. That functio
15620 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  n does the same 
15630 61 73 20 74 68 69 73 20 6f 6e 65 2c 20 65 78 63  as this one, exc
15640 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 64  ept.** that it d
15650 65 61 6c 73 20 77 69 74 68 20 6d 6f 72 65 20 63  eals with more c
15660 6f 6d 70 6c 69 63 61 74 65 64 20 63 61 73 65 73  omplicated cases
15670 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74   as well..*/ .st
15680 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
15690 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77  tiIterAdvanceRow
156a0 69 64 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a  id(.  Fts5Iter *
156b0 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
156c0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
156d0 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72  r to update aFir
156e0 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a  st[] array for *
156f0 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64  /.  int iChanged
15700 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15710 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
15720 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73  sub-iterator jus
15730 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20  t advanced */.  
15740 46 74 73 35 53 65 67 49 74 65 72 20 2a 2a 70 70  Fts5SegIter **pp
15750 46 69 72 73 74 0a 29 7b 0a 20 20 46 74 73 35 53  First.){.  Fts5S
15760 65 67 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26  egIter *pNew = &
15770 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61  pIter->aSeg[iCha
15780 6e 67 65 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e  nged];..  if( pN
15790 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65  ew->iRowid==pIte
157a0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a  r->iSwitchRowid.
157b0 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f     || (pNew->iRo
157c0 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74  wid<pIter->iSwit
157d0 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  chRowid)==pIter-
157e0 3e 62 52 65 76 0a 20 20 29 7b 0a 20 20 20 20 69  >bRev.  ){.    i
157f0 6e 74 20 69 3b 0a 20 20 20 20 46 74 73 35 53 65  nt i;.    Fts5Se
15800 67 49 74 65 72 20 2a 70 4f 74 68 65 72 20 3d 20  gIter *pOther = 
15810 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68  &pIter->aSeg[iCh
15820 61 6e 67 65 64 20 5e 20 30 78 30 30 30 31 5d 3b  anged ^ 0x0001];
15830 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69  .    pIter->iSwi
15840 74 63 68 52 6f 77 69 64 20 3d 20 70 49 74 65 72  tchRowid = pIter
15850 2d 3e 62 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53  ->bRev ? SMALLES
15860 54 5f 49 4e 54 36 34 20 3a 20 4c 41 52 47 45 53  T_INT64 : LARGES
15870 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72  T_INT64;.    for
15880 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b  (i=(pIter->nSeg+
15890 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20  iChanged)/2; 1; 
158a0 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20 46 74  i=i/2){.      Ft
158b0 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
158c0 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
158d0 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  [i];..      asse
158e0 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20  rt( pNew->pLeaf 
158f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15900 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d   pRes->bTermEq==
15910 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65  0 || pOther->pLe
15920 61 66 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  af );..      if(
15930 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29   pRes->bTermEq )
15940 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  {.        if( pN
15950 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68  ew->iRowid==pOth
15960 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  er->iRowid ){.  
15970 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
15980 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
15990 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f  if( (pOther->iRo
159a0 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64  wid>pNew->iRowid
159b0 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29  )==pIter->bRev )
159c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
159d0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
159e0 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  = pOther->iRowid
159f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
15a00 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20 20 20   = pOther;.     
15a10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
15a20 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74  ther->iRowid>pIt
15a30 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
15a40 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29  )==pIter->bRev )
15a50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
15a60 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
15a70 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  = pOther->iRowid
15a80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15a90 20 20 7d 0a 20 20 20 20 20 20 70 52 65 73 2d 3e    }.      pRes->
15aa0 69 46 69 72 73 74 20 3d 20 28 75 31 36 29 28 70  iFirst = (u16)(p
15ab0 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65  New - pIter->aSe
15ac0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  g);.      if( i=
15ad0 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =1 ) break;..   
15ae0 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74     pOther = &pIt
15af0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
15b00 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30  >aFirst[i ^ 0x00
15b10 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  01].iFirst ];.  
15b20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 46 69    }.  }..  *ppFi
15b30 72 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65  rst = pNew;.  re
15b40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
15b50 20 53 65 74 20 74 68 65 20 70 49 74 65 72 2d 3e   Set the pIter->
15b60 62 45 6f 66 20 76 61 72 69 61 62 6c 65 20 62 61  bEof variable ba
15b70 73 65 64 20 6f 6e 20 74 68 65 20 73 74 61 74 65  sed on the state
15b80 20 6f 66 20 74 68 65 20 73 75 62 2d 69 74 65 72   of the sub-iter
15b90 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ators..*/.static
15ba0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
15bb0 74 65 72 53 65 74 45 6f 66 28 46 74 73 35 49 74  terSetEof(Fts5It
15bc0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74  er *pIter){.  Ft
15bd0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
15be0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
15bf0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
15c00 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70 49 74  .iFirst ];.  pIt
15c10 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20  er->base.bEof = 
15c20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a  pSeg->pLeaf==0;.
15c30 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
15c40 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
15c50 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  owid;.}../*.** M
15c60 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ove the iterator
15c70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
15c80 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ry. .**.** If an
15c90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
15ca0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
15cb0 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65  left in Fts5Inde
15cc0 78 2e 72 63 2e 20 49 74 20 69 73 20 6e 6f 74 20  x.rc. It is not 
15cd0 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
15ce0 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
15cf0 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
15d00 45 4f 46 2c 20 6f 72 20 69 66 20 69 74 20 69 73  EOF, or if it is
15d10 20 61 6c 72 65 61 64 79 20 61 74 20 0a 2a 2a 20   already at .** 
15d20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66 75  EOF when this fu
15d30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15d40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15d50 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
15d60 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  xt(.  Fts5Index 
15d70 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20  *p, .  Fts5Iter 
15d80 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46  *pIter,.  int bF
15d90 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rom,            
15da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15db0 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46  e if argument iF
15dc0 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rom is valid */.
15dd0 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20    i64 iFrom     
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20    /* Advance at 
15e00 6c 65 61 73 74 20 61 73 20 66 61 72 20 61 73 20  least as far as 
15e10 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  this */.){.  int
15e20 20 62 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f   bUseFrom = bFro
15e30 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  m;.  assert( pIt
15e40 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30  er->base.bEof==0
15e50 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
15e60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15e70 0a 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20  .    int iFirst 
15e80 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
15e90 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69  1].iFirst;.    i
15ea0 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b  nt bNewTerm = 0;
15eb0 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
15ec0 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
15ed0 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20  >aSeg[iFirst];. 
15ee0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
15ef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
15f00 20 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20     if( bUseFrom 
15f10 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20  && pSeg->pDlidx 
15f20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
15f30 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20  IterNextFrom(p, 
15f40 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20  pSeg, iFrom);.  
15f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15f60 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53  Seg->xNext(p, pS
15f70 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a  eg, &bNewTerm);.
15f80 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
15f90 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c  Seg->pLeaf==0 ||
15fa0 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20   bNewTerm .     
15fb0 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  || fts5MultiIter
15fc0 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 49 74  AdvanceRowid(pIt
15fd0 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70 53 65  er, iFirst, &pSe
15fe0 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  g).    ){.      
15ff0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
16000 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20  anced(p, pIter, 
16010 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20  iFirst, 1);.    
16020 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53    fts5MultiIterS
16030 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20  etEof(pIter);.  
16040 20 20 20 20 70 53 65 67 20 3d 20 26 70 49 74 65      pSeg = &pIte
16050 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61  r->aSeg[pIter->a
16060 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
16070 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67  ;.      if( pSeg
16080 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74  ->pLeaf==0 ) ret
16090 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  urn;.    }..    
160a0 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
160b0 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65  terSetup(p, pIte
160c0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
160d0 70 53 65 67 3d 3d 26 70 49 74 65 72 2d 3e 61 53  pSeg==&pIter->aS
160e0 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74  eg[pIter->aFirst
160f0 5b 31 5d 2e 69 46 69 72 73 74 5d 20 26 26 20 70  [1].iFirst] && p
16100 53 65 67 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20  Seg->pLeaf );.  
16110 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 53 6b    if( pIter->bSk
16120 69 70 45 6d 70 74 79 3d 3d 30 20 7c 7c 20 70 53  ipEmpty==0 || pS
16130 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20 20 20  eg->nPos ){.    
16140 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74    pIter->xSetOut
16150 70 75 74 73 28 70 49 74 65 72 2c 20 70 53 65 67  puts(pIter, pSeg
16160 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
16170 0a 20 20 20 20 7d 0a 20 20 20 20 62 55 73 65 46  .    }.    bUseF
16180 72 6f 6d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  rom = 0;.  }.}..
16190 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
161a0 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28 0a  MultiIterNext2(.
161b0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
161c0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
161d0 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77  er,.  int *pbNew
161e0 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
161f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72        /* OUT: Tr
16200 75 65 20 69 66 20 2a 6d 69 67 68 74 2a 20 62 65  ue if *might* be
16210 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a   new term */.){.
16220 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
16230 3e 62 53 6b 69 70 45 6d 70 74 79 20 29 3b 0a 20  >bSkipEmpty );. 
16240 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 62  TE_OK ){.    *pb
16260 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
16270 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20 69   do{.      int i
16280 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61  First = pIter->a
16290 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b  First[1].iFirst;
162a0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
162b0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
162c0 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b  r->aSeg[iFirst];
162d0 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
162e0 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  erm = 0;..      
162f0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
16300 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
16310 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c    pSeg->xNext(p,
16320 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d   pSeg, &bNewTerm
16330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
16340 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62  g->pLeaf==0 || b
16350 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20  NewTerm .       
16360 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  || fts5MultiIter
16370 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 49 74  AdvanceRowid(pIt
16380 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70 53 65  er, iFirst, &pSe
16390 67 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  g).      ){.    
163a0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
163b0 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74  rAdvanced(p, pIt
163c0 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a  er, iFirst, 1);.
163d0 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
163e0 69 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65  iIterSetEof(pIte
163f0 72 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e  r);.        *pbN
16400 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
16410 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73    }.      fts5As
16420 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
16430 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  up(p, pIter);.. 
16440 20 20 20 7d 77 68 69 6c 65 28 20 66 74 73 35 4d     }while( fts5M
16450 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
16460 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d  p, pIter) );.  }
16470 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16480 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
16490 74 73 5f 4e 6f 6f 70 28 46 74 73 35 49 74 65 72  ts_Noop(Fts5Iter
164a0 20 2a 70 55 6e 75 73 65 64 31 2c 20 46 74 73 35   *pUnused1, Fts5
164b0 53 65 67 49 74 65 72 20 2a 70 55 6e 75 73 65 64  SegIter *pUnused
164c0 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
164d0 41 4d 32 28 70 55 6e 75 73 65 64 31 2c 20 70 55  AM2(pUnused1, pU
164e0 6e 75 73 65 64 32 29 3b 0a 7d 0a 0a 73 74 61 74  nused2);.}..stat
164f0 69 63 20 46 74 73 35 49 74 65 72 20 2a 66 74 73  ic Fts5Iter *fts
16500 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
16510 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
16540 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
16550 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  thin */.  int nS
16560 65 67 0a 29 7b 0a 20 20 46 74 73 35 49 74 65 72  eg.){.  Fts5Iter
16570 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53   *pNew;.  int nS
16580 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  lot;            
16590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77            /* Pow
165a0 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65  er of two >= nSe
165b0 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f  g */..  for(nSlo
165c0 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b  t=2; nSlot<nSeg;
165d0 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b   nSlot=nSlot*2);
165e0 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64  .  pNew = fts5Id
165f0 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20  xMalloc(p, .    
16600 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49 74 65    sizeof(Fts5Ite
16610 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  r) +            
16620 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f        /* pNew */
16630 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
16640 73 35 53 65 67 49 74 65 72 29 20 2a 20 28 6e 53  s5SegIter) * (nS
16650 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e  lot-1) +   /* pN
16660 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20  ew->aSeg[] */.  
16670 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43      sizeof(Fts5C
16680 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20  Result) * nSlot 
16690 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d          /* pNew-
166a0 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29  >aFirst[] */.  )
166b0 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
166c0 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d      pNew->nSeg =
166d0 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77   nSlot;.    pNew
166e0 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35  ->aFirst = (Fts5
166f0 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e  CResult*)&pNew->
16700 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20  aSeg[nSlot];.   
16710 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20   pNew->pIndex = 
16720 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 78 53 65  p;.    pNew->xSe
16730 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49  tOutputs = fts5I
16740 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
16750 6f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  op;.  }.  return
16760 20 70 4e 65 77 3b 0a 7d 0a 0a 73 74 61 74 69 63   pNew;.}..static
16770 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73   void fts5Poslis
16780 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  tCallback(.  Fts
16790 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c  5Index *pUnused,
167a0 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65   .  void *pConte
167b0 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  xt, .  const u8 
167c0 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
167d0 75 6e 6b 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  unk.){.  UNUSED_
167e0 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a  PARAM(pUnused);.
167f0 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68    assert_nc( nCh
16800 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unk>=0 );.  if( 
16810 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  nChunk>0 ){.    
16820 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
16830 70 65 6e 64 42 6c 6f 62 28 28 46 74 73 35 42 75  pendBlob((Fts5Bu
16840 66 66 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20  ffer*)pContext, 
16850 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b  pChunk, nChunk);
16860 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20  .  }.}..typedef 
16870 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61  struct PoslistCa
16880 6c 6c 62 61 63 6b 43 74 78 20 50 6f 73 6c 69 73  llbackCtx Poslis
16890 74 43 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74  tCallbackCtx;.st
168a0 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c  ruct PoslistCall
168b0 62 61 63 6b 43 74 78 20 7b 0a 20 20 46 74 73 35  backCtx {.  Fts5
168c0 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
168d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
168e0 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75  ppend to this bu
168f0 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f  ffer */.  Fts5Co
16900 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20  lset *pColset;  
16910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16920 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f  trict matches to
16930 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   this column */.
16940 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16960 20 20 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a    /* See above *
16970 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  /.};..typedef st
16980 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66 73  ruct PoslistOffs
16990 65 74 73 43 74 78 20 50 6f 73 6c 69 73 74 4f 66  etsCtx PoslistOf
169a0 66 73 65 74 73 43 74 78 3b 0a 73 74 72 75 63 74  fsetsCtx;.struct
169b0 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43   PoslistOffsetsC
169c0 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65  tx {.  Fts5Buffe
169d0 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20  r *pBuf;        
169e0 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64         /* Append
169f0 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20   to this buffer 
16a00 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
16a10 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20  *pColset;       
16a20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
16a30 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69 73   matches to this
16a40 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
16a50 20 69 52 65 61 64 3b 0a 20 20 69 6e 74 20 69 57   iRead;.  int iW
16a60 72 69 74 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  rite;.};../*.** 
16a70 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20  TODO: Make this 
16a80 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a  more efficient!.
16a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
16aa0 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
16ab0 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43  t(Fts5Colset *pC
16ac0 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29  olset, int iCol)
16ad0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
16ae0 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d  (i=0; i<pColset-
16af0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
16b00 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69   if( pColset->ai
16b10 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72  Col[i]==iCol ) r
16b20 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
16b30 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
16b40 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c  ic void fts5Posl
16b50 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61  istOffsetsCallba
16b60 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ck(.  Fts5Index 
16b70 2a 70 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69  *pUnused, .  voi
16b80 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20  d *pContext, .  
16b90 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b  const u8 *pChunk
16ba0 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a  , int nChunk.){.
16bb0 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73    PoslistOffsets
16bc0 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73  Ctx *pCtx = (Pos
16bd0 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 2a 29  listOffsetsCtx*)
16be0 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53  pContext;.  UNUS
16bf0 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64  ED_PARAM(pUnused
16c00 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20  );.  assert_nc( 
16c10 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69  nChunk>=0 );.  i
16c20 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  f( nChunk>0 ){. 
16c30 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
16c40 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e    while( i<nChun
16c50 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  k ){.      int i
16c60 56 61 6c 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  Val;.      i += 
16c70 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
16c80 26 70 43 68 75 6e 6b 5b 69 5d 2c 20 69 56 61 6c  &pChunk[i], iVal
16c90 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 2b 3d  );.      iVal +=
16ca0 20 70 43 74 78 2d 3e 69 52 65 61 64 20 2d 20 32   pCtx->iRead - 2
16cb0 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 69 52  ;.      pCtx->iR
16cc0 65 61 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20  ead = iVal;.    
16cd0 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 43    if( fts5IndexC
16ce0 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e  olsetTest(pCtx->
16cf0 70 43 6f 6c 73 65 74 2c 20 69 56 61 6c 29 20 29  pColset, iVal) )
16d00 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
16d10 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
16d20 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75 66 2c  rint(pCtx->pBuf,
16d30 20 69 56 61 6c 20 2b 20 32 20 2d 20 70 43 74 78   iVal + 2 - pCtx
16d40 2d 3e 69 57 72 69 74 65 29 3b 0a 20 20 20 20 20  ->iWrite);.     
16d50 20 20 20 70 43 74 78 2d 3e 69 57 72 69 74 65 20     pCtx->iWrite 
16d60 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  = iVal;.      }.
16d70 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
16d80 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73  tic void fts5Pos
16d90 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61  listFilterCallba
16da0 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ck(.  Fts5Index 
16db0 2a 70 55 6e 75 73 65 64 2c 0a 20 20 76 6f 69 64  *pUnused,.  void
16dc0 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63   *pContext, .  c
16dd0 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
16de0 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
16df0 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
16e00 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73  Ctx *pCtx = (Pos
16e10 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 2a  listCallbackCtx*
16e20 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55  )pContext;.  UNU
16e30 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65  SED_PARAM(pUnuse
16e40 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28  d);.  assert_nc(
16e50 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20   nChunk>=0 );.  
16e60 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a  if( nChunk>0 ){.
16e70 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
16e80 72 6f 75 67 68 20 74 6f 20 66 69 6e 64 20 74 68  rough to find th
16e90 65 20 66 69 72 73 74 20 76 61 72 69 6e 74 20 77  e first varint w
16ea0 69 74 68 20 76 61 6c 75 65 20 31 2e 20 54 68 69  ith value 1. Thi
16eb0 73 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  s is the.    ** 
16ec0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
16ed0 74 20 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20  t columns hits. 
16ee0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30  */.    int i = 0
16ef0 3b 0a 20 20 20 20 69 6e 74 20 69 53 74 61 72 74  ;.    int iStart
16f00 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
16f10 43 74 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29  Ctx->eState==2 )
16f20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
16f30 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74  ;.      fts5Fast
16f40 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75  GetVarint32(pChu
16f50 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20  nk, i, iCol);.  
16f60 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65      if( fts5Inde
16f70 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78  xColsetTest(pCtx
16f80 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29  ->pColset, iCol)
16f90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78   ){.        pCtx
16fa0 2d 3e 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20  ->eState = 1;.  
16fb0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
16fc0 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
16fd0 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b  (pCtx->pBuf, 1);
16fe0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16ff0 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
17000 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  te = 0;.      }.
17010 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a      }..    do {.
17020 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e        while( i<n
17030 43 68 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b  Chunk && pChunk[
17040 69 5d 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20  i]!=0x01 ){.    
17050 20 20 20 20 77 68 69 6c 65 28 20 70 43 68 75 6e      while( pChun
17060 6b 5b 69 5d 20 26 20 30 78 38 30 20 29 20 69 2b  k[i] & 0x80 ) i+
17070 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  +;.        i++;.
17080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17090 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29  ( pCtx->eState )
170a0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
170b0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
170c0 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26  ob(pCtx->pBuf, &
170d0 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20  pChunk[iStart], 
170e0 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  i-iStart);.     
170f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e   }.      if( i<n
17100 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Chunk ){.       
17110 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
17120 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20     iStart = i;. 
17130 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
17140 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e      if( i>=nChun
17150 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  k ){.          p
17160 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b  Ctx->eState = 2;
17170 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17180 20 20 20 20 20 20 20 20 20 20 66 74 73 35 46 61            fts5Fa
17190 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 43  stGetVarint32(pC
171a0 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a  hunk, i, iCol);.
171b0 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e            pCtx->
171c0 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64  eState = fts5Ind
171d0 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74  exColsetTest(pCt
171e0 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c  x->pColset, iCol
171f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
17200 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b   pCtx->eState ){
17210 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
17220 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
17230 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66  dBlob(pCtx->pBuf
17240 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74  , &pChunk[iStart
17250 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20  ], i-iStart);.  
17260 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74            iStart
17270 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
17280 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17290 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
172a0 69 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a  i<nChunk );.  }.
172b0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
172c0 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
172d0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65     /* Index obje
17300 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
17310 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20  ter *pSeg,      
17320 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69          /* Posli
17330 73 74 20 6f 66 20 74 68 69 73 20 69 74 65 72 61  st of this itera
17340 74 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  tor */.  void *p
17350 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
17360 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
17370 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  ext pointer for 
17380 78 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20  xChunk callback 
17390 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75  */.  void (*xChu
173a0 6e 6b 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  nk)(Fts5Index*, 
173b0 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a  void*, const u8*
173c0 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20  , int).){.  int 
173d0 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f  nRem = pSeg->nPo
173e0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  s;          /* N
173f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 73  umber of bytes s
17400 74 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a  till to come */.
17410 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
17420 61 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68  a = 0;.  u8 *pCh
17430 75 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  unk = &pSeg->pLe
17440 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
17450 66 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20  fOffset];.  int 
17460 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65  nChunk = MIN(nRe
17470 6d 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  m, pSeg->pLeaf->
17480 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69  szLeaf - pSeg->i
17490 4c 65 61 66 4f 66 66 73 65 74 29 3b 0a 20 20 69  LeafOffset);.  i
174a0 6e 74 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  nt pgno = pSeg->
174b0 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  iLeafPgno;.  int
174c0 20 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a   pgnoSave = 0;..
174d0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
174e0 6f 6e 20 64 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b  on does notmwork
174f0 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e   with detail=non
17500 65 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a  e databases. */.
17510 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
17520 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46  nfig->eDetail!=F
17530 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
17540 29 3b 0a 0a 20 20 69 66 28 20 28 70 53 65 67 2d  );..  if( (pSeg-
17550 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
17560 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d  GITER_REVERSE)==
17570 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76  0 ){.    pgnoSav
17580 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a  e = pgno+1;.  }.
17590 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
175a0 20 20 20 78 43 68 75 6e 6b 28 70 2c 20 70 43 74     xChunk(p, pCt
175b0 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e  x, pChunk, nChun
175c0 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20  k);.    nRem -= 
175d0 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35  nChunk;.    fts5
175e0 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
175f0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 6d  a);.    if( nRem
17600 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  <=0 ){.      bre
17610 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
17620 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20       pgno++;.   
17630 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 4c     pData = fts5L
17640 65 61 66 52 65 61 64 28 70 2c 20 46 54 53 35 5f  eafRead(p, FTS5_
17650 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
17660 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  eg->pSeg->iSegid
17670 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
17680 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 20 62  if( pData==0 ) b
17690 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 68 75  reak;.      pChu
176a0 6e 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34  nk = &pData->p[4
176b0 5d 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b 20  ];.      nChunk 
176c0 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74  = MIN(nRem, pDat
176d0 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a  a->szLeaf - 4);.
176e0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
176f0 70 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20 20  pgnoSave ){.    
17700 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
17710 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
17720 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e  ;.        pSeg->
17730 70 4e 65 78 74 4c 65 61 66 20 3d 20 70 44 61 74  pNextLeaf = pDat
17740 61 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61  a;.        pData
17750 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
17760 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
17770 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
17780 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
17790 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
177a0 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69  y (not EOF). Thi
177b0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
177c0 70 65 6e 64 73 20 74 68 65 20 70 6f 73 69 74 69  pends the positi
177d0 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72  on list data for
177e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
177f0 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20  ry to.** buffer 
17800 70 42 75 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f  pBuf. It does no
17810 74 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  t make a copy of
17820 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
17830 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64  st size.** field
17840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17850 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
17860 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
17870 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 49 74   *p,.  Fts5SegIt
17880 65 72 20 2a 70 53 65 67 2c 0a 20 20 46 74 73 35  er *pSeg,.  Fts5
17890 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
178a0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
178b0 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Buf.){.  if( 0==
178c0 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
178d0 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65  p->rc, pBuf, pSe
178e0 67 2d 3e 6e 50 6f 73 29 20 29 7b 0a 20 20 20 20  g->nPos) ){.    
178f0 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29  if( pColset==0 )
17900 7b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e  {.      fts5Chun
17910 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
17920 2c 20 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66  , (void*)pBuf, f
17930 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ts5PoslistCallba
17940 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ck);.    }else{.
17950 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f        if( p->pCo
17960 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
17970 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20  TS5_DETAIL_FULL 
17980 29 7b 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69  ){.        Posli
17990 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 73 43  stCallbackCtx sC
179a0 74 78 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78  tx;.        sCtx
179b0 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20  .pBuf = pBuf;.  
179c0 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73        sCtx.pCols
179d0 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20  et = pColset;.  
179e0 20 20 20 20 20 20 73 43 74 78 2e 65 53 74 61 74        sCtx.eStat
179f0 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  e = fts5IndexCol
17a00 73 65 74 54 65 73 74 28 70 43 6f 6c 73 65 74 2c  setTest(pColset,
17a10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
17a20 65 72 74 28 20 73 43 74 78 2e 65 53 74 61 74 65  ert( sCtx.eState
17a30 3d 3d 30 20 7c 7c 20 73 43 74 78 2e 65 53 74 61  ==0 || sCtx.eSta
17a40 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  te==1 );.       
17a50 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
17a60 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64  e(p, pSeg, (void
17a70 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73  *)&sCtx, fts5Pos
17a80 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61  listFilterCallba
17a90 63 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ck);.      }else
17aa0 7b 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73  {.        Poslis
17ab0 74 4f 66 66 73 65 74 73 43 74 78 20 73 43 74 78  tOffsetsCtx sCtx
17ac0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
17ad0 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  (&sCtx, 0, sizeo
17ae0 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20 20 20  f(sCtx));.      
17af0 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42    sCtx.pBuf = pB
17b00 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78  uf;.        sCtx
17b10 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73  .pColset = pCols
17b20 65 74 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  et;.        fts5
17b30 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20  ChunkIterate(p, 
17b40 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43  pSeg, (void*)&sC
17b50 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 4f  tx, fts5PoslistO
17b60 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 29 3b  ffsetsCallback);
17b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17b80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f   }.}../*.** IN/O
17b90 55 54 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  UT parameter (*p
17ba0 61 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70  a) points to a p
17bb0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62  osition list n b
17bc0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66  ytes in size. If
17bd0 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  .** the position
17be0 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65   list contains e
17bf0 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d  ntries for colum
17c00 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70  n iCol, then (*p
17c10 61 29 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20  a) is set.** to 
17c20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 75 62  point to the sub
17c30 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66  -position-list f
17c40 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  or that column a
17c50 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
17c60 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 69 74 20  .** bytes in it 
17c70 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
17c80 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f   the argument po
17c90 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73  sition list does
17ca0 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20   not.** contain 
17cb0 61 6e 79 20 65 6e 74 72 69 65 73 20 66 6f 72 20  any entries for 
17cc0 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74  column iCol, ret
17cd0 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
17ce0 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78   int fts5IndexEx
17cf0 74 72 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73  tractCol(.  cons
17d00 74 20 75 38 20 2a 2a 70 61 2c 20 20 20 20 20 20  t u8 **pa,      
17d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17d20 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  N/OUT: Pointer t
17d30 6f 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69  o poslist */.  i
17d40 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17d60 2a 20 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f  * IN: Size of po
17d70 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  slist in bytes *
17d80 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
17db0 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 6f   extract from po
17dc0 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  slist */.){.  in
17dd0 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17df0 20 41 6e 79 74 68 69 6e 67 20 62 65 66 6f 72 65   Anything before
17e00 20 74 68 65 20 66 69 72 73 74 20 30 78 30 31 20   the first 0x01 
17e10 69 73 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f  is col 0 */.  co
17e20 6e 73 74 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b  nst u8 *p = *pa;
17e30 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e  .  const u8 *pEn
17e40 64 20 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20  d = &p[n];      
17e50 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70     /* One byte p
17e60 61 73 74 20 65 6e 64 20 6f 66 20 70 6f 73 69 74  ast end of posit
17e70 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 77  ion list */..  w
17e80 68 69 6c 65 28 20 69 43 6f 6c 3e 69 43 75 72 72  hile( iCol>iCurr
17e90 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64  ent ){.    /* Ad
17ea0 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20  vance pointer p 
17eb0 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
17ec0 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78  to pEnd or an 0x
17ed0 30 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a  01 byte that is.
17ee0 20 20 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20      ** not part 
17ef0 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 4e 6f 74  of a varint. Not
17f00 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  e that it is not
17f10 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
17f20 6e 65 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20  negative.    ** 
17f30 6f 72 20 65 78 74 72 65 6d 65 6c 79 20 6c 61 72  or extremely lar
17f40 67 65 20 76 61 72 69 6e 74 20 74 6f 20 6f 63 63  ge varint to occ
17f50 75 72 20 77 69 74 68 69 6e 20 61 6e 20 75 6e 63  ur within an unc
17f60 6f 72 72 75 70 74 65 64 20 70 6f 73 69 74 69 6f  orrupted positio
17f70 6e 20 0a 20 20 20 20 2a 2a 20 6c 69 73 74 2e 20  n .    ** list. 
17f80 53 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  So the last byte
17f90 20 6f 66 20 65 61 63 68 20 76 61 72 69 6e 74 20   of each varint 
17fa0 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
17fb0 6f 20 68 61 76 65 20 61 20 63 6c 65 61 72 0a 20  o have a clear. 
17fc0 20 20 20 2a 2a 20 30 78 38 30 20 62 69 74 2e 20     ** 0x80 bit. 
17fd0 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 2a   */.    while( *
17fe0 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20  p!=0x01 ){.     
17ff0 20 77 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30   while( *p++ & 0
18000 78 38 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  x80 );.      if(
18010 20 70 3e 3d 70 45 6e 64 20 29 20 72 65 74 75 72   p>=pEnd ) retur
18020 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  n 0;.    }.    *
18030 70 61 20 3d 20 70 2b 2b 3b 0a 20 20 20 20 69 43  pa = p++;.    iC
18040 75 72 72 65 6e 74 20 3d 20 2a 70 2b 2b 3b 0a 20  urrent = *p++;. 
18050 20 20 20 69 66 28 20 69 43 75 72 72 65 6e 74 20     if( iCurrent 
18060 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20  & 0x80 ){.      
18070 70 2d 2d 3b 0a 20 20 20 20 20 20 70 20 2b 3d 20  p--;.      p += 
18080 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
18090 70 2c 20 69 43 75 72 72 65 6e 74 29 3b 0a 20 20  p, iCurrent);.  
180a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 43    }.  }.  if( iC
180b0 6f 6c 21 3d 69 43 75 72 72 65 6e 74 20 29 20 72  ol!=iCurrent ) r
180c0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
180d0 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70  dvance pointer p
180e0 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
180f0 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30   to pEnd or an 0
18100 78 30 31 20 62 79 74 65 20 74 68 61 74 20 69 73  x01 byte that is
18110 0a 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f  .  ** not part o
18120 66 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  f a varint */.  
18130 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26  while( p<pEnd &&
18140 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20   *p!=0x01 ){.   
18150 20 77 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30   while( *p++ & 0
18160 78 38 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  x80 );.  }..  re
18170 74 75 72 6e 20 70 20 2d 20 28 2a 70 61 29 3b 0a  turn p - (*pa);.
18180 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
18190 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
181a0 6f 6c 73 65 74 28 0a 20 20 69 6e 74 20 2a 70 52  olset(.  int *pR
181b0 63 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  c,.  Fts5Colset 
181c0 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
181d0 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74       /* Colset t
181e0 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20  o filter on */. 
181f0 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 2c   const u8 *pPos,
18200 20 69 6e 74 20 6e 50 6f 73 2c 20 20 20 20 20 20   int nPos,      
18210 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73   /* Position lis
18220 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
18230 72 20 2a 70 42 75 66 20 20 20 20 20 20 20 20 20  r *pBuf         
18240 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
18250 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
18260 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
18270 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
18280 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
18290 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20 20 20  Zero(pBuf);.    
182a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73  for(i=0; i<pCols
182b0 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  et->nCol; i++){.
182c0 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
182d0 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20  pSub = pPos;.   
182e0 20 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 66 74     int nSub = ft
182f0 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
18300 6c 28 26 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70  l(&pSub, nPos, p
18310 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d  Colset->aiCol[i]
18320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 75  );.      if( nSu
18330 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  b ){.        fts
18340 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
18350 62 28 70 52 63 2c 20 70 42 75 66 2c 20 6e 53 75  b(pRc, pBuf, nSu
18360 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 20 20  b, pSub);.      
18370 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
18380 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73  *.** xSetOutputs
18390 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62   callback used b
183a0 79 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61  y detail=none ta
183b0 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
183c0 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
183d0 4f 75 74 70 75 74 73 5f 4e 6f 6e 65 28 46 74 73  Outputs_None(Fts
183e0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
183f0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
18400 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
18410 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66  r->pIndex->pConf
18420 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
18430 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
18440 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69  .  pIter->base.i
18450 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
18460 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62  owid;.  pIter->b
18470 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67  ase.nData = pSeg
18480 2d 3e 6e 50 6f 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->nPos;.}../*.**
18490 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c   xSetOutputs cal
184a0 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 64 65  lback used by de
184b0 74 61 69 6c 3d 66 75 6c 6c 20 61 6e 64 20 64 65  tail=full and de
184c0 74 61 69 6c 3d 63 6f 6c 20 74 61 62 6c 65 73 20  tail=col tables 
184d0 77 68 65 6e 20 6e 6f 0a 2a 2a 20 63 6f 6c 75 6d  when no.** colum
184e0 6e 20 66 69 6c 74 65 72 73 20 61 72 65 20 73 70  n filters are sp
184f0 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74  ecified..*/.stat
18500 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
18510 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c  SetOutputs_Nocol
18520 73 65 74 28 46 74 73 35 49 74 65 72 20 2a 70 49  set(Fts5Iter *pI
18530 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
18540 20 2a 70 53 65 67 29 7b 0a 20 20 70 49 74 65 72   *pSeg){.  pIter
18550 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
18560 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pSeg->iRowid;.  
18570 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
18580 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a  a = pSeg->nPos;.
18590 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
185a0 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69  ->pIndex->pConfi
185b0 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35  g->eDetail!=FTS5
185c0 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a  _DETAIL_NONE );.
185d0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
185e0 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 0a  >pColset==0 );..
185f0 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61    if( pSeg->iLea
18600 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50  fOffset+pSeg->nP
18610 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d  os<=pSeg->pLeaf-
18620 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f  >szLeaf ){.    /
18630 2a 20 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74  * All data is st
18640 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
18650 65 6e 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61  ent page. Popula
18660 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20  te the output . 
18670 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20     ** variables 
18680 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68  to point into th
18690 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61  e body of the pa
186a0 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  ge object. */.  
186b0 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
186c0 61 74 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  ata = &pSeg->pLe
186d0 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
186e0 66 4f 66 66 73 65 74 5d 3b 0a 20 20 7d 65 6c 73  fOffset];.  }els
186f0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61  e{.    /* The da
18700 74 61 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ta is distribute
18710 64 20 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f  d over two or mo
18720 72 65 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69  re pages. Copy i
18730 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  t into the.    *
18740 2a 20 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69  * Fts5Iter.posli
18750 73 74 20 62 75 66 66 65 72 20 61 6e 64 20 74 68  st buffer and th
18760 65 6e 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  en set the outpu
18770 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  t pointer to poi
18780 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  nt.    ** to thi
18790 73 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20  s buffer.  */.  
187a0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
187b0 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
187c0 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74  );.    fts5Segit
187d0 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d  erPoslist(pIter-
187e0 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 30  >pIndex, pSeg, 0
187f0 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
18800 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  t);.    pIter->b
18810 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
18820 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18830 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f  }.}../*.** xSetO
18840 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20  utputs callback 
18850 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 46 74  used when the Ft
18860 73 35 43 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20  s5Colset object 
18870 68 61 73 20 6e 43 6f 6c 3d 3d 30 20 28 6d 61 74  has nCol==0 (mat
18880 63 68 0a 2a 2a 20 61 67 61 69 6e 73 74 20 6e 6f  ch.** against no
18890 20 63 6f 6c 75 6d 6e 73 20 61 74 20 61 6c 6c 29   columns at all)
188a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
188b0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
188c0 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74 28 46  uts_ZeroColset(F
188d0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
188e0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
188f0 67 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g){.  UNUSED_PAR
18900 41 4d 28 70 53 65 67 29 3b 0a 20 20 70 49 74 65  AM(pSeg);.  pIte
18910 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20  r->base.nData = 
18920 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74  0;.}../*.** xSet
18930 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b  Outputs callback
18940 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d   used by detail=
18950 63 6f 6c 20 77 68 65 6e 20 74 68 65 72 65 20 69  col when there i
18960 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65  s a column filte
18970 72 0a 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61  r.** and there a
18980 72 65 20 31 30 30 20 6f 72 20 6d 6f 72 65 20 63  re 100 or more c
18990 6f 6c 75 6d 6e 73 2e 20 41 6c 73 6f 20 63 61 6c  olumns. Also cal
189a0 6c 65 64 20 61 73 20 61 20 66 61 6c 6c 62 61 63  led as a fallbac
189b0 6b 20 66 72 6f 6d 0a 2a 2a 20 66 74 73 35 49 74  k from.** fts5It
189c0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c  erSetOutputs_Col
189d0 31 30 30 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  100 if the colum
189e0 6e 2d 6c 69 73 74 20 73 70 61 6e 73 20 6d 6f 72  n-list spans mor
189f0 65 20 74 68 61 6e 20 6f 6e 65 20 70 61 67 65 2e  e than one page.
18a00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18a10 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
18a20 74 73 5f 43 6f 6c 28 46 74 73 35 49 74 65 72 20  ts_Col(Fts5Iter 
18a30 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
18a40 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 66 74  ter *pSeg){.  ft
18a50 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49  s5BufferZero(&pI
18a60 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
18a70 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
18a80 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
18a90 78 2c 20 70 53 65 67 2c 20 70 49 74 65 72 2d 3e  x, pSeg, pIter->
18aa0 70 43 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d  pColset, &pIter-
18ab0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 70 49 74  >poslist);.  pIt
18ac0 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
18ad0 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
18ae0 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
18af0 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
18b00 6c 69 73 74 2e 70 3b 0a 20 20 70 49 74 65 72 2d  list.p;.  pIter-
18b10 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49  >base.nData = pI
18b20 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a  ter->poslist.n;.
18b30 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
18b40 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
18b50 65 64 20 77 68 65 6e 3a 20 0a 2a 2a 0a 2a 2a 20  ed when: .**.** 
18b60 20 20 2a 20 64 65 74 61 69 6c 3d 63 6f 6c 2c 0a    * detail=col,.
18b70 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 69 73 20  **   * there is 
18b80 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2c  a column filter,
18b90 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20   and.**   * the 
18ba0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31  table contains 1
18bb0 30 30 20 6f 72 20 66 65 77 65 72 20 63 6f 6c 75  00 or fewer colu
18bc0 6d 6e 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mns. .**.** The 
18bd0 6c 61 73 74 20 70 6f 69 6e 74 20 69 73 20 74 6f  last point is to
18be0 20 65 6e 73 75 72 65 20 61 6c 6c 20 63 6f 6c 75   ensure all colu
18bf0 6d 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73  mn numbers are s
18c00 74 6f 72 65 64 20 61 73 20 0a 2a 2a 20 73 69 6e  tored as .** sin
18c10 67 6c 65 2d 62 79 74 65 20 76 61 72 69 6e 74 73  gle-byte varints
18c20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18c30 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
18c40 75 74 73 5f 43 6f 6c 31 30 30 28 46 74 73 35 49  uts_Col100(Fts5I
18c50 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
18c60 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
18c70 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
18c80 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69  ->pIndex->pConfi
18c90 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
18ca0 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20  _DETAIL_COLUMNS 
18cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
18cc0 65 72 2d 3e 70 43 6f 6c 73 65 74 20 29 3b 0a 0a  er->pColset );..
18cd0 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61    if( pSeg->iLea
18ce0 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50  fOffset+pSeg->nP
18cf0 6f 73 3e 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  os>pSeg->pLeaf->
18d00 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74  szLeaf ){.    ft
18d10 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18d20 5f 43 6f 6c 28 70 49 74 65 72 2c 20 70 53 65 67  _Col(pIter, pSeg
18d30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18d40 75 38 20 2a 61 20 3d 20 28 75 38 2a 29 26 70 53  u8 *a = (u8*)&pS
18d50 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
18d60 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
18d70 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
18d80 28 75 38 2a 29 26 61 5b 70 53 65 67 2d 3e 6e 50  (u8*)&a[pSeg->nP
18d90 6f 73 5d 3b 20 0a 20 20 20 20 69 6e 74 20 69 50  os]; .    int iP
18da0 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  rev = 0;.    int
18db0 20 2a 61 69 43 6f 6c 20 3d 20 70 49 74 65 72 2d   *aiCol = pIter-
18dc0 3e 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b  >pColset->aiCol;
18dd0 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 45  .    int *aiColE
18de0 6e 64 20 3d 20 26 61 69 43 6f 6c 5b 70 49 74 65  nd = &aiCol[pIte
18df0 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c  r->pColset->nCol
18e00 5d 3b 0a 0a 20 20 20 20 75 38 20 2a 61 4f 75 74  ];..    u8 *aOut
18e10 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
18e20 74 2e 70 3b 0a 20 20 20 20 69 6e 74 20 69 50 72  t.p;.    int iPr
18e30 65 76 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20  evOut = 0;..    
18e40 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77  pIter->base.iRow
18e50 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
18e60 64 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 61  d;..    while( a
18e70 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69  <pEnd ){.      i
18e80 50 72 65 76 20 2b 3d 20 28 69 6e 74 29 61 2b 2b  Prev += (int)a++
18e90 5b 30 5d 20 2d 20 32 3b 0a 20 20 20 20 20 20 77  [0] - 2;.      w
18ea0 68 69 6c 65 28 20 2a 61 69 43 6f 6c 3c 69 50 72  hile( *aiCol<iPr
18eb0 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 69  ev ){.        ai
18ec0 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Col++;.        i
18ed0 66 28 20 61 69 43 6f 6c 3d 3d 61 69 43 6f 6c 45  f( aiCol==aiColE
18ee0 6e 64 20 29 20 67 6f 74 6f 20 73 65 74 6f 75 74  nd ) goto setout
18ef0 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3b 0a 20 20  puts_col_out;.  
18f00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18f10 2a 61 69 43 6f 6c 3d 3d 69 50 72 65 76 20 29 7b  *aiCol==iPrev ){
18f20 0a 20 20 20 20 20 20 20 20 2a 61 4f 75 74 2b 2b  .        *aOut++
18f30 20 3d 20 28 75 38 29 28 28 69 50 72 65 76 20 2d   = (u8)((iPrev -
18f40 20 69 50 72 65 76 4f 75 74 29 20 2b 20 32 29 3b   iPrevOut) + 2);
18f50 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4f 75  .        iPrevOu
18f60 74 20 3d 20 69 50 72 65 76 3b 0a 20 20 20 20 20  t = iPrev;.     
18f70 20 7d 0a 20 20 20 20 7d 0a 0a 73 65 74 6f 75 74   }.    }..setout
18f80 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3a 0a 20 20  puts_col_out:.  
18f90 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
18fa0 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
18fb0 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70 49 74 65  list.p;.    pIte
18fc0 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20  r->base.nData = 
18fd0 61 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 70 6f  aOut - pIter->po
18fe0 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a  slist.p;.  }.}..
18ff0 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74  /*.** xSetOutput
19000 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  s callback used 
19010 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20 77  by detail=full w
19020 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
19030 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2e 0a 2a 2f  olumn filter..*/
19040 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19050 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
19060 46 75 6c 6c 28 46 74 73 35 49 74 65 72 20 2a 70  Full(Fts5Iter *p
19070 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
19080 72 20 2a 70 53 65 67 29 7b 0a 20 20 46 74 73 35  r *pSeg){.  Fts5
19090 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20  Colset *pColset 
190a0 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  = pIter->pColset
190b0 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
190c0 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
190d0 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  Rowid;..  assert
190e0 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
190f0 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
19100 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46  l==FTS5_DETAIL_F
19110 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ULL );.  assert(
19120 20 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69   pColset );..  i
19130 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
19140 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c  fset+pSeg->nPos<
19150 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a  =pSeg->pLeaf->sz
19160 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41  Leaf ){.    /* A
19170 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72 65  ll data is store
19180 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
19190 20 70 61 67 65 2e 20 50 6f 70 75 6c 61 74 65 20   page. Populate 
191a0 74 68 65 20 6f 75 74 70 75 74 20 0a 20 20 20 20  the output .    
191b0 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ** variables to 
191c0 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 62  point into the b
191d0 6f 64 79 20 6f 66 20 74 68 65 20 70 61 67 65 20  ody of the page 
191e0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 63  object. */.    c
191f0 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 26 70 53  onst u8 *a = &pS
19200 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
19210 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
19220 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74  .    if( pColset
19230 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20  ->nCol==1 ){.   
19240 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e     pIter->base.n
19250 44 61 74 61 20 3d 20 66 74 73 35 49 6e 64 65 78  Data = fts5Index
19260 45 78 74 72 61 63 74 43 6f 6c 28 26 61 2c 20 70  ExtractCol(&a, p
19270 53 65 67 2d 3e 6e 50 6f 73 2c 70 43 6f 6c 73 65  Seg->nPos,pColse
19280 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20  t->aiCol[0]);.  
19290 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
192a0 70 44 61 74 61 20 3d 20 61 3b 0a 20 20 20 20 7d  pData = a;.    }
192b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
192c0 2a 70 52 63 20 3d 20 26 70 49 74 65 72 2d 3e 70  *pRc = &pIter->p
192d0 49 6e 64 65 78 2d 3e 72 63 3b 0a 20 20 20 20 20  Index->rc;.     
192e0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
192f0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
19300 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65  ;.      fts5Inde
19310 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28 70  xExtractColset(p
19320 52 63 2c 20 70 43 6f 6c 73 65 74 2c 20 61 2c 20  Rc, pColset, a, 
19330 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74  pSeg->nPos, &pIt
19340 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
19350 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
19360 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  pData = pIter->p
19370 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 20 20  oslist.p;.      
19380 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
19390 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
193a0 73 74 2e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  st.n;.    }.  }e
193b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
193c0 64 61 74 61 20 69 73 20 64 69 73 74 72 69 62 75  data is distribu
193d0 74 65 64 20 6f 76 65 72 20 74 77 6f 20 6f 72 20  ted over two or 
193e0 6d 6f 72 65 20 70 61 67 65 73 2e 20 43 6f 70 79  more pages. Copy
193f0 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20   it into the.   
19400 20 2a 2a 20 46 74 73 35 49 74 65 72 2e 70 6f 73   ** Fts5Iter.pos
19410 6c 69 73 74 20 62 75 66 66 65 72 20 61 6e 64 20  list buffer and 
19420 74 68 65 6e 20 73 65 74 20 74 68 65 20 6f 75 74  then set the out
19430 70 75 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  put pointer to p
19440 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 74  oint.    ** to t
19450 68 69 73 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a  his buffer.  */.
19460 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
19470 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
19480 73 74 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67  st);.    fts5Seg
19490 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65  iterPoslist(pIte
194a0 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c  r->pIndex, pSeg,
194b0 20 70 43 6f 6c 73 65 74 2c 20 26 70 49 74 65 72   pColset, &pIter
194c0 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
194d0 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
194e0 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
194f0 73 74 2e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d  st.p;.    pIter-
19500 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49  >base.nData = pI
19510 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a  ter->poslist.n;.
19520 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
19530 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
19540 74 70 75 74 43 62 28 69 6e 74 20 2a 70 52 63 2c  tputCb(int *pRc,
19550 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
19560 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
19570 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19580 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
19590 66 69 67 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e  fig = pIter->pIn
195a0 64 65 78 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  dex->pConfig;.  
195b0 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65    if( pConfig->e
195c0 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
195d0 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
195e0 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74    pIter->xSetOut
195f0 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
19600 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6e 65 3b 0a  etOutputs_None;.
19610 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20      }..    else 
19620 69 66 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73  if( pIter->pCols
19630 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
19640 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
19650 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
19660 75 74 70 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 3b  utputs_Nocolset;
19670 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65  .    }..    else
19680 20 69 66 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c   if( pIter->pCol
19690 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 7b 0a  set->nCol==0 ){.
196a0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65        pIter->xSe
196b0 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49  tOutputs = fts5I
196c0 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 5a 65  terSetOutputs_Ze
196d0 72 6f 43 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a  roColset;.    }.
196e0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 43  .    else if( pC
196f0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
19700 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c  FTS5_DETAIL_FULL
19710 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
19720 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66  >xSetOutputs = f
19730 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
19740 73 5f 46 75 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20  s_Full;.    }.. 
19750 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 61     else{.      a
19760 73 73 65 72 74 28 20 70 43 6f 6e 66 69 67 2d 3e  ssert( pConfig->
19770 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
19780 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a  TAIL_COLUMNS );.
19790 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
197a0 67 2d 3e 6e 43 6f 6c 3c 3d 31 30 30 20 29 7b 0a  g->nCol<=100 ){.
197b0 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78          pIter->x
197c0 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
197d0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
197e0 43 6f 6c 31 30 30 3b 0a 20 20 20 20 20 20 20 20  Col100;.        
197f0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
19800 72 53 69 7a 65 28 70 52 63 2c 20 26 70 49 74 65  rSize(pRc, &pIte
19810 72 2d 3e 70 6f 73 6c 69 73 74 2c 20 70 43 6f 6e  r->poslist, pCon
19820 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20  fig->nCol);.    
19830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19840 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70   pIter->xSetOutp
19850 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65  uts = fts5IterSe
19860 74 4f 75 74 70 75 74 73 5f 43 6f 6c 3b 0a 20 20  tOutputs_Col;.  
19870 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19880 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
19890 74 65 20 61 20 6e 65 77 20 46 74 73 35 49 74 65  te a new Fts5Ite
198a0 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
198b0 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
198c0 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
198d0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64  terate through d
198e0 61 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65  ata in structure
198f0 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20   pStruct..** If 
19900 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74  iLevel is -ve, t
19910 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20  hen all data in 
19920 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20  all segments is 
19930 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69  merged. Or, if i
19940 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f  Level.** is zero
19950 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74   or greater, dat
19960 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  a from the first
19970 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e   nSegment segmen
19980 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76  ts on level iLev
19990 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e  el.** is merged.
199a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
199b0 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f  tor initially po
199c0 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
199d0 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74  t term/rowid ent
199e0 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74  ry in the .** it
199f0 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  erated data..*/.
19a00 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
19a10 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20  MultiIterNew(.  
19a20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
19a50 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
19a60 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  n */.  Fts5Struc
19a70 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20  ture *pStruct,  
19a80 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
19a90 75 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20  ure of specific 
19aa0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 66  index */.  int f
19ab0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
19ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
19ad0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58  S5INDEX_QUERY_XX
19ae0 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
19af0 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
19b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
19b10 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72  Colset to filter
19b20 20 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f   on (or NULL) */
19b30 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  .  const u8 *pTe
19b40 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  rm, int nTerm,  
19b50 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65     /* Term to se
19b60 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30  ek to (or NULL/0
19b70 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  ) */.  int iLeve
19b80 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
19b90 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
19ba0 74 6f 20 69 74 65 72 61 74 65 20 28 2d 31 20 66  to iterate (-1 f
19bb0 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  or all) */.  int
19bc0 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20   nSegment,      
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19be0 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
19bf0 74 73 20 74 6f 20 6d 65 72 67 65 20 28 69 4c 65  ts to merge (iLe
19c00 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73  vel>=0) */.  Fts
19c10 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  5Iter **ppOut   
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c30 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  New object */.){
19c40 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b  .  int nSeg = 0;
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19c70 73 65 67 6d 65 6e 74 2d 69 74 65 72 73 20 69 6e  segment-iters in
19c80 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49   use */.  int iI
19c90 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ter = 0;        
19ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a            /* */.
19cb0 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
19ce0 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67  rate through seg
19cf0 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53  ments */.  Fts5S
19d00 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
19d10 4c 76 6c 3b 0a 20 20 46 74 73 35 49 74 65 72 20  Lvl;.  Fts5Iter 
19d20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74  *pNew;..  assert
19d30 28 20 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e  ( (pTerm==0 && n
19d40 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76  Term==0) || iLev
19d50 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  el<0 );..  /* Al
19d60 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
19d70 20 74 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73   the new multi-s
19d80 65 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a  eg-iterator. */.
19d90 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19da0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
19db0 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20  ( iLevel<0 ){.  
19dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
19dd0 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66  uct->nSegment==f
19de0 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
19df0 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
19e00 74 29 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 67  t) );.      nSeg
19e10 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67   = pStruct->nSeg
19e20 6d 65 6e 74 3b 0a 20 20 20 20 20 20 6e 53 65 67  ment;.      nSeg
19e30 20 2b 3d 20 28 70 2d 3e 70 48 61 73 68 20 3f 20   += (p->pHash ? 
19e40 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  1 : 0);.    }els
19e50 65 7b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20  e{.      nSeg = 
19e60 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65  MIN(pStruct->aLe
19e70 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67  vel[iLevel].nSeg
19e80 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  , nSegment);.   
19e90 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20   }.  }.  *ppOut 
19ea0 3d 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c  = pNew = fts5Mul
19eb0 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e  tiIterAlloc(p, n
19ec0 53 65 67 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  Seg);.  if( pNew
19ed0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
19ee0 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21  pNew->bRev = (0!
19ef0 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  =(flags & FTS5IN
19f00 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29  DEX_QUERY_DESC))
19f10 3b 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45  ;.  pNew->bSkipE
19f20 6d 70 74 79 20 3d 20 28 30 21 3d 28 66 6c 61 67  mpty = (0!=(flag
19f30 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
19f40 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 29 29 3b  ERY_SKIPEMPTY));
19f50 0a 20 20 70 4e 65 77 2d 3e 70 53 74 72 75 63 74  .  pNew->pStruct
19f60 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 70 4e   = pStruct;.  pN
19f70 65 77 2d 3e 70 43 6f 6c 73 65 74 20 3d 20 70 43  ew->pColset = pC
19f80 6f 6c 73 65 74 3b 0a 20 20 66 74 73 35 53 74 72  olset;.  fts5Str
19f90 75 63 74 75 72 65 52 65 66 28 70 53 74 72 75 63  uctureRef(pStruc
19fa0 74 29 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73  t);.  if( (flags
19fb0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
19fc0 52 59 5f 4e 4f 4f 55 54 50 55 54 29 3d 3d 30 20  RY_NOOUTPUT)==0 
19fd0 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53  ){.    fts5IterS
19fe0 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72  etOutputCb(&p->r
19ff0 63 2c 20 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  c, pNew);.  }.. 
1a000 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65   /* Initialize e
1a010 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  ach of the compo
1a020 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65  nent segment ite
1a030 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28  rators. */.  if(
1a040 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a050 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65  K ){.    if( iLe
1a060 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 46  vel<0 ){.      F
1a070 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
1a080 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74 72 75  l *pEnd = &pStru
1a090 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75  ct->aLevel[pStru
1a0a0 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20  ct->nLevel];.   
1a0b0 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20     if( p->pHash 
1a0c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ){.        /* Ad
1a0d0 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74 65 72  d a segment iter
1a0e0 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72  ator for the cur
1a0f0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
1a100 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
1a110 20 2a 2f 0a 20 20 20 20 20 20 20 20 46 74 73 35   */.        Fts5
1a120 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
1a130 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
1a140 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 66  er++];.        f
1a150 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
1a160 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65  it(p, pTerm, nTe
1a170 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72  rm, flags, pIter
1a180 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a190 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75   for(pLvl=&pStru
1a1a0 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70  ct->aLevel[0]; p
1a1b0 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b  Lvl<pEnd; pLvl++
1a1c0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
1a1d0 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31  Seg=pLvl->nSeg-1
1a1e0 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
1a1f0 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74  -){.          Ft
1a200 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1a210 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
1a220 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
1a230 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
1a240 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
1a250 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
1a260 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1a270 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20   pTerm==0 ){.   
1a280 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
1a290 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67  IterInit(p, pSeg
1a2a0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
1a2b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a2c0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1a2d0 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20 70 54  erSeekInit(p, pT
1a2e0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
1a2f0 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  s, pSeg, pIter);
1a300 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a330 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
1a340 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b  >aLevel[iLevel];
1a350 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d  .      for(iSeg=
1a360 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b  nSeg-1; iSeg>=0;
1a370 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20   iSeg--){.      
1a380 20 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69    fts5SegIterIni
1a390 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  t(p, &pLvl->aSeg
1a3a0 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61  [iSeg], &pNew->a
1a3b0 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20  Seg[iIter++]);. 
1a3c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a3d0 20 61 73 73 65 72 74 28 20 69 49 74 65 72 3d 3d   assert( iIter==
1a3e0 6e 53 65 67 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nSeg );.  }..  /
1a3f0 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 77  * If the above w
1a400 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65  as successful, e
1a410 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74  ach component it
1a420 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e  erators now poin
1a430 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ts .  ** to the 
1a440 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69  first entry in i
1a450 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74  ts segment. In t
1a460 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c  his case initial
1a470 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46  ize the .  ** aF
1a480 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72  irst[] array. Or
1a490 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  , if an error ha
1a4a0 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65  s occurred, free
1a4b0 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20   the iterator.  
1a4c0 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65  ** object and se
1a4d0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
1a4e0 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20  iable to NULL.  
1a4f0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
1a500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a510 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65 77 2d   for(iIter=pNew-
1a520 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72 3e 30  >nSeg-1; iIter>0
1a530 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20  ; iIter--){.    
1a540 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20    int iEq;.     
1a550 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35   if( (iEq = fts5
1a560 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
1a570 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29  re(pNew, iIter))
1a580 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
1a590 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
1a5a0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d  &pNew->aSeg[iEq]
1a5b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
1a5c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a5d0 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20   pSeg->xNext(p, 
1a5e0 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSeg, 0);.      
1a5f0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
1a600 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c  dvanced(p, pNew,
1a610 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a 20 20   iEq, iIter);.  
1a620 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a630 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
1a640 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 66  Eof(pNew);.    f
1a650 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
1a660 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65 77 29  erSetup(p, pNew)
1a670 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
1a680 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66  >bSkipEmpty && f
1a690 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d  ts5MultiIterIsEm
1a6a0 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a  pty(p, pNew) ){.
1a6b0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1a6c0 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c  terNext(p, pNew,
1a6d0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
1a6e0 65 20 69 66 28 20 70 4e 65 77 2d 3e 62 61 73 65  e if( pNew->base
1a6f0 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  .bEof==0 ){.    
1a700 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1a710 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  Seg = &pNew->aSe
1a720 67 5b 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31  g[pNew->aFirst[1
1a730 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  ].iFirst];.     
1a740 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74 70 75   pNew->xSetOutpu
1a750 74 73 28 70 4e 65 77 2c 20 70 53 65 67 29 3b 0a  ts(pNew, pSeg);.
1a760 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
1a770 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1a780 72 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  rFree(pNew);.   
1a790 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d   *ppOut = 0;.  }
1a7a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1a7b0 20 61 6e 20 46 74 73 35 49 74 65 72 20 74 68 61   an Fts5Iter tha
1a7c0 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
1a7d0 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74 20 70  gh the doclist p
1a7e0 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20 74 68  rovided.** as th
1a7f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1a800 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1a810 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
1a820 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ew2(.  Fts5Index
1a830 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1a840 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1a850 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
1a860 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
1a870 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c 20 20  s5Data *pData,  
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a890 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74 65 72   Doclist to iter
1a8a0 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  ate through */. 
1a8b0 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20   int bDesc,     
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64 65 73   /* True for des
1a8e0 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
1a8f0 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49 74 65  der */.  Fts5Ite
1a900 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20  r **ppOut       
1a910 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1a920 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
1a930 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20  ts5Iter *pNew;. 
1a940 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74   pNew = fts5Mult
1a950 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 32 29  iIterAlloc(p, 2)
1a960 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
1a970 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1a980 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
1a990 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20 70 49  aSeg[1];..    pI
1a9a0 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53  ter->flags = FTS
1a9b0 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
1a9c0 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  M;.    if( pData
1a9d0 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a 20 20  ->szLeaf>0 ){.  
1a9e0 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
1a9f0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
1aa00 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
1aa10 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
1aa20 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28 75 36  nt(pData->p, (u6
1aa30 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
1aa40 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  d);.      pIter-
1aa50 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
1aa60 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20 20 20   pData->nn;.    
1aa70 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31    pNew->aFirst[1
1aa80 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  ].iFirst = 1;.  
1aa90 20 20 20 20 69 66 28 20 62 44 65 73 63 20 29 7b      if( bDesc ){
1aaa0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 62  .        pNew->b
1aab0 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Rev = 1;.       
1aac0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
1aad0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
1aae0 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 66  VERSE;.        f
1aaf0 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
1ab00 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
1ab10 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
1ab20 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
1ab30 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
1ab40 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
1ab50 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30  .      pData = 0
1ab60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ab70 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45     pNew->base.bE
1ab80 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
1ab90 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74    fts5SegIterSet
1aba0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
1abb0 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e  .    *ppOut = pN
1abc0 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  ew;.  }..  fts5D
1abd0 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
1abe0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1abf0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
1ac00 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
1ac10 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  F or if an error
1ac20 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
1ac30 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  ** False otherwi
1ac40 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1ac50 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  t fts5MultiIterE
1ac60 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
1ac70 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
1ac80 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
1ac90 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 49  rc .      || (pI
1aca0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
1acb0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1acc0 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d  st ].pLeaf==0)==
1acd0 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66  pIter->base.bEof
1ace0 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20   .  );.  return 
1acf0 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
1ad00 3e 62 61 73 65 2e 62 45 6f 66 29 3b 0a 7d 0a 0a  >base.bEof);.}..
1ad10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ad20 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e   rowid of the en
1ad30 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65  try that the ite
1ad40 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  rator currently 
1ad50 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66  points.** to. If
1ad60 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
1ad70 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e  ints to EOF when
1ad80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1ad90 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20  s called the.** 
1ada0 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65  results are unde
1adb0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
1adc0 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74   i64 fts5MultiIt
1add0 65 72 52 6f 77 69 64 28 46 74 73 35 49 74 65 72  erRowid(Fts5Iter
1ade0 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
1adf0 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  rt( pIter->aSeg[
1ae00 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
1ae10 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
1ae20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74   );.  return pIt
1ae30 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
1ae40 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
1ae50 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  t ].iRowid;.}../
1ae60 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
1ae70 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
1ae80 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66  xt entry at or f
1ae90 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e  ollowing iMatch.
1aea0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1aeb0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
1aec0 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
1aed0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74  ex *p, .  Fts5It
1aee0 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36  er *pIter, .  i6
1aef0 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68  4 iMatch.){.  wh
1af00 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
1af10 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74  4 iRowid;.    ft
1af20 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
1af30 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61  p, pIter, 1, iMa
1af40 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74  tch);.    if( ft
1af50 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
1af60 2c 20 70 49 74 65 72 29 20 29 20 62 72 65 61 6b  , pIter) ) break
1af70 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66  ;.    iRowid = f
1af80 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
1af90 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  d(pIter);.    if
1afa0 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30  ( pIter->bRev==0
1afb0 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74   && iRowid>=iMat
1afc0 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
1afd0 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21  if( pIter->bRev!
1afe0 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d  =0 && iRowid<=iM
1aff0 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
1b000 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1b010 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1b020 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1b030 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f  ng the term asso
1b040 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1b050 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74  .** entry that t
1b060 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
1b070 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1b080 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1b090 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74   u8 *fts5MultiIt
1b0a0 65 72 54 65 72 6d 28 46 74 73 35 49 74 65 72 20  erTerm(Fts5Iter 
1b0b0 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
1b0c0 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
1b0d0 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  *p = &pIter->aSe
1b0e0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1b0f0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
1b100 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b  *pn = p->term.n;
1b110 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72  .  return p->ter
1b120 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  m.p;.}../*.** Al
1b130 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67  locate a new seg
1b140 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20  ment-id for the 
1b150 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
1b160 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65  t. The new segme
1b170 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62 65  nt.** id must be
1b180 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 36   between 1 and 6
1b190 35 33 33 35 20 69 6e 63 6c 75 73 69 76 65 2c 20  5335 inclusive, 
1b1a0 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  and must not be 
1b1b0 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20  used by .** any 
1b1c0 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 69  currently existi
1b1d0 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 61  ng segment. If a
1b1e0 20 66 72 65 65 20 73 65 67 6d 65 6e 74 20 69 64   free segment id
1b1f0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
1b200 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
1b210 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1b220 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1b230 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
1b240 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
1b250 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1b260 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  0 is .** returne
1b270 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
1b280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1b290 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
1b2a0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1b2b0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1b2c0 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 53 65  ruct){.  int iSe
1b2d0 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  gid = 0;..  if( 
1b2e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1b2f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72   ){.    if( pStr
1b300 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46  uct->nSegment>=F
1b310 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20  TS5_MAX_SEGMENT 
1b320 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1b330 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1b340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1b350 2a 20 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45  * FTS5_MAX_SEGME
1b360 4e 54 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  NT is currently 
1b370 64 65 66 69 6e 65 64 20 61 73 20 32 30 30 30 2e  defined as 2000.
1b380 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   So the followin
1b390 67 0a 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79  g.      ** array
1b3a0 20 69 73 20 36 33 20 65 6c 65 6d 65 6e 74 73 2c   is 63 elements,
1b3b0 20 6f 72 20 32 35 32 20 62 79 74 65 73 2c 20 69   or 252 bytes, i
1b3c0 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20  n size.  */.    
1b3d0 20 20 75 33 32 20 61 55 73 65 64 5b 28 46 54 53    u32 aUsed[(FTS
1b3e0 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 2b 33 31  5_MAX_SEGMENT+31
1b3f0 29 20 2f 20 33 32 5d 3b 0a 20 20 20 20 20 20 69  ) / 32];.      i
1b400 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
1b410 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1b420 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
1b430 20 20 6d 65 6d 73 65 74 28 61 55 73 65 64 2c 20    memset(aUsed, 
1b440 30 2c 20 73 69 7a 65 6f 66 28 61 55 73 65 64 29  0, sizeof(aUsed)
1b450 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76  );.      for(iLv
1b460 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
1b470 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
1b480 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +){.        for(
1b490 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74  iSeg=0; iSeg<pSt
1b4a0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b4b0 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l].nSeg; iSeg++)
1b4c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1b4d0 69 49 64 20 3d 20 70 53 74 72 75 63 74 2d 3e 61  iId = pStruct->a
1b4e0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
1b4f0 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 3b 0a 20  [iSeg].iSegid;. 
1b500 20 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64           if( iId
1b510 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45  <=FTS5_MAX_SEGME
1b520 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
1b530 20 20 61 55 73 65 64 5b 28 69 49 64 2d 31 29 20    aUsed[(iId-1) 
1b540 2f 20 33 32 5d 20 7c 3d 20 28 75 33 32 29 31 20  / 32] |= (u32)1 
1b550 3c 3c 20 28 28 69 49 64 2d 31 29 20 25 20 33 32  << ((iId-1) % 32
1b560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1b570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b580 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
1b590 20 61 55 73 65 64 5b 69 5d 3d 3d 30 78 46 46 46   aUsed[i]==0xFFF
1b5a0 46 46 46 46 46 3b 20 69 2b 2b 29 3b 0a 20 20 20  FFFFF; i++);.   
1b5b0 20 20 20 6d 61 73 6b 20 3d 20 61 55 73 65 64 5b     mask = aUsed[
1b5c0 69 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  i];.      for(iS
1b5d0 65 67 69 64 3d 30 3b 20 6d 61 73 6b 20 26 20 28  egid=0; mask & (
1b5e0 28 75 33 32 29 31 20 3c 3c 20 69 53 65 67 69 64  (u32)1 << iSegid
1b5f0 29 3b 20 69 53 65 67 69 64 2b 2b 29 3b 0a 20 20  ); iSegid++);.  
1b600 20 20 20 20 69 53 65 67 69 64 20 2b 3d 20 31 20      iSegid += 1 
1b610 2b 20 69 2a 33 32 3b 0a 0a 23 69 66 64 65 66 20  + i*32;..#ifdef 
1b620 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1b630 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
1b640 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
1b650 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
1b660 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
1b670 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
1b680 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
1b690 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
1b6a0 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
1b6b0 20 69 53 65 67 69 64 21 3d 70 53 74 72 75 63 74   iSegid!=pStruct
1b6c0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
1b6d0 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
1b6e0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
1b6f0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
1b700 72 74 5f 6e 63 28 20 69 53 65 67 69 64 3e 30 20  rt_nc( iSegid>0 
1b710 26 26 20 69 53 65 67 69 64 3c 3d 46 54 53 35 5f  && iSegid<=FTS5_
1b720 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29 3b 0a 0a  MAX_SEGMENT );..
1b730 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1b740 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49  sqlite3_stmt *pI
1b750 64 78 53 65 6c 65 63 74 20 3d 20 66 74 73 35 49  dxSelect = fts5I
1b760 64 78 53 65 6c 65 63 74 53 74 6d 74 28 70 29 3b  dxSelectStmt(p);
1b770 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1b780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b790 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 42  .          u8 aB
1b7a0 6c 6f 62 5b 32 5d 20 3d 20 7b 30 78 66 66 2c 20  lob[2] = {0xff, 
1b7b0 30 78 66 66 7d 3b 0a 20 20 20 20 20 20 20 20 20  0xff};.         
1b7c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1b7d0 74 28 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c  t(pIdxSelect, 1,
1b7e0 20 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20   iSegid);.      
1b7f0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b800 5f 62 6c 6f 62 28 70 49 64 78 53 65 6c 65 63 74  _blob(pIdxSelect
1b810 2c 20 32 2c 20 61 42 6c 6f 62 2c 20 32 2c 20 53  , 2, aBlob, 2, S
1b820 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1b830 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
1b840 6e 63 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nc( sqlite3_step
1b850 28 70 49 64 78 53 65 6c 65 63 74 29 21 3d 53 51  (pIdxSelect)!=SQ
1b860 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20  LITE_ROW );.    
1b870 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1b880 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 64 78  lite3_reset(pIdx
1b890 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
1b8a0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1b8b0 6e 75 6c 6c 28 70 49 64 78 53 65 6c 65 63 74 2c  null(pIdxSelect,
1b8c0 20 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   2);.        }. 
1b8d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1b8e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1b8f0 6e 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a  n iSegid;.}../*.
1b900 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64  ** Discard all d
1b910 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ata currently ca
1b920 63 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68  ched in the hash
1b930 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  -tables..*/.stat
1b940 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1b950 78 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73  xDiscardData(Fts
1b960 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73  5Index *p){.  as
1b970 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 7c  sert( p->pHash |
1b980 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  | p->nPendingDat
1b990 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  a==0 );.  if( p-
1b9a0 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 73 71  >pHash ){.    sq
1b9b0 6c 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65  lite3Fts5HashCle
1b9c0 61 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  ar(p->pHash);.  
1b9d0 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
1b9e0 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  a = 0;.  }.}../*
1b9f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1ba00 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69  ize of the prefi
1ba10 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61  x, in bytes, tha
1ba20 74 20 62 75 66 66 65 72 20 0a 2a 2a 20 28 70 4e  t buffer .** (pN
1ba30 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f  ew/<length-unkno
1ba40 77 6e 3e 29 20 73 68 61 72 65 73 20 77 69 74 68  wn>) shares with
1ba50 20 62 75 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f   buffer (pOld/nO
1ba60 6c 64 29 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65  ld)..**.** Buffe
1ba70 72 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d  r (pNew/<length-
1ba80 75 6e 6b 6e 6f 77 6e 3e 29 20 69 73 20 67 75 61  unknown>) is gua
1ba90 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 67 72  ranteed to be gr
1baa0 65 61 74 65 72 20 0a 2a 2a 20 74 68 61 6e 20 62  eater .** than b
1bab0 75 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64  uffer (pOld/nOld
1bac0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1bad0 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
1bae0 65 73 73 28 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f  ess(int nOld, co
1baf0 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c 20 63 6f  nst u8 *pOld, co
1bb00 6e 73 74 20 75 38 20 2a 70 4e 65 77 29 7b 0a 20  nst u8 *pNew){. 
1bb10 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1bb20 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
1bb30 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d  .    if( pOld[i]
1bb40 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61  !=pNew[i] ) brea
1bb50 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1bb60 69 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  i;.}..static voi
1bb70 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78  d fts5WriteDlidx
1bb80 43 6c 65 61 72 28 0a 20 20 46 74 73 35 49 6e 64  Clear(.  Fts5Ind
1bb90 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
1bba0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1bbb0 2c 0a 20 20 69 6e 74 20 62 46 6c 75 73 68 20 20  ,.  int bFlush  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1bbe0 77 72 69 74 65 20 64 6c 69 64 78 20 74 6f 20 64  write dlidx to d
1bbf0 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  isk */.){.  int 
1bc00 69 3b 0a 20 20 61 73 73 65 72 74 28 20 62 46 6c  i;.  assert( bFl
1bc10 75 73 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74  ush==0 || (pWrit
1bc20 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20  er->nDlidx>0 && 
1bc30 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1bc40 30 5d 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20  0].buf.n>0) );. 
1bc50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69   for(i=0; i<pWri
1bc60 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b  ter->nDlidx; i++
1bc70 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  ){.    Fts5Dlidx
1bc80 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  Writer *pDlidx =
1bc90 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
1bca0 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  x[i];.    if( pD
1bcb0 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29  lidx->buf.n==0 )
1bcc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
1bcd0 62 46 6c 75 73 68 20 29 7b 0a 20 20 20 20 20 20  bFlush ){.      
1bce0 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e  assert( pDlidx->
1bcf0 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20  pgno!=0 );.     
1bd00 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
1bd10 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53  , .          FTS
1bd20 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57  5_DLIDX_ROWID(pW
1bd30 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
1bd40 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c  , pDlidx->pgno),
1bd50 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64  .          pDlid
1bd60 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78  x->buf.p, pDlidx
1bd70 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b  ->buf.n.      );
1bd80 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1bd90 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f  e3Fts5BufferZero
1bda0 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a  (&pDlidx->buf);.
1bdb0 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65      pDlidx->bPre
1bdc0 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  vValid = 0;.  }.
1bdd0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68  }../*.** Grow th
1bde0 65 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  e pWriter->aDlid
1bdf0 78 5b 5d 20 61 72 72 61 79 20 74 6f 20 61 74 20  x[] array to at 
1be00 6c 65 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65  least nLvl eleme
1be10 6e 74 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  nts in size..** 
1be20 41 6e 79 20 6e 65 77 20 61 72 72 61 79 20 65 6c  Any new array el
1be30 65 6d 65 6e 74 73 20 61 72 65 20 7a 65 72 6f 65  ements are zeroe
1be40 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
1be50 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1be60 74 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78  t fts5WriteDlidx
1be70 47 72 6f 77 28 0a 20 20 46 74 73 35 49 6e 64 65  Grow(.  Fts5Inde
1be80 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 57  x *p,.  Fts5SegW
1be90 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
1bea0 20 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20    int nLvl.){.  
1beb0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1bec0 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57  E_OK && nLvl>=pW
1bed0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b  riter->nDlidx ){
1bee0 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
1bef0 69 74 65 72 20 2a 61 44 6c 69 64 78 20 3d 20 28  iter *aDlidx = (
1bf00 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 2a  Fts5DlidxWriter*
1bf10 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
1bf20 28 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65  (.        pWrite
1bf30 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f  r->aDlidx, sizeo
1bf40 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65  f(Fts5DlidxWrite
1bf50 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b  r) * nLvl.    );
1bf60 0a 20 20 20 20 69 66 28 20 61 44 6c 69 64 78 3d  .    if( aDlidx=
1bf70 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
1bf80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1bf90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bfa0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
1bfb0 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57  izeof(Fts5DlidxW
1bfc0 72 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d  riter) * (nLvl -
1bfd0 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
1bfe0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
1bff0 26 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72 2d  &aDlidx[pWriter-
1c000 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79  >nDlidx], 0, nBy
1c010 74 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74  te);.      pWrit
1c020 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c  er->aDlidx = aDl
1c030 69 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69 74  idx;.      pWrit
1c040 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76  er->nDlidx = nLv
1c050 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  l;.    }.  }.  r
1c060 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
1c070 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  /*.** If the cur
1c080 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64  rent doclist-ind
1c090 65 78 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  ex accumulating 
1c0a0 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  in pWriter->aDli
1c0b0 64 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a  dx[] is large.**
1c0c0 20 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20 69   enough, flush i
1c0d0 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 72 65  t to disk and re
1c0e0 74 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73  turn 1. Otherwis
1c0f0 65 20 64 69 73 63 61 72 64 20 69 74 20 61 6e 64  e discard it and
1c100 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e   return.** zero.
1c110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1c120 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69  ts5WriteFlushDli
1c130 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  dx(Fts5Index *p,
1c140 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1c150 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20  pWriter){.  int 
1c160 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  bFlag = 0;..  /*
1c170 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 46   If there were F
1c180 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
1c190 5a 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79  ZE or more empty
1c1a0 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74   leaf pages writ
1c1b0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
1c1c0 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77  database, also w
1c1d0 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74  rite the doclist
1c1e0 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20  -index to disk. 
1c1f0 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65   */.  if( pWrite
1c200 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
1c210 2e 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  .n>0 && pWriter-
1c220 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49  >nEmpty>=FTS5_MI
1c230 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a  N_DLIDX_SIZE ){.
1c240 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20      bFlag = 1;. 
1c250 20 7d 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c   }.  fts5WriteDl
1c260 69 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69  idxClear(p, pWri
1c270 74 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70  ter, bFlag);.  p
1c280 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d  Writer->nEmpty =
1c290 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6c   0;.  return bFl
1c2a0 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ag;.}../*.** Thi
1c2b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c2c0 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 70 72  lled whenever pr
1c2d0 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20  ocessing of the 
1c2e0 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20  doclist for the 
1c2f0 0a 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e  .** last term on
1c300 20 6c 65 61 66 20 70 61 67 65 20 28 70 57 72 69   leaf page (pWri
1c310 74 65 72 2d 3e 69 42 74 50 61 67 65 29 20 69 73  ter->iBtPage) is
1c320 20 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a   completed. .**.
1c330 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 2d 69  ** The doclist-i
1c340 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20 74 65  ndex for that te
1c350 72 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  rm is currently 
1c360 73 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  stored in-memory
1c370 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46   within the.** F
1c380 74 73 35 53 65 67 57 72 69 74 65 72 2e 61 44 6c  ts5SegWriter.aDl
1c390 69 64 78 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  idx[] array. If 
1c3a0 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  it is large enou
1c3b0 67 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  gh, this functio
1c3c0 6e 0a 2a 2a 20 77 72 69 74 65 73 20 69 74 20 6f  n.** writes it o
1c3d0 75 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20  ut to disk. Or, 
1c3e0 69 66 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61  if it is too sma
1c3f0 6c 6c 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74  ll to bother wit
1c400 68 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a 20 69  h, discards.** i
1c410 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67  t..**.** Fts5Seg
1c420 57 72 69 74 65 72 2e 62 74 74 65 72 6d 20 63 75  Writer.btterm cu
1c430 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
1c440 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
1c450 6f 6e 20 70 61 67 65 20 69 42 74 50 61 67 65 2e  on page iBtPage.
1c460 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c470 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74  fts5WriteFlushBt
1c480 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ree(Fts5Index *p
1c490 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
1c4a0 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74  *pWriter){.  int
1c4b0 20 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72   bFlag;..  asser
1c4c0 74 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  t( pWriter->iBtP
1c4d0 61 67 65 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  age || pWriter->
1c4e0 6e 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69  nEmpty==0 );.  i
1c4f0 66 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  f( pWriter->iBtP
1c500 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  age==0 ) return;
1c510 0a 20 20 62 46 6c 61 67 20 3d 20 66 74 73 35 57  .  bFlag = fts5W
1c520 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 70  riteFlushDlidx(p
1c530 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 69  , pWriter);..  i
1c540 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c550 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
1c560 20 63 68 61 72 20 2a 7a 20 3d 20 28 70 57 72 69   char *z = (pWri
1c570 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f  ter->btterm.n>0?
1c580 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 57 72  (const char*)pWr
1c590 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22  iter->btterm.p:"
1c5a0 22 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  ");.    /* The f
1c5b0 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c 72  ollowing was alr
1c5c0 65 61 64 79 20 64 6f 6e 65 20 69 6e 20 66 74 73  eady done in fts
1c5d0 35 57 72 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f  5WriteInit(): */
1c5e0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1c5f0 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78  bind_int(p->pIdx
1c600 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74  Writer, 1, pWrit
1c610 65 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a  er->iSegid); */.
1c620 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1c630 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72 69  _blob(p->pIdxWri
1c640 74 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74  ter, 2, z, pWrit
1c650 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51  er->btterm.n, SQ
1c660 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1c670 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1c680 6e 74 36 34 28 70 2d 3e 70 49 64 78 57 72 69 74  nt64(p->pIdxWrit
1c690 65 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20 28  er, 3, bFlag + (
1c6a0 28 69 36 34 29 70 57 72 69 74 65 72 2d 3e 69 42  (i64)pWriter->iB
1c6b0 74 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20  tPage<<1));.    
1c6c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
1c6d0 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
1c6e0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1c6f0 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78 57 72  _reset(p->pIdxWr
1c700 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
1c710 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d 3e  e3_bind_null(p->
1c720 70 49 64 78 57 72 69 74 65 72 2c 20 32 29 3b 0a  pIdxWriter, 2);.
1c730 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69    }.  pWriter->i
1c740 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  BtPage = 0;.}../
1c750 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
1c760 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
1c770 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65  h leaf page exce
1c780 70 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61  pt the first tha
1c790 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74  t contains.** at
1c7a0 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
1c7b0 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d   Argument (nTerm
1c7c0 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73  /pTerm) is the s
1c7d0 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72  plit-key - a ter
1c7e0 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  m that.** is lar
1c7f0 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72  ger than all ter
1c800 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61  ms written to ea
1c810 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e  rlier leaves, an
1c820 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a  d equal to or.**
1c830 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1c840 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
1c850 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a  the new leaf..**
1c860 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1c870 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1c880 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
1c890 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
1c8a0 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61  f an error.** ha
1c8b0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
1c8c0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
1c8d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1c8e0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1c8f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1c900 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72  ts5WriteBtreeTer
1c910 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
1c920 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1c930 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1c940 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1c950 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1c960 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
1c970 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1c980 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  t */.  int nTerm
1c990 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
1c9a0 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  m      /* First 
1c9b0 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65  term on new page
1c9c0 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69   */.){.  fts5Wri
1c9d0 74 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20  teFlushBtree(p, 
1c9e0 70 57 72 69 74 65 72 29 3b 0a 20 20 66 74 73 35  pWriter);.  fts5
1c9f0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1ca00 2c 20 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65  , &pWriter->btte
1ca10 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
1ca20 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42  );.  pWriter->iB
1ca30 74 50 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d  tPage = pWriter-
1ca40 3e 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a  >writer.pgno;.}.
1ca50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1ca60 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
1ca70 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 61 20 6c  hen flushing a l
1ca80 65 61 66 20 70 61 67 65 20 74 68 61 74 20 63 6f  eaf page that co
1ca90 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72  ntains no.** ter
1caa0 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20 64 69 73  ms at all to dis
1cab0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
1cac0 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
1cad0 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  NoTerm(.  Fts5In
1cae0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1caf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1cb00 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1cb10 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
1cb20 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20  ter *pWriter    
1cb30 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
1cb40 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f  object */.){.  /
1cb50 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  * If there were 
1cb60 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 65  no rowids on the
1cb70 20 6c 65 61 66 20 70 61 67 65 20 65 69 74 68 65   leaf page eithe
1cb80 72 20 61 6e 64 20 74 68 65 20 64 6f 63 6c 69 73  r and the doclis
1cb90 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73  t-index.  ** has
1cba0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74   already been st
1cbb0 61 72 74 65 64 2c 20 61 70 70 65 6e 64 20 61 6e  arted, append an
1cbc0 20 30 78 30 30 20 62 79 74 65 20 74 6f 20 69 74   0x00 byte to it
1cbd0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69  .  */.  if( pWri
1cbe0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1cbf0 49 6e 50 61 67 65 20 26 26 20 70 57 72 69 74 65  InPage && pWrite
1cc00 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
1cc10 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  .n>0 ){.    Fts5
1cc20 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c  DlidxWriter *pDl
1cc30 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1cc40 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61  aDlidx[0];.    a
1cc50 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62  ssert( pDlidx->b
1cc60 50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20 20 20  PrevValid );.   
1cc70 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1cc80 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1cc90 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
1cca0 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  buf, 0);.  }..  
1ccb0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1ccc0 20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65 71 75   "number of sequ
1ccd0 65 6e 74 69 61 6c 20 6c 65 61 76 65 73 20 77 69  ential leaves wi
1cce0 74 68 6f 75 74 20 61 20 74 65 72 6d 22 20 63 6f  thout a term" co
1ccf0 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69  unter. */.  pWri
1cd00 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d  ter->nEmpty++;.}
1cd10 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  ..static i64 fts
1cd20 35 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72  5DlidxExtractFir
1cd30 73 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66  stRowid(Fts5Buff
1cd40 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 69 36 34  er *pBuf){.  i64
1cd50 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69   iRowid;.  int i
1cd60 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31  Off;..  iOff = 1
1cd70 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   + fts5GetVarint
1cd80 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75  (&pBuf->p[1], (u
1cd90 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20  64*)&iRowid);.  
1cda0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
1cdb0 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  Buf->p[iOff], (u
1cdc0 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20  64*)&iRowid);.  
1cdd0 72 65 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d  return iRowid;.}
1cde0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52  ../*.** Rowid iR
1cdf0 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20 62 65  owid has just be
1ce00 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  en appended to t
1ce10 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
1ce20 70 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 0a  page. It is the.
1ce30 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20  ** first on the 
1ce40 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
1ce50 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 61  ion appends an a
1ce60 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 79  ppropriate entry
1ce70 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a   to the current.
1ce80 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
1ce90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1cea0 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41   fts5WriteDlidxA
1ceb0 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64  ppend(.  Fts5Ind
1cec0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
1ced0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1cee0 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a  , .  i64 iRowid.
1cef0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
1cf00 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20  t bDone = 0;..  
1cf10 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
1cf20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f  SQLITE_OK && bDo
1cf30 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ne==0; i++){.   
1cf40 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 46   i64 iVal;.    F
1cf50 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
1cf60 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
1cf70 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20  r->aDlidx[i];.. 
1cf80 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62     if( pDlidx->b
1cf90 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  uf.n>=p->pConfig
1cfa0 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  ->pgsz ){.      
1cfb0 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 64  /* The current d
1cfc0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67  oclist-index pag
1cfd0 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65  e is full. Write
1cfe0 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20   it to disk and 
1cff0 70 75 73 68 0a 20 20 20 20 20 20 2a 2a 20 61 20  push.      ** a 
1d000 63 6f 70 79 20 6f 66 20 69 52 6f 77 69 64 20 28  copy of iRowid (
1d010 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d  which will becom
1d020 65 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  e the first rowi
1d030 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20 20  d on the next.  
1d040 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69      ** doclist-i
1d050 6e 64 65 78 20 6c 65 61 66 20 70 61 67 65 29 20  ndex leaf page) 
1d060 75 70 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  up into the next
1d070 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d   level of the b-
1d080 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20 68  tree .      ** h
1d090 69 65 72 61 72 63 68 79 2e 20 49 66 20 74 68 65  ierarchy. If the
1d0a0 20 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c 75 73   node being flus
1d0b0 68 65 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hed is currently
1d0c0 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a   the root node,.
1d0d0 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75        ** also pu
1d0e0 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77  sh its first row
1d0f0 69 64 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20  id upwards. */. 
1d100 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66       pDlidx->buf
1d110 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20 20  .p[0] = 0x01;   
1d120 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74   /* Not the root
1d130 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 66   node */.      f
1d140 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
1d150 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
1d160 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69  DLIDX_ROWID(pWri
1d170 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20  ter->iSegid, i, 
1d180 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20  pDlidx->pgno),. 
1d190 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d           pDlidx-
1d1a0 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e  >buf.p, pDlidx->
1d1b0 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20  buf.n.      );. 
1d1c0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
1d1d0 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74  idxGrow(p, pWrit
1d1e0 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20 20  er, i+2);.      
1d1f0 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
1d200 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20  r->aDlidx[i];.  
1d210 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1d220 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69  QLITE_OK && pDli
1d230 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29  dx[1].buf.n==0 )
1d240 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 46  {.        i64 iF
1d250 69 72 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78  irst = fts5Dlidx
1d260 45 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69  ExtractFirstRowi
1d270 64 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b  d(&pDlidx->buf);
1d280 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  ..        /* Thi
1d290 73 20 77 61 73 20 74 68 65 20 72 6f 6f 74 20 6e  s was the root n
1d2a0 6f 64 65 2e 20 50 75 73 68 20 69 74 73 20 66 69  ode. Push its fi
1d2b0 72 73 74 20 72 6f 77 69 64 20 75 70 20 74 6f 20  rst rowid up to 
1d2c0 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f  the new root. */
1d2d0 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b  .        pDlidx[
1d2e0 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78  1].pgno = pDlidx
1d2f0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20  ->pgno;.        
1d300 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d310 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1d320 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d  ->rc, &pDlidx[1]
1d330 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  .buf, 0);.      
1d340 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d350 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d360 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
1d370 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e  1].buf, pDlidx->
1d380 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  pgno);.        s
1d390 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d3a0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d3b0 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e  >rc, &pDlidx[1].
1d3c0 62 75 66 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  buf, iFirst);.  
1d3d0 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e        pDlidx[1].
1d3e0 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a  bPrevValid = 1;.
1d3f0 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
1d400 5d 2e 69 50 72 65 76 20 3d 20 69 46 69 72 73 74  ].iPrev = iFirst
1d410 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1d420 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d430 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e  erZero(&pDlidx->
1d440 62 75 66 29 3b 0a 20 20 20 20 20 20 70 44 6c 69  buf);.      pDli
1d450 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
1d460 20 30 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78   0;.      pDlidx
1d470 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65  ->pgno++;.    }e
1d480 6c 73 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65  lse{.      bDone
1d490 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1d4a0 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 50 72   if( pDlidx->bPr
1d4b0 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  evValid ){.     
1d4c0 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d   iVal = iRowid -
1d4d0 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a   pDlidx->iPrev;.
1d4e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d4f0 20 69 36 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d   i64 iPgno = (i=
1d500 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 77 72  =0 ? pWriter->wr
1d510 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69  iter.pgno : pDli
1d520 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20  dx[-1].pgno);.  
1d530 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
1d540 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a  dx->buf.n==0 );.
1d550 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1d560 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d570 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
1d580 69 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65  idx->buf, !bDone
1d590 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d5a0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1d5b0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1d5c0 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50 67  pDlidx->buf, iPg
1d5d0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20  no);.      iVal 
1d5e0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a  = iRowid;.    }.
1d5f0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
1d600 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1d610 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1d620 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a  dx->buf, iVal);.
1d630 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65      pDlidx->bPre
1d640 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  vValid = 1;.    
1d650 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d 20  pDlidx->iPrev = 
1d660 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73  iRowid;.  }.}..s
1d670 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1d680 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46 74  riteFlushLeaf(Ft
1d690 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1d6a0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1d6b0 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  er){.  static co
1d6c0 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20  nst u8 zero[] = 
1d6d0 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  { 0x00, 0x00, 0x
1d6e0 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46 74  00, 0x00 };.  Ft
1d6f0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
1d700 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
1d710 77 72 69 74 65 72 3b 0a 20 20 69 36 34 20 69 52  writer;.  i64 iR
1d720 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  owid;..  assert(
1d730 20 28 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e   (pPage->pgidx.n
1d740 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e  ==0)==(pWriter->
1d750 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1d760 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ) );..  /* Set t
1d770 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72  he szLeaf header
1d780 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73   field. */.  ass
1d790 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55  ert( 0==fts5GetU
1d7a0 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70  16(&pPage->buf.p
1d7b0 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73 35 50 75  [2]) );.  fts5Pu
1d7c0 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
1d7d0 2e 70 5b 32 5d 2c 20 28 75 31 36 29 70 50 61 67  .p[2], (u16)pPag
1d7e0 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66  e->buf.n);..  if
1d7f0 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1d800 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
1d810 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61     /* No term wa
1d820 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
1d830 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  s page. */.    a
1d840 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
1d850 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  idx.n==0 );.    
1d860 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f  fts5WriteBtreeNo
1d870 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29  Term(p, pWriter)
1d880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1d890 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 67 69  * Append the pgi
1d8a0 64 78 20 74 6f 20 74 68 65 20 70 61 67 65 20 62  dx to the page b
1d8b0 75 66 66 65 72 2e 20 53 65 74 20 74 68 65 20 73  uffer. Set the s
1d8c0 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65  zLeaf header fie
1d8d0 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42  ld. */.    fts5B
1d8e0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1d8f0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1d900 62 75 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64  buf, pPage->pgid
1d910 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64  x.n, pPage->pgid
1d920 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  x.p);.  }..  /* 
1d930 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 6f  Write the page o
1d940 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  ut to disk */.  
1d950 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
1d960 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69  GMENT_ROWID(pWri
1d970 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70 50 61  ter->iSegid, pPa
1d980 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73  ge->pgno);.  fts
1d990 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52  5DataWrite(p, iR
1d9a0 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66  owid, pPage->buf
1d9b0 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  .p, pPage->buf.n
1d9c0 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
1d9d0 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ize the next pag
1d9e0 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  e. */.  fts5Buff
1d9f0 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62  erZero(&pPage->b
1da00 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  uf);.  fts5Buffe
1da10 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70 67  rZero(&pPage->pg
1da20 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66  idx);.  fts5Buff
1da30 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1da40 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1da50 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50  , 4, zero);.  pP
1da60 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20  age->iPrevPgidx 
1da70 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  = 0;.  pPage->pg
1da80 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  no++;..  /* Incr
1da90 65 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20  ease the leaves 
1daa0 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20  written counter 
1dab0 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c  */.  pWriter->nL
1dac0 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20  eafWritten++;.. 
1dad0 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66   /* The new leaf
1dae0 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20   holds no terms 
1daf0 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70  or rowids */.  p
1db00 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1db10 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  rmInPage = 1;.  
1db20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1db30 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a  owidInPage = 1;.
1db40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1db50 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
1db60 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
1db70 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79  being written by
1db80 20 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73   the writer pass
1db90 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
1dba0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
1dbb0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1dbc0 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
1dbd0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
1dbe0 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
1dbf0 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
1dc00 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
1dc10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1dc20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1dc30 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1dc40 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46  eAppendTerm(.  F
1dc50 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1dc60 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1dc70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54  Writer,.  int nT
1dc80 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  erm, const u8 *p
1dc90 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e  Term .){.  int n
1dca0 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
1dcb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1dcc0 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f  tes of prefix co
1dcd0 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65  mpression for te
1dce0 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65  rm */.  Fts5Page
1dcf0 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
1dd00 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1dd10 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ;.  Fts5Buffer *
1dd20 70 50 67 69 64 78 20 3d 20 26 70 57 72 69 74 65  pPgidx = &pWrite
1dd30 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 3b  r->writer.pgidx;
1dd40 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49  .  int nMin = MI
1dd50 4e 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c  N(pPage->term.n,
1dd60 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 61 73 73 65   nTerm);..  asse
1dd70 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
1dd80 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
1dd90 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
1dda0 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 );.  assert( p
1ddb0 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c  Page->buf.n>4 ||
1ddc0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1ddd0 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a 20  TermInPage );.. 
1dde0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1ddf0 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  nt leaf page is 
1de00 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20 74  full, flush it t
1de10 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28  o disk. */.  if(
1de20 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
1de30 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54 65   pPgidx->n + nTe
1de40 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e  rm + 2)>=p->pCon
1de50 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
1de60 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
1de70 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73  n>4 ){.      fts
1de80 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1de90 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
1dea0 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
1deb0 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70  rGrow(&p->rc, &p
1dec0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
1ded0 2b 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49  +FTS5_DATA_PADDI
1dee0 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  NG);.  }.  .  /*
1def0 20 54 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e 67   TODO1: Updating
1df00 20 70 67 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a   pgidx here. */.
1df10 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73    pPgidx->n += s
1df20 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
1df30 69 6e 74 28 0a 20 20 20 20 20 20 26 70 50 67 69  int(.      &pPgi
1df40 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d  dx->p[pPgidx->n]
1df50 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d  , pPage->buf.n -
1df60 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69   pPage->iPrevPgi
1df70 64 78 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 2d  dx.  );.  pPage-
1df80 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 70 50  >iPrevPgidx = pP
1df90 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20  age->buf.n;.#if 
1dfa0 30 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26  0.  fts5PutU16(&
1dfb0 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78  pPgidx->p[pPgidx
1dfc0 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  ->n], pPage->buf
1dfd0 2e 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e  .n);.  pPgidx->n
1dfe0 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20   += 2;.#endif.. 
1dff0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
1e000 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
1e010 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  {.    nPrefix = 
1e020 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1e030 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
1e040 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
1e050 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
1e060 61 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 6e  a leaf that is n
1e070 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20  ot the leftmost 
1e080 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a  leaf in.      **
1e090 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74   the segment b-t
1e0a0 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
1e0b0 65 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  e it is necessar
1e0c0 79 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d 20  y to add a term 
1e0d0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
1e0e0 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
1e0f0 20 74 68 61 74 20 69 73 20 28 61 29 20 6c 61 72   that is (a) lar
1e100 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
1e110 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20 20  gest term .     
1e120 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69 74   ** already writ
1e130 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d 65  ten to the segme
1e140 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c  nt and (b) small
1e150 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1e160 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 69   to.      ** thi
1e170 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72  s term. In other
1e180 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69 78   words, a prefix
1e190 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d   of (pTerm/nTerm
1e1a0 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20 20  ) that is one.  
1e1b0 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67      ** byte long
1e1c0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67  er than the long
1e1d0 65 73 74 20 70 72 65 66 69 78 20 28 70 54 65 72  est prefix (pTer
1e1e0 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73 20  m/nTerm) shares 
1e1f0 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a  with the.      *
1e200 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e  * previous term.
1e210 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
1e220 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65   ** Usually, the
1e230 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69   previous term i
1e240 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  s available in p
1e250 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20  Page->term. The 
1e260 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20  exception.      
1e270 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20 69 73  ** is if this is
1e280 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
1e290 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e  written in an in
1e2a0 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20  cremental-merge 
1e2b0 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49  step..      ** I
1e2c0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
1e2d0 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73  previous term is
1e2e0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
1e2f0 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61 0a  so just write a.
1e300 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
1e310 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69   (pTerm/nTerm) i
1e320 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e  nto the parent n
1e330 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69  ode. This is sli
1e340 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69  ghtly.      ** i
1e350 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20  nefficient, but 
1e360 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20  still correct.  
1e370 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
1e380 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66   nTerm;.      if
1e390 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20  ( pPage->term.n 
1e3a0 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 31  ){.        n = 1
1e3b0 20 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   + fts5PrefixCom
1e3c0 70 72 65 73 73 28 6e 4d 69 6e 2c 20 70 50 61 67  press(nMin, pPag
1e3d0 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d  e->term.p, pTerm
1e3e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e3f0 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54   fts5WriteBtreeT
1e400 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20  erm(p, pWriter, 
1e410 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  n, pTerm);.     
1e420 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
1e430 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20 7d  r->writer;.    }
1e440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
1e450 72 65 66 69 78 20 3d 20 66 74 73 35 50 72 65 66  refix = fts5Pref
1e460 69 78 43 6f 6d 70 72 65 73 73 28 6e 4d 69 6e 2c  ixCompress(nMin,
1e470 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
1e480 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74 73 35  pTerm);.    fts5
1e490 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1e4a0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1e4b0 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69 78 29  e->buf, nPrefix)
1e4c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
1e4d0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
1e4e0 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   bytes of new da
1e4f0 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72  ta, then the ter
1e500 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a 20 20  m data itself.  
1e510 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20  ** to the page. 
1e520 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  */.  fts5BufferA
1e530 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1e540 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e550 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
1e560 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
1e570 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1e580 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1e590 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 2c 20  Term - nPrefix, 
1e5a0 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 29  &pTerm[nPrefix])
1e5b0 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
1e5c0 68 65 20 46 74 73 35 50 61 67 65 57 72 69 74 65  he Fts5PageWrite
1e5d0 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20 2a 2f  r.term field. */
1e5e0 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74  .  fts5BufferSet
1e5f0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1e600 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54  >term, nTerm, pT
1e610 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  erm);.  pWriter-
1e620 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1e630 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69 74 65  e = 0;..  pWrite
1e640 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1e650 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72 69  Page = 0;.  pWri
1e660 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1e670 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a  InDoclist = 1;..
1e680 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
1e690 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c  || (pWriter->nDl
1e6a0 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72  idx>0 && pWriter
1e6b0 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1e6c0 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72 69 74  n==0) );.  pWrit
1e6d0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 70 67  er->aDlidx[0].pg
1e6e0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
1e6f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1e700 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20 70 6f  d a rowid and po
1e710 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
1e720 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77 72   field to the wr
1e730 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a  iters output. .*
1e740 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1e750 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
1e760 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  id(.  Fts5Index 
1e770 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1e780 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
1e790 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20   i64 iRowid.){. 
1e7a0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1e7b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
1e7c0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
1e7d0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1e7e0 72 69 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  riter;..    if( 
1e7f0 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20  (pPage->buf.n + 
1e800 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e  pPage->pgidx.n)>
1e810 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
1e820 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  z ){.      fts5W
1e830 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
1e840 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d   pWriter);.    }
1e850 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1e860 20 69 73 20 74 6f 20 62 65 20 74 68 65 20 66 69   is to be the fi
1e870 72 73 74 20 72 6f 77 69 64 20 77 72 69 74 74 65  rst rowid writte
1e880 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73  n to the page, s
1e890 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  et the .    ** r
1e8a0 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20  owid-pointer in 
1e8b0 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 2e  the page-header.
1e8c0 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61 20 76   Also append a v
1e8d0 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c 69 64  alue to the dlid
1e8e0 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2c  x.    ** buffer,
1e8f0 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63 6c 69   in case a docli
1e900 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65 71 75  st-index is requ
1e910 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ired.  */.    if
1e920 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1e930 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
1e940 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36        fts5PutU16
1e950 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 28  (pPage->buf.p, (
1e960 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e  u16)pPage->buf.n
1e970 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  );.      fts5Wri
1e980 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c  teDlidxAppend(p,
1e990 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64   pWriter, iRowid
1e9a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1e9b0 20 57 72 69 74 65 20 74 68 65 20 72 6f 77 69 64   Write the rowid
1e9c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72  . */.    if( pWr
1e9d0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1e9e0 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57  dInDoclist || pW
1e9f0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1ea00 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
1ea10 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1ea20 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1ea30 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52   &pPage->buf, iR
1ea40 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  owid);.    }else
1ea50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ea60 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e  p->rc || iRowid>
1ea70 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
1ea80 77 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73  wid );.      fts
1ea90 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1eaa0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
1eab0 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20  ge->buf, iRowid 
1eac0 2d 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76  - pWriter->iPrev
1ead0 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Rowid);.    }.  
1eae0 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76    pWriter->iPrev
1eaf0 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1eb00 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
1eb10 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
1eb20 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74  t = 0;.    pWrit
1eb30 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1eb40 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  nPage = 0;.  }.}
1eb50 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1eb60 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
1eb70 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35  listData(.  Fts5
1eb80 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1eb90 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1eba0 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ter, .  const u8
1ebb0 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20   *aData, .  int 
1ebc0 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50  nData.){.  Fts5P
1ebd0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
1ebe0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1ebf0 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  ter;.  const u8 
1ec00 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e  *a = aData;.  in
1ec10 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a  t n = nData;.  .
1ec20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
1ec30 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a  nfig->pgsz>0 );.
1ec40 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1ec50 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
1ec60 26 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e  && (pPage->buf.n
1ec70 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e   + pPage->pgidx.
1ec80 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66  n + n)>=p->pConf
1ec90 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a 20  ig->pgsz .  ){. 
1eca0 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d     int nReq = p-
1ecb0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d  >pConfig->pgsz -
1ecc0 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20   pPage->buf.n - 
1ecd0 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a  pPage->pgidx.n;.
1ece0 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1ecf0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43  0;.    while( nC
1ed00 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20  opy<nReq ){.    
1ed10 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20    i64 dummy;.   
1ed20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35     nCopy += fts5
1ed30 47 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f  GetVarint(&a[nCo
1ed40 70 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d  py], (u64*)&dumm
1ed50 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  y);.    }.    ft
1ed60 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1ed70 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1ed80 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61  e->buf, nCopy, a
1ed90 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70  );.    a += nCop
1eda0 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70  y;.    n -= nCop
1edb0 79 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  y;.    fts5Write
1edc0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1edd0 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  iter);.  }.  if(
1ede0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35   n>0 ){.    fts5
1edf0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1ee00 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1ee10 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d  >buf, n, a);.  }
1ee20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
1ee30 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64 20  any data cached 
1ee40 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f 62  by the writer ob
1ee50 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74 61  ject to the data
1ee60 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a  base. Free any.*
1ee70 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  * allocations as
1ee80 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1ee90 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61  e writer..*/.sta
1eea0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1eeb0 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35  teFinish(.  Fts5
1eec0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1eed0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1eee0 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
1eef0 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
1ef00 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20  .  int *pnLeaf  
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65     /* OUT: Numbe
1ef30 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
1ef40 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a  in b-tree */.){.
1ef50 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50    int i;.  Fts5P
1ef60 61 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66  ageWriter *pLeaf
1ef70 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1ef80 74 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ter;.  if( p->rc
1ef90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1efa0 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 61 66     assert( pLeaf
1efb0 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20  ->pgno>=1 );.   
1efc0 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e   if( pLeaf->buf.
1efd0 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73  n>4 ){.      fts
1efe0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1eff0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
1f000 20 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d   }.    *pnLeaf =
1f010 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a   pLeaf->pgno-1;.
1f020 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 70      if( pLeaf->p
1f030 67 6e 6f 3e 31 20 29 7b 0a 20 20 20 20 20 20 66  gno>1 ){.      f
1f040 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72  ts5WriteFlushBtr
1f050 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ee(p, pWriter);.
1f060 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35      }.  }.  fts5
1f070 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61  BufferFree(&pLea
1f080 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35  f->term);.  fts5
1f090 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61  BufferFree(&pLea
1f0a0 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  f->buf);.  fts5B
1f0b0 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
1f0c0 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35  ->pgidx);.  fts5
1f0d0 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69  BufferFree(&pWri
1f0e0 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20  ter->btterm);.. 
1f0f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69   for(i=0; i<pWri
1f100 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b  ter->nDlidx; i++
1f110 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
1f120 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
1f130 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
1f140 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  .buf);.  }.  sql
1f150 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
1f160 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73  r->aDlidx);.}..s
1f170 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1f180 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35  riteInit(.  Fts5
1f190 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1f1a0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1f1b0 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67  ter, .  int iSeg
1f1c0 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  id.){.  const in
1f1d0 74 20 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70  t nBuffer = p->p
1f1e0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46  Config->pgsz + F
1f1f0 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
1f200 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69  ;..  memset(pWri
1f210 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
1f220 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a  ts5SegWriter));.
1f230 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69    pWriter->iSegi
1f240 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66  d = iSegid;..  f
1f250 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
1f260 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29  w(p, pWriter, 1)
1f270 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69  ;.  pWriter->wri
1f280 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ter.pgno = 1;.  
1f290 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1f2a0 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
1f2b0 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
1f2c0 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  e = 1;..  assert
1f2d0 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  ( pWriter->write
1f2e0 72 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20  r.buf.n==0 );.  
1f2f0 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d  assert( pWriter-
1f300 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d  >writer.pgidx.n=
1f310 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77  =0 );..  /* Grow
1f320 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
1f330 20 74 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69   to pgsz + paddi
1f340 6e 67 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ng bytes in size
1f350 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74  . */.  sqlite3Ft
1f360 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
1f370 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77  >rc, &pWriter->w
1f380 72 69 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75  riter.pgidx, nBu
1f390 66 66 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ffer);.  sqlite3
1f3a0 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
1f3b0 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
1f3c0 3e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 42 75  >writer.buf, nBu
1f3d0 66 66 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ffer);..  if( p-
1f3e0 3e 70 49 64 78 57 72 69 74 65 72 3d 3d 30 20 29  >pIdxWriter==0 )
1f3f0 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
1f400 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
1f410 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
1f420 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
1f430 28 70 2c 20 26 70 2d 3e 70 49 64 78 57 72 69 74  (p, &p->pIdxWrit
1f440 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
1f450 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
1f460 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27  INSERT INTO '%q'
1f470 2e 27 25 71 5f 69 64 78 27 28 73 65 67 69 64 2c  .'%q_idx'(segid,
1f480 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55 45  term,pgno) VALUE
1f490 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20 20  S(?,?,?)", .    
1f4a0 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
1f4b0 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
1f4c0 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 0a  me.    ));.  }..
1f4d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1f4e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
1f4f0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1f500 34 2d 62 79 74 65 20 6c 65 61 66 2d 70 61 67 65  4-byte leaf-page
1f510 20 68 65 61 64 65 72 20 74 6f 20 30 78 30 30 2e   header to 0x00.
1f520 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
1f530 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1f540 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20  uf.p, 0, 4);.   
1f550 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1f560 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20  .buf.n = 4;..   
1f570 20 2f 2a 20 42 69 6e 64 20 74 68 65 20 63 75 72   /* Bind the cur
1f580 72 65 6e 74 20 6f 75 74 70 75 74 20 73 65 67 6d  rent output segm
1f590 65 6e 74 20 69 64 20 74 6f 20 74 68 65 20 69 6e  ent id to the in
1f5a0 64 65 78 2d 77 72 69 74 65 72 2e 20 54 68 69 73  dex-writer. This
1f5b0 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 6f 70   is an.    ** op
1f5c0 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76 65 72 20  timization over 
1f5d0 62 69 6e 64 69 6e 67 20 74 68 65 20 73 61 6d 65  binding the same
1f5e0 20 76 61 6c 75 65 20 6f 76 65 72 20 61 6e 64 20   value over and 
1f5f0 6f 76 65 72 20 61 73 20 72 6f 77 73 20 61 72 65  over as rows are
1f600 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 65 64  .    ** inserted
1f610 20 69 6e 74 6f 20 25 5f 69 64 78 20 62 79 20 74   into %_idx by t
1f620 68 65 20 63 75 72 72 65 6e 74 20 77 72 69 74 65  he current write
1f630 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r.  */.    sqlit
1f640 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70  e3_bind_int(p->p
1f650 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57  IdxWriter, 1, pW
1f660 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 0a  riter->iSegid);.
1f670 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    }.}../*.** Ite
1f680 72 61 74 6f 72 20 70 49 74 65 72 20 77 61 73 20  rator pIter was 
1f690 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
1f6a0 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75  through the inpu
1f6b0 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e  t segments of on
1f6c0 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   an.** increment
1f6d0 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69  al merge operati
1f6e0 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
1f6f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74  n is called if t
1f700 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a  he incremental.*
1f710 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68 61 73  * merge step has
1f720 20 66 69 6e 69 73 68 65 64 20 62 75 74 20 74 68   finished but th
1f730 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20  e input has not 
1f740 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20  been completely 
1f750 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74  exhausted..*/.st
1f760 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72  atic void fts5Tr
1f770 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49  imSegments(Fts5I
1f780 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65  ndex *p, Fts5Ite
1f790 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
1f7a0 20 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   i;.  Fts5Buffer
1f7b0 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
1f7c0 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
1f7d0 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66  ts5Buffer));.  f
1f7e0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
1f7f0 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
1f800 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1f810 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
1f820 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  g[i];.    if( pS
1f830 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20  eg->pSeg==0 ){. 
1f840 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
1f850 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1f860 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b  Seg->pLeaf==0 ){
1f870 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65  .      /* All ke
1f880 79 73 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70  ys from this inp
1f890 75 74 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20  ut segment have 
1f8a0 62 65 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20  been transfered 
1f8b0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20  to the output.. 
1f8c0 20 20 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68       ** Set both
1f8d0 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c   the first and l
1f8e0 61 73 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ast page-numbers
1f8f0 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
1f900 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
1f910 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e   ** segment is n
1f920 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  ow empty. */.   
1f930 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70     pSeg->pSeg->p
1f940 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20  gnoLast = 0;.   
1f950 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70     pSeg->pSeg->p
1f960 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  gnoFirst = 0;.  
1f970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1f980 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e  nt iOff = pSeg->
1f990 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
1f9a0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1f9b0 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66  n new first leaf
1f9c0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
1f9d0 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20  64 iLeafRowid;. 
1f9e0 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
1f9f0 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20  Data;.      int 
1fa00 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67  iId = pSeg->pSeg
1fa10 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ->iSegid;.      
1fa20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78  u8 aHdr[4] = {0x
1fa30 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  00, 0x00, 0x00, 
1fa40 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20 20 69 4c  0x00};..      iL
1fa50 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  eafRowid = FTS5_
1fa60 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1fa70 64 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65  d, pSeg->iTermLe
1fa80 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  afPgno);.      p
1fa90 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
1faa0 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ead(p, iLeafRowi
1fab0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  d);.      if( pD
1fac0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ata ){.        f
1fad0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62  ts5BufferZero(&b
1fae0 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  uf);.        fts
1faf0 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1fb00 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
1fb10 3e 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74  >nn);.        ft
1fb20 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1fb30 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1fb40 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61   sizeof(aHdr), a
1fb50 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Hdr);.        ft
1fb60 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1fb70 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
1fb80 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29  f, pSeg->term.n)
1fb90 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1fba0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1fbb0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
1fbc0 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d  g->term.n, pSeg-
1fbd0 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20  >term.p);.      
1fbe0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fbf0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1fc00 62 75 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65  buf, pData->szLe
1fc10 61 66 2d 69 4f 66 66 2c 20 26 70 44 61 74 61 2d  af-iOff, &pData-
1fc20 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  >p[iOff]);.     
1fc30 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1fc40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fc50 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
1fc60 73 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f 0a  szLeaf field */.
1fc70 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75            fts5Pu
1fc80 74 55 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20  tU16(&buf.p[2], 
1fc90 28 75 31 36 29 62 75 66 2e 6e 29 3b 0a 20 20 20  (u16)buf.n);.   
1fca0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1fcb0 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6e 65  /* Set up the ne
1fcc0 77 20 70 61 67 65 2d 69 6e 64 65 78 20 61 72 72  w page-index arr
1fcd0 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  ay */.        ft
1fce0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1fcf0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
1fd00 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69  f, 4);.        i
1fd10 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67  f( pSeg->iLeafPg
1fd20 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54 65 72 6d 4c  no==pSeg->iTermL
1fd30 65 61 66 50 67 6e 6f 20 0a 20 20 20 20 20 20 20  eafPgno .       
1fd40 20 20 26 26 20 70 53 65 67 2d 3e 69 45 6e 64 6f    && pSeg->iEndo
1fd50 66 44 6f 63 6c 69 73 74 3c 70 44 61 74 61 2d 3e  fDoclist<pData->
1fd60 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20 20 20  szLeaf .        
1fd70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1fd80 20 6e 44 69 66 66 20 3d 20 70 44 61 74 61 2d 3e   nDiff = pData->
1fd90 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69  szLeaf - pSeg->i
1fda0 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20  EndofDoclist;.  
1fdb0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fdc0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1fdd0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 62 75 66  p->rc, &buf, buf
1fde0 2e 6e 20 2d 20 31 20 2d 20 6e 44 69 66 66 20 2d  .n - 1 - nDiff -
1fdf0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66   4);.          f
1fe00 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1fe10 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
1fe20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1fe30 20 70 44 61 74 61 2d 3e 6e 6e 20 2d 20 70 53 65   pData->nn - pSe
1fe40 67 2d 3e 69 50 67 69 64 78 4f 66 66 2c 20 26 70  g->iPgidxOff, &p
1fe50 44 61 74 61 2d 3e 70 5b 70 53 65 67 2d 3e 69 50  Data->p[pSeg->iP
1fe60 67 69 64 78 4f 66 66 5d 0a 20 20 20 20 20 20 20  gidxOff].       
1fe70 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
1fe80 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
1fe90 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
1fea0 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70  .        pSeg->p
1feb0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
1fec0 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1fed0 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66 74  Pgno;.        ft
1fee0 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20  s5DataDelete(p, 
1fef0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1ff00 49 44 28 69 49 64 2c 20 31 29 2c 20 69 4c 65 61  ID(iId, 1), iLea
1ff10 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  fRowid);.       
1ff20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
1ff30 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75  , iLeafRowid, bu
1ff40 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
1ff50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1ff60 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1ff70 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  &buf);.}..static
1ff80 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 43   void fts5MergeC
1ff90 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a 20 20  hunkCallback(.  
1ffa0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1ffb0 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
1ffc0 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b  const u8 *pChunk
1ffd0 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a  , int nChunk.){.
1ffe0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1fff0 2a 70 57 72 69 74 65 72 20 3d 20 28 46 74 73 35  *pWriter = (Fts5
20000 53 65 67 57 72 69 74 65 72 2a 29 70 43 74 78 3b  SegWriter*)pCtx;
20010 0a 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65  .  fts5WriteAppe
20020 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70 2c  ndPoslistData(p,
20030 20 70 57 72 69 74 65 72 2c 20 70 43 68 75 6e 6b   pWriter, pChunk
20040 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a  , nChunk);.}../*
20050 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
20060 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67  id fts5IndexMerg
20070 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49 6e  eLevel(.  Fts5In
20080 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
20090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
200a0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
200b0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
200c0 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
200d0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
200e0 20 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64   Stucture of ind
200f0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  ex */.  int iLvl
20100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20110 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
20120 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66   to read input f
20130 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rom */.  int *pn
20140 52 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Rem             
20150 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
20160 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e  e up to this man
20170 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20  y output leaves 
20180 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
20190 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
201a0 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74   *ppStruct;.  Ft
201b0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
201c0 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
201d0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
201e0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
201f0 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a  Level *pLvlOut;.
20200 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
20210 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
20220 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64  Iterator to read
20230 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20   input data */. 
20240 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65   int nRem = pnRe
20250 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20  m ? *pnRem : 0; 
20260 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20   /* Output leaf 
20270 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72  pages left to wr
20280 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  ite */.  int nIn
20290 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  put;            
202a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
202b0 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
202c0 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65  ents */.  Fts5Se
202d0 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
202e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
202f0 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
20300 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
20310 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
20320 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e  /* Output segmen
20330 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
20340 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f  r term;.  int bO
20350 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  ldest;          
20360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20370 65 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  e if the output 
20380 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f  segment is the o
20390 6c 64 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ldest */.  int e
203a0 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
203b0 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
203c0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
203d0 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  = FTS5INDEX_QUER
203e0 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 69 6e  Y_NOOUTPUT;.  in
203f0 74 20 62 54 65 72 6d 57 72 69 74 74 65 6e 20 3d  t bTermWritten =
20400 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
20410 20 54 72 75 65 20 69 66 20 63 75 72 72 65 6e 74   True if current
20420 20 74 65 72 6d 20 61 6c 72 65 61 64 79 20 6f 75   term already ou
20430 74 70 75 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tput */..  asser
20440 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  t( iLvl<pStruct-
20450 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73  >nLevel );.  ass
20460 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ert( pLvl->nMerg
20470 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b  e<=pLvl->nSeg );
20480 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74  ..  memset(&writ
20490 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
204a0 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
204b0 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30   memset(&term, 0
204c0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
204d0 66 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76  fer));.  if( pLv
204e0 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20  l->nMerge ){.   
204f0 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72   pLvlOut = &pStr
20500 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
20510 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  +1];.    assert(
20520 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30   pLvlOut->nSeg>0
20530 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d   );.    nInput =
20540 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20   pLvl->nMerge;. 
20550 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
20560 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
20570 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20  ->nSeg-1];..    
20580 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c  fts5WriteInit(p,
20590 20 26 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e   &writer, pSeg->
205a0 69 53 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69  iSegid);.    wri
205b0 74 65 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20  ter.writer.pgno 
205c0 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
205d0 2b 31 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69  +1;.    writer.i
205e0 42 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65  BtPage = 0;.  }e
205f0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  lse{.    int iSe
20600 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61  gid = fts5Alloca
20610 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75  teSegid(p, pStru
20620 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74  ct);..    /* Ext
20630 65 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75  end the Fts5Stru
20640 63 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20  cture object as 
20650 72 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75  required to ensu
20660 72 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  re the output.  
20670 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69    ** segment exi
20680 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sts. */.    if( 
20690 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e  iLvl==pStruct->n
206a0 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20  Level-1 ){.     
206b0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64   fts5StructureAd
206c0 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
206d0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
206e0 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
206f0 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  uct;.    }.    f
20700 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
20710 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
20720 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c  pStruct, iLvl+1,
20730 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
20740 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
20750 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72      pLvl = &pStr
20760 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
20770 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d  ];.    pLvlOut =
20780 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
20790 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20  l[iLvl+1];..    
207a0 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c  fts5WriteInit(p,
207b0 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64   &writer, iSegid
207c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  );..    /* Add t
207d0 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74  he new segment t
207e0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76  o the output lev
207f0 65 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d  el */.    pSeg =
20800 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
20810 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a  pLvlOut->nSeg];.
20820 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65      pLvlOut->nSe
20830 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70  g++;.    pSeg->p
20840 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  gnoFirst = 1;.  
20850 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d    pSeg->iSegid =
20860 20 69 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74   iSegid;.    pSt
20870 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b  ruct->nSegment++
20880 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69  ;..    /* Read i
20890 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65  nput from all se
208a0 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  gments in the in
208b0 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
208c0 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e   nInput = pLvl->
208d0 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64  nSeg;.  }.  bOld
208e0 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e  est = (pLvlOut->
208f0 6e 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75  nSeg==1 && pStru
20900 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c  ct->nLevel==iLvl
20910 2b 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  +2);..  assert( 
20920 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72  iLvl>=0 );.  for
20930 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
20940 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c  w(p, pStruct, fl
20950 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c  ags, 0, 0, 0, iL
20960 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74  vl, nInput, &pIt
20970 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  er);.      fts5M
20980 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
20990 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  Iter)==0;.      
209a0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
209b0 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
209c0 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53  ).  ){.    Fts5S
209d0 65 67 49 74 65 72 20 2a 70 53 65 67 49 74 65 72  egIter *pSegIter
209e0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
209f0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
20a00 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
20a10 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20  int nPos;       
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20a30 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
20a40 69 7a 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20  ize field value 
20a50 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  */.    int nTerm
20a60 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  ;.    const u8 *
20a70 70 54 65 72 6d 3b 0a 0a 20 20 20 20 70 54 65 72  pTerm;..    pTer
20a80 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  m = fts5MultiIte
20a90 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54  rTerm(pIter, &nT
20aa0 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 54  erm);.    if( nT
20ab0 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d  erm!=term.n || m
20ac0 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72  emcmp(pTerm, ter
20ad0 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20  m.p, nTerm) ){. 
20ae0 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26       if( pnRem &
20af0 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72  & writer.nLeafWr
20b00 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20  itten>nRem ){.  
20b10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20b20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42     }.      fts5B
20b30 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
20b40 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70   &term, nTerm, p
20b50 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62 54 65  Term);.      bTe
20b60 72 6d 57 72 69 74 74 65 6e 20 3d 30 3b 0a 20 20  rmWritten =0;.  
20b70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
20b80 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69  k for key annihi
20b90 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  lation. */.    i
20ba0 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f  f( pSegIter->nPo
20bb0 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74  s==0 && (bOldest
20bc0 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e 62 44   || pSegIter->bD
20bd0 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  el==0) ) continu
20be0 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  e;..    if( p->r
20bf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20c00 62 54 65 72 6d 57 72 69 74 74 65 6e 3d 3d 30 20  bTermWritten==0 
20c10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
20c20 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20   is a new term. 
20c30 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f  Append a term to
20c40 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
20c50 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66 74  ent. */.      ft
20c60 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
20c70 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54  m(p, &writer, nT
20c80 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
20c90 20 20 20 62 54 65 72 6d 57 72 69 74 74 65 6e 20     bTermWritten 
20ca0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
20cb0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f  /* Append the ro
20cc0 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  wid to the outpu
20cd0 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49 54  t */.    /* WRIT
20ce0 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
20cf0 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
20d00 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69  endRowid(p, &wri
20d10 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74  ter, fts5MultiIt
20d20 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b  erRowid(pIter));
20d30 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
20d40 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
20d50 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ONE ){.      if(
20d60 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 20   pSegIter->bDel 
20d70 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
20d80 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
20d90 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65  t(&p->rc, &write
20da0 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30 29  r.writer.buf, 0)
20db0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
20dc0 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3e 30 20 29  egIter->nPos>0 )
20dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
20de0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20df0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74  nt(&p->rc, &writ
20e00 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30  er.writer.buf, 0
20e10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20e20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
20e30 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
20e40 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
20e50 74 20 64 61 74 61 20 74 6f 20 74 68 65 20 6f 75  t data to the ou
20e60 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 6e 50  tput */.      nP
20e70 6f 73 20 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e  os = pSegIter->n
20e80 50 6f 73 2a 32 20 2b 20 70 53 65 67 49 74 65 72  Pos*2 + pSegIter
20e90 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 66 74  ->bDel;.      ft
20ea0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
20eb0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72  rint(&p->rc, &wr
20ec0 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c  iter.writer.buf,
20ed0 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 66 74   nPos);.      ft
20ee0 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
20ef0 2c 20 70 53 65 67 49 74 65 72 2c 20 28 76 6f 69  , pSegIter, (voi
20f00 64 2a 29 26 77 72 69 74 65 72 2c 20 66 74 73 35  d*)&writer, fts5
20f10 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61  MergeChunkCallba
20f20 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ck);.    }.  }..
20f30 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c    /* Flush the l
20f40 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f  ast leaf page to
20f50 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f   disk. Set the o
20f60 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d  utput segment b-
20f70 74 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a  tree height.  **
20f80 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70   and last leaf p
20f90 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68  age number at th
20fa0 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f  e same time.  */
20fb0 0a 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69  .  fts5WriteFini
20fc0 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26  sh(p, &writer, &
20fd0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b  pSeg->pgnoLast);
20fe0 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74  ..  if( fts5Mult
20ff0 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
21000 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  r) ){.    int i;
21010 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
21020 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65  the redundant se
21030 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  gments from the 
21040 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
21050 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
21060 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Input; i++){.   
21070 20 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76     fts5DataRemov
21080 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c  eSegment(p, pLvl
21090 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64  ->aSeg[i].iSegid
210a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
210b0 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75   Remove the redu
210c0 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66  ndant segments f
210d0 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65  rom the input le
210e0 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  vel */.    if( p
210f0 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75  Lvl->nSeg!=nInpu
21100 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
21110 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Move = (pLvl->nS
21120 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73  eg - nInput) * s
21130 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
21140 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
21150 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d     memmove(pLvl-
21160 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53  >aSeg, &pLvl->aS
21170 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76  eg[nInput], nMov
21180 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  e);.    }.    pS
21190 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20  truct->nSegment 
211a0 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70  -= nInput;.    p
211b0 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e  Lvl->nSeg -= nIn
211c0 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e  put;.    pLvl->n
211d0 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69  Merge = 0;.    i
211e0 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  f( pSeg->pgnoLas
211f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  t==0 ){.      pL
21200 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20  vlOut->nSeg--;. 
21210 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53       pStruct->nS
21220 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a  egment--;.    }.
21230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
21240 65 72 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  ert( pSeg->pgnoL
21250 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73  ast>0 );.    fts
21260 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c  5TrimSegments(p,
21270 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76   pIter);.    pLv
21280 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70  l->nMerge = nInp
21290 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d  ut;.  }..  fts5M
212a0 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74  ultiIterFree(pIt
212b0 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  er);.  fts5Buffe
212c0 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
212d0 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52  if( pnRem ) *pnR
212e0 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65  em -= writer.nLe
212f0 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a  afWritten;.}../*
21300 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50 67  .** Do up to nPg
21310 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d 65   pages of autome
21320 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65 20  rge work on the 
21330 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  index..**.** Ret
21340 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
21350 63 68 61 6e 67 65 73 20 77 65 72 65 20 61 63 74  changes were act
21360 75 61 6c 6c 79 20 6d 61 64 65 2c 20 6f 72 20 66  ually made, or f
21370 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
21380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
21390 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20  s5IndexMerge(.  
213a0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
213d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
213e0 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
213f0 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
21400 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
21410 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
21420 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 2c 20  x */.  int nPg, 
21430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21440 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
21450 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f  of work to do */
21460 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 20 20 20 20  .  int nMin     
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75     /* Minimum nu
21490 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
214a0 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a   to merge */.){.
214b0 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67    int nRem = nPg
214c0 3b 0a 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30  ;.  int bRet = 0
214d0 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
214e0 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
214f0 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c 65 28  Struct;.  while(
21500 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63   nRem>0 && p->rc
21510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21520 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20     int iLvl;    
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21540 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72  * To iterate thr
21550 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
21560 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20     int iBestLvl 
21570 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
21580 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67  * Level offering
21590 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20   the most input 
215a0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
215b0 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20  int nBest = 0;  
215c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
215d0 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73  umber of input s
215e0 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20  egments on best 
215f0 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a  level */..    /*
21600 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f   Set iBestLvl to
21610 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65   the level to re
21620 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  ad input segment
21630 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61  s from. */.    a
21640 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
21650 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20  nLevel>0 );.    
21660 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
21670 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
21680 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
21690 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
216a0 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
216b0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
216c0 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  l];.      if( pL
216d0 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20  vl->nMerge ){.  
216e0 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
216f0 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a  nMerge>nBest ){.
21700 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74 4c            iBestL
21710 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  vl = iLvl;.     
21720 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76       nBest = pLv
21730 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20  l->nMerge;.     
21740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
21750 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
21760 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
21770 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20  >nBest ){.      
21780 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e    nBest = pLvl->
21790 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42  nSeg;.        iB
217a0 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20  estLvl = iLvl;. 
217b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
217c0 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73    /* If nBest is
217d0 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74   still 0, then t
217e0 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
217f0 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65   empty. */.#ifde
21800 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21810 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e     for(iLvl=0; n
21820 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c  Best==0 && iLvl<
21830 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
21840 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
21850 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
21860 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
21870 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23  eg==0 );.    }.#
21880 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e  endif..    if( n
21890 42 65 73 74 3c 6e 4d 69 6e 20 26 26 20 70 53 74  Best<nMin && pSt
218a0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65  ruct->aLevel[iBe
218b0 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30  stLvl].nMerge==0
218c0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
218d0 0a 20 20 20 20 7d 0a 20 20 20 20 62 52 65 74 20  .    }.    bRet 
218e0 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  = 1;.    fts5Ind
218f0 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
21900 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c  &pStruct, iBestL
21910 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
21920 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
21930 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d  E_OK && pStruct-
21940 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c  >aLevel[iBestLvl
21950 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ].nMerge==0 ){. 
21960 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
21970 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65  rePromote(p, iBe
21980 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74  stLvl+1, pStruct
21990 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
219a0 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
219b0 63 74 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  ct;.  return bRe
219c0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f  t;.}../*.** A to
219d0 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61  tal of nLeaf lea
219e0 66 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20  f pages of data 
219f0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c  has just been fl
21a00 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c  ushed to a level
21a10 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54  -0.** segment. T
21a20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64  his function upd
21a30 61 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 63  ates the write-c
21a40 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67  ounter according
21a50 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65  ly and, if.** ne
21a60 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d  cessary, perform
21a70 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  s incremental me
21a80 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20  rge work..**.** 
21a90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
21aa0 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
21ab0 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
21ac0 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
21ad0 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
21ae0 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
21af0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
21b00 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
21b10 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41 75 74  oid fts5IndexAut
21b20 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  omerge(.  Fts5In
21b30 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
21b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
21b50 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
21b60 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
21b70 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
21b80 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
21b90 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
21ba0 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
21bb0 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20 20   int nLeaf      
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
21be0 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73 74  tput leaves just
21bf0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20   written */.){. 
21c00 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
21c10 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f 6e  TE_OK && p->pCon
21c20 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e  fig->nAutomerge>
21c30 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  0 ){.    Fts5Str
21c40 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
21c50 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
21c60 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20 20 20   u64 nWrite;    
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c80 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
21c90 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  of write-counter
21ca0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72   */.    int nWor
21cb0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
21cc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21cd0 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74  of work-quanta t
21ce0 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20  o perform */.   
21cf0 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20 20   int nRem;      
21d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21d10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
21d20 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77   pages left to w
21d30 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rite */..    /* 
21d40 55 70 64 61 74 65 20 74 68 65 20 77 72 69 74 65  Update the write
21d50 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65 20  -counter. While 
21d60 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57  doing so, set nW
21d70 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69  ork. */.    nWri
21d80 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  te = pStruct->nW
21d90 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20  riteCounter;.   
21da0 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29 28 28   nWork = (int)((
21db0 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66 29  (nWrite + nLeaf)
21dc0 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
21dd0 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e   - (nWrite / p->
21de0 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20 20 20  nWorkUnit));.   
21df0 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
21e00 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66  Counter += nLeaf
21e10 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28 69 6e  ;.    nRem = (in
21e20 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20  t)(p->nWorkUnit 
21e30 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63  * nWork * pStruc
21e40 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20 20 20  t->nLevel);..   
21e50 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28   fts5IndexMerge(
21e60 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e 52 65  p, ppStruct, nRe
21e70 6d 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  m, p->pConfig->n
21e80 41 75 74 6f 6d 65 72 67 65 29 3b 0a 20 20 7d 0a  Automerge);.  }.
21e90 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
21ea0 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65  ts5IndexCrisisme
21eb0 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
21ec0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
21ed0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
21ee0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
21ef0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
21f00 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20   **ppStruct     
21f10 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
21f20 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
21f30 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  of index */.){. 
21f40 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73   const int nCris
21f50 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  is = p->pConfig-
21f60 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20  >nCrisisMerge;. 
21f70 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
21f80 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
21f90 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20  uct;.  int iLvl 
21fa0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
21fb0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
21fc0 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   || pStruct->nLe
21fd0 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vel>0 );.  while
21fe0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
21ff0 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  OK && pStruct->a
22000 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
22010 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20  >=nCrisis ){.   
22020 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
22030 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74  evel(p, &pStruct
22040 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20  , iLvl, 0);.    
22050 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
22060 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72  QLITE_OK || pStr
22070 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76  uct->nLevel>(iLv
22080 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35  l+1) );.    fts5
22090 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
220a0 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72  (p, iLvl+1, pStr
220b0 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b  uct);.    iLvl++
220c0 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63  ;.  }.  *ppStruc
220d0 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a  t = pStruct;.}..
220e0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
220f0 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73 35 49  ndexReturn(Fts5I
22100 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ndex *p){.  int 
22110 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d  rc = p->rc;.  p-
22120 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
22130 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22140 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
22150 46 74 73 35 46 6c 75 73 68 43 74 78 20 46 74 73  Fts5FlushCtx Fts
22160 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63  5FlushCtx;.struc
22170 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b  t Fts5FlushCtx {
22180 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
22190 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69  dx;.  Fts5SegWri
221a0 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a  ter writer; .};.
221b0 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42  ./*.** Buffer aB
221c0 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20  uf[] contains a 
221d0 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c  list of varints,
221e0 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67   all small enoug
221f0 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61  h to fit.** in a
22200 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   32-bit integer.
22210 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
22220 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
22230 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a  prefix of this .
22240 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74  ** list nMax byt
22250 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69  es or less in si
22260 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
22270 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65  t fts5PoslistPre
22280 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42  fix(const u8 *aB
22290 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20  uf, int nMax){. 
222a0 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20   int ret;.  u32 
222b0 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66  dummy;.  ret = f
222c0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61  ts5GetVarint32(a
222d0 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69  Buf, dummy);.  i
222e0 66 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20  f( ret<nMax ){. 
222f0 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
22300 20 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73       int i = fts
22310 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42  5GetVarint32(&aB
22320 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b  uf[ret], dummy);
22330 0a 20 20 20 20 20 20 69 66 28 20 28 72 65 74 20  .      if( (ret 
22340 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72  + i) > nMax ) br
22350 65 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b  eak;.      ret +
22360 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = i;.    }.  }. 
22370 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
22380 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  /*.** Flush the 
22390 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d  contents of in-m
223a0 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
223b0 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20   iHash to a new 
223c0 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d  level-0 .** segm
223d0 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73  ent on disk. Als
223e0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 72  o update the cor
223f0 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63  responding struc
22400 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
22410 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
22420 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
22430 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
22440 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
22450 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
22460 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
22470 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
22480 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
22490 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68  c void fts5Flush
224a0 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64 65  OneHash(Fts5Inde
224b0 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73  x *p){.  Fts5Has
224c0 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48  h *pHash = p->pH
224d0 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63  ash;.  Fts5Struc
224e0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
224f0 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69   int iSegid;.  i
22500 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22520 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61   /* Last leaf pa
22530 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67  ge number in seg
22540 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  ment */..  /* Ob
22550 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
22560 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74   to the index st
22570 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f  ructure and allo
22580 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  cate a new segme
22590 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74  nt-id.  ** for t
225a0 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73  he new level-0 s
225b0 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53  egment.  */.  pS
225c0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
225d0 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
225e0 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
225f0 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
22600 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74  truct);.  fts5St
22610 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
22620 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  e(p);..  if( iSe
22630 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  gid ){.    const
22640 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70   int pgsz = p->p
22650 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 20 20  Config->pgsz;.  
22660 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
22670 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
22680 61 69 6c 3b 0a 20 20 20 20 46 74 73 35 53 74 72  ail;.    Fts5Str
22690 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
226a0 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65  Seg;   /* New se
226b0 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74  gment within pSt
226c0 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74 73 35  ruct */.    Fts5
226d0 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
226e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
226f0 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
22700 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61  assemble leaf pa
22710 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75  ge */.    Fts5Bu
22720 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20 20 20  ffer *pPgidx;   
22730 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
22740 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73  r in which to as
22750 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a  semble pgidx */.
22760 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69 74  .    Fts5SegWrit
22770 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66  er writer;.    f
22780 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
22790 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
227a0 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77  ;..    pBuf = &w
227b0 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
227c0 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d 20 26  ;.    pPgidx = &
227d0 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67  writer.writer.pg
227e0 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73  idx;..    /* fts
227f0 35 57 72 69 74 65 49 6e 69 74 28 29 20 73 68 6f  5WriteInit() sho
22800 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69 61 6c  uld have initial
22810 69 7a 65 64 20 74 68 65 20 62 75 66 66 65 72 73  ized the buffers
22820 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79   to (most likely
22830 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78  ).    ** the max
22840 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69  imum space requi
22850 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  red. */.    asse
22860 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75  rt( p->rc || pBu
22870 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a  f->nSpace>=(pgsz
22880 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44   + FTS5_DATA_PAD
22890 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61 73 73  DING) );.    ass
228a0 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50  ert( p->rc || pP
228b0 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70  gidx->nSpace>=(p
228c0 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
228d0 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20  PADDING) );..   
228e0 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69   /* Begin scanni
228f0 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68 20  ng through hash 
22900 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 54  table entries. T
22910 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  his loop runs on
22920 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  ce for each.    
22930 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20  ** term/doclist 
22940 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
22950 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73 68   within the hash
22960 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69   table. */.    i
22970 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
22980 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
22990 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
229a0 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61  HashScanInit(pHa
229b0 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  sh, 0, 0);.    }
229c0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
229d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
229e0 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61  0==sqlite3Fts5Ha
229f0 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29  shScanEof(pHash)
22a00 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
22a10 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
22a20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
22a30 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
22a40 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
22a50 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20  8 *pDoclist;    
22a60 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
22a70 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  to doclist for t
22a80 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
22a90 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20    int nDoclist; 
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ab0 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
22ac0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
22ad0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
22ae0 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65   term for this e
22af0 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  ntry to disk. */
22b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
22b10 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
22b20 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
22b30 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c  pDoclist, &nDocl
22b40 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ist);.      fts5
22b50 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
22b60 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69 6e 74  p, &writer, (int
22b70 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20  )strlen(zTerm), 
22b80 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d  (const u8*)zTerm
22b90 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
22ba0 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52  ( writer.bFirstR
22bb0 6f 77 69 64 49 6e 50 61 67 65 3d 3d 30 20 29 3b  owidInPage==0 );
22bc0 0a 20 20 20 20 20 20 69 66 28 20 70 67 73 7a 3e  .      if( pgsz>
22bd0 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69  =(pBuf->n + pPgi
22be0 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74  dx->n + nDoclist
22bf0 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20   + 1) ){.       
22c00 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64   /* The entire d
22c10 6f 63 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oclist will fit 
22c20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
22c30 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eaf. */.        
22c40 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
22c50 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
22c60 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73  Doclist, nDoclis
22c70 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
22c80 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f  .        i64 iRo
22c90 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wid = 0;.       
22ca0 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
22cb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
22cc0 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  f = 0;..        
22cd0 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f  /* The entire do
22ce0 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66  clist will not f
22cf0 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e  it on this leaf.
22d00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   The following .
22d10 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20          ** loop 
22d20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
22d30 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74 68   the poslists th
22d40 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
22d50 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20  urrent .        
22d60 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a  ** doclist.  */.
22d70 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
22d80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22d90 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  && iOff<nDoclist
22da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   ){.          iO
22db0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
22dc0 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  int(&pDoclist[iO
22dd0 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
22de0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ta);.          i
22df0 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
22e00 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
22e10 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72        if( writer
22e20 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  .bFirstRowidInPa
22e30 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
22e40 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42    fts5PutU16(&pB
22e50 75 66 2d 3e 70 5b 30 5d 2c 20 28 75 31 36 29 70  uf->p[0], (u16)p
22e60 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69  Buf->n);   /* fi
22e70 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67  rst rowid on pag
22e80 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
22e90 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
22ea0 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
22eb0 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
22ec0 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  n], iRowid);.   
22ed0 20 20 20 20 20 20 20 20 20 77 72 69 74 65 72 2e           writer.
22ee0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
22ef0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
22f00 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64     fts5WriteDlid
22f10 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74  xAppend(p, &writ
22f20 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  er, iRowid);.   
22f30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22f40 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
22f50 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
22f60 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
22f70 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65  >p[pBuf->n], iDe
22f80 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
22f90 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
22fa0 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
22fb0 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20  f->nSpace );..  
22fc0 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65 74          if( eDet
22fd0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
22fe0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _NONE ){.       
22ff0 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44       if( iOff<nD
23000 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69  oclist && pDocli
23010 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20  st[iOff]==0 ){. 
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75               pBu
23030 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20  f->p[pBuf->n++] 
23040 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
23050 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20     iOff++;.     
23060 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66           if( iOf
23070 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44  f<nDoclist && pD
23080 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20  oclist[iOff]==0 
23090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
230a0 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d     pBuf->p[pBuf-
230b0 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  >n++] = 0;.     
230c0 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b             iOff+
230d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
230e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
230f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23100 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69   (pBuf->n + pPgi
23110 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a  dx->n)>=pgsz ){.
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
23130 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
23140 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20  (p, &writer);.  
23150 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23160 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23170 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75           int bDu
23180 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mmy;.           
23190 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
231a0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79         int nCopy
231b0 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73   = fts5GetPoslis
231c0 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b  tSize(&pDoclist[
231d0 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
231e0 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  Dummy);.        
231f0 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f      nCopy += nPo
23200 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  s;.            i
23210 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  f( (pBuf->n + pP
23220 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29  gidx->n + nCopy)
23230 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20   <= pgsz ){.    
23240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23250 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20   entire poslist 
23260 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
23270 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f  current leaf. So
23280 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20   copy.          
23290 20 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65      ** it in one
232a0 20 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   go. */.        
232b0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
232c0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
232d0 42 75 66 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69  Buf, &pDoclist[i
232e0 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  Off], nCopy);.  
232f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
23300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
23310 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73  * The entire pos
23320 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69  list will not fi
23330 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20  t on this leaf. 
23340 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20  So it needs.    
23350 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
23360 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73  be broken into s
23370 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ections. The onl
23380 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20  y qualification 
23390 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  being.          
233a0 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68      ** that each
233b0 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20   varint must be 
233c0 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75  stored contiguou
233d0 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  sly.  */.       
233e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20         const u8 
233f0 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f  *pPoslist = &pDo
23400 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20  clist[iOff];.   
23410 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
23420 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Pos = 0;.       
23430 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d         while( p-
23440 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
23450 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23460 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 70    int nSpace = p
23470 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20 2d 20  gsz - pBuf->n - 
23480 70 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20 20 20  pPgidx->n;.     
23490 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
234a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
234b0 20 20 20 20 20 20 69 66 28 20 28 6e 43 6f 70 79        if( (nCopy
234c0 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65   - iPos)<=nSpace
234d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
234e0 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20        n = nCopy 
234f0 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  - iPos;.        
23500 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23520 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74   n = fts5Poslist
23530 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74  Prefix(&pPoslist
23540 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b  [iPos], nSpace);
23550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23560 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
23570 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29     assert( n>0 )
23580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23590 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
235a0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
235b0 20 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d   &pPoslist[iPos]
235c0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
235d0 20 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b        iPos += n;
235e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
235f0 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
23600 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a  pPgidx->n)>=pgsz
23610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23620 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
23630 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69  lushLeaf(p, &wri
23640 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
23650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23660 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
23670 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b  >=nCopy ) break;
23680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
23690 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
236a0 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20             iOff 
236b0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  += nCopy;.      
236c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
236d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
236e0 2a 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74  * TODO2: Doclist
236f0 20 74 65 72 6d 69 6e 61 74 6f 72 20 77 72 69 74   terminator writ
23700 74 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ten here. */.   
23710 20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42     /* pBuf->p[pB
23720 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b  uf->n++] = '\0';
23730 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
23740 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d  ( pBuf->n<=pBuf-
23750 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20  >nSpace );.     
23760 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
23770 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b  ScanNext(pHash);
23780 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23790 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
237a0 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35  pHash);.    fts5
237b0 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
237c0 77 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73  writer, &pgnoLas
237d0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  t);..    /* Upda
237e0 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75 63  te the Fts5Struc
237f0 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69 74  ture. It is writ
23800 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
23810 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 0a  database by the.
23820 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63      ** fts5Struc
23830 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63 61  tureRelease() ca
23840 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ll below.  */.  
23850 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e    if( pStruct->n
23860 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Level==0 ){.    
23870 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41    fts5StructureA
23880 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ddLevel(&p->rc, 
23890 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d  &pStruct);.    }
238a0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
238b0 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
238c0 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30  ->rc, pStruct, 0
238d0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
238e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
238f0 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20  K ){.      pSeg 
23900 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
23910 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72  el[0].aSeg[ pStr
23920 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e  uct->aLevel[0].n
23930 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70  Seg++ ];.      p
23940 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
23950 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67  egid;.      pSeg
23960 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
23970 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
23980 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74  oLast = pgnoLast
23990 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
239a0 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20  >nSegment++;.   
239b0 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
239c0 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30  turePromote(p, 0
239d0 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
239e0 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f  .  fts5IndexAuto
239f0 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
23a00 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  t, pgnoLast);.  
23a10 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d  fts5IndexCrisism
23a20 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
23a30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
23a40 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75  reWrite(p, pStru
23a50 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ct);.  fts5Struc
23a60 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
23a70 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  uct);.}../*.** F
23a80 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74  lush any data st
23a90 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
23aa0 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
23ab0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
23ac0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
23ad0 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68  d fts5IndexFlush
23ae0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
23af0 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20 69    /* Unless it i
23b00 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20 74  s empty, flush t
23b10 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  he hash table to
23b20 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70   disk */.  if( p
23b30 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 29  ->nPendingData )
23b40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
23b50 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70 2d  >pHash );.    p-
23b60 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20  >nPendingData = 
23b70 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68  0;.    fts5Flush
23b80 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a  OneHash(p);.  }.
23b90 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 53 74  }..static Fts5St
23ba0 72 75 63 74 75 72 65 20 2a 66 74 73 35 49 6e 64  ructure *fts5Ind
23bb0 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74  exOptimizeStruct
23bc0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
23bd0 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  , .  Fts5Structu
23be0 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20  re *pStruct.){. 
23bf0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
23c00 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pNew = 0;.  int 
23c10 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
23c20 74 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20  ts5Structure);. 
23c30 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72   int nSeg = pStr
23c40 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  uct->nSegment;. 
23c50 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 69   int i;..  /* Fi
23c60 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73  gure out if this
23c70 20 73 74 72 75 63 74 75 72 65 20 72 65 71 75 69   structure requi
23c80 72 65 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  res optimization
23c90 2e 20 41 20 73 74 72 75 63 74 75 72 65 20 64 6f  . A structure do
23ca0 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 71 75  es.  ** not requ
23cb0 69 72 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ire optimization
23cc0 20 69 66 20 65 69 74 68 65 72 3a 0a 20 20 2a 2a   if either:.  **
23cd0 0a 20 20 2a 2a 20 20 2b 20 69 74 20 63 6f 6e 73  .  **  + it cons
23ce0 69 73 74 73 20 6f 66 20 66 65 77 65 72 20 74 68  ists of fewer th
23cf0 61 6e 20 74 77 6f 20 73 65 67 6d 65 6e 74 73 2c  an two segments,
23d00 20 6f 72 20 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c   or .  **  + all
23d10 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6f 6e   segments are on
23d20 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 2c   the same level,
23d30 20 6f 72 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20   or.  **  + all 
23d40 73 65 67 6d 65 6e 74 73 20 65 78 63 65 70 74 20  segments except 
23d50 6f 6e 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  one are currentl
23d60 79 20 69 6e 70 75 74 73 20 74 6f 20 61 20 6d 65  y inputs to a me
23d70 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  rge operation.. 
23d80 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20   **.  ** In the 
23d90 66 69 72 73 74 20 63 61 73 65 2c 20 72 65 74 75  first case, retu
23da0 72 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74 68 65 20  rn NULL. In the 
23db0 73 65 63 6f 6e 64 2c 20 69 6e 63 72 65 6d 65 6e  second, incremen
23dc0 74 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 0a  t the ref-count.
23dd0 20 20 2a 2a 20 6f 6e 20 2a 70 53 74 72 75 63 74    ** on *pStruct
23de0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 6f   and return a co
23df0 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  py of the pointe
23e00 72 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  r to it..  */.  
23e10 69 66 28 20 6e 53 65 67 3c 32 20 29 20 72 65 74  if( nSeg<2 ) ret
23e20 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
23e30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  ; i<pStruct->nLe
23e40 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  vel; i++){.    i
23e50 6e 74 20 6e 54 68 69 73 20 3d 20 70 53 74 72 75  nt nThis = pStru
23e60 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53  ct->aLevel[i].nS
23e70 65 67 3b 0a 20 20 20 20 69 66 28 20 6e 54 68 69  eg;.    if( nThi
23e80 73 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e 54 68 69  s==nSeg || (nThi
23e90 73 3d 3d 6e 53 65 67 2d 31 20 26 26 20 70 53 74  s==nSeg-1 && pSt
23ea0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
23eb0 6e 4d 65 72 67 65 3d 3d 6e 54 68 69 73 29 20 29  nMerge==nThis) )
23ec0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
23ed0 63 74 75 72 65 52 65 66 28 70 53 74 72 75 63 74  ctureRef(pStruct
23ee0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23ef0 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20  pStruct;.    }. 
23f00 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
23f10 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d  ct->aLevel[i].nM
23f20 65 72 67 65 3c 3d 6e 54 68 69 73 20 29 3b 0a 20  erge<=nThis );. 
23f30 20 7d 0a 0a 20 20 6e 42 79 74 65 20 2b 3d 20 28   }..  nByte += (
23f40 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
23f50 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  1) * sizeof(Fts5
23f60 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 3b  StructureLevel);
23f70 0a 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53  .  pNew = (Fts5S
23f80 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65  tructure*)sqlite
23f90 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
23fa0 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
23fb0 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
23fc0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
23fd0 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20  Level *pLvl;.   
23fe0 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20   nByte = nSeg * 
23ff0 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
24000 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
24010 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d    pNew->nLevel =
24020 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
24030 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52  +1;.    pNew->nR
24040 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77  ef = 1;.    pNew
24050 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20  ->nWriteCounter 
24060 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  = pStruct->nWrit
24070 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c  eCounter;.    pL
24080 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76  vl = &pNew->aLev
24090 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  el[pStruct->nLev
240a0 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61  el];.    pLvl->a
240b0 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
240c0 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
240d0 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
240e0 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65  ro(&p->rc, nByte
240f0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  );.    if( pLvl-
24100 3e 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69  >aSeg ){.      i
24110 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
24120 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74       int iSegOut
24130 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49   = 0;.      /* I
24140 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
24150 6c 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66 72 6f  ll segments, fro
24160 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65  m oldest to newe
24170 73 74 2e 20 41 64 64 20 74 68 65 6d 20 74 6f 0a  st. Add them to.
24180 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77        ** the new
24190 20 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a 65 63   Fts5Level objec
241a0 74 20 73 6f 20 74 68 61 74 20 70 4c 76 6c 2d 3e  t so that pLvl->
241b0 61 53 65 67 5b 30 5d 20 69 73 20 74 68 65 20 6f  aSeg[0] is the o
241c0 6c 64 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 73  ldest.      ** s
241d0 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61  egment in the da
241e0 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  ta structure.  *
241f0 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c  /.      for(iLvl
24200 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
24210 2d 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69 4c 76  -1; iLvl>=0; iLv
24220 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l--){.        fo
24230 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
24240 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
24250 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
24260 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  +){.          pL
24270 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74  vl->aSeg[iSegOut
24280 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  ] = pStruct->aLe
24290 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
242a0 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Seg];.          
242b0 69 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20  iSegOut++;.     
242c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
242d0 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e     pNew->nSegmen
242e0 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d  t = pLvl->nSeg =
242f0 20 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65   nSeg;.    }else
24300 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24310 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
24320 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
24330 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
24340 70 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  pNew;.}..int sql
24350 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74  ite3Fts5IndexOpt
24360 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20  imize(Fts5Index 
24370 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  *p){.  Fts5Struc
24380 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
24390 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
243a0 70 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61 73 73  pNew = 0;..  ass
243b0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
243c0 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49  TE_OK );.  fts5I
243d0 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20  ndexFlush(p);.  
243e0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
243f0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
24400 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
24410 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20  nvalidate(p);.. 
24420 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
24430 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49      pNew = fts5I
24440 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75  ndexOptimizeStru
24450 63 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  ct(p, pStruct);.
24460 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74    }.  fts5Struct
24470 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
24480 63 74 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ct);..  assert( 
24490 70 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65 77 2d  pNew==0 || pNew-
244a0 3e 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20  >nSegment>0 );. 
244b0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
244c0 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20 20 66   int iLvl;.    f
244d0 6f 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65 77 2d  or(iLvl=0; pNew-
244e0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
244f0 65 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29 7b 7d  eg==0; iLvl++){}
24500 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
24510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24520 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  pNew->aLevel[iLv
24530 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20  l].nSeg>0 ){.   
24540 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54     int nRem = FT
24550 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54  S5_OPT_WORK_UNIT
24560 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65  ;.      fts5Inde
24570 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
24580 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65  pNew, iLvl, &nRe
24590 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  m);.    }..    f
245a0 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
245b0 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  e(p, pNew);.    
245c0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
245d0 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  ease(pNew);.  }.
245e0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
245f0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d  dexReturn(p); .}
24600 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
24610 63 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c 65 6d  called to implem
24620 65 6e 74 20 74 68 65 20 73 70 65 63 69 61 6c 20  ent the special 
24630 22 56 41 4c 55 45 53 28 27 6d 65 72 67 65 27 2c  "VALUES('merge',
24640 20 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20 49 4e   $nMerge)".** IN
24650 53 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  SERT command..*/
24660 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24670 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49  IndexMerge(Fts5I
24680 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65  ndex *p, int nMe
24690 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75  rge){.  Fts5Stru
246a0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
246b0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
246c0 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74  ad(p);.  if( pSt
246d0 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
246e0 6e 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nMin = p->pConfi
246f0 67 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b 0a 20  g->nUsermerge;. 
24700 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24710 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20  Invalidate(p);. 
24720 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3c 30 20     if( nMerge<0 
24730 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
24740 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 66  ucture *pNew = f
24750 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
24760 53 74 72 75 63 74 28 70 2c 20 70 53 74 72 75 63  Struct(p, pStruc
24770 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74  t);.      fts5St
24780 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
24790 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
247a0 53 74 72 75 63 74 20 3d 20 70 4e 65 77 3b 0a 20  Struct = pNew;. 
247b0 20 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b 0a 20       nMin = 2;. 
247c0 20 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 6e 4d       nMerge = nM
247d0 65 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d 0a 20  erge*-1;.    }. 
247e0 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26     if( pStruct &
247f0 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  & pStruct->nLeve
24800 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  l ){.      if( f
24810 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c  ts5IndexMerge(p,
24820 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67   &pStruct, nMerg
24830 65 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20 20 20  e, nMin) ){.    
24840 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
24850 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63  eWrite(p, pStruc
24860 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
24870 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
24880 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
24890 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ct);.  }.  retur
248a0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
248b0 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(p);.}..static 
248c0 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64 52  void fts5AppendR
248d0 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
248e0 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c  x *p,.  i64 iDel
248f0 74 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a  ta,.  Fts5Iter *
24900 70 55 6e 75 73 65 64 2c 0a 20 20 46 74 73 35 42  pUnused,.  Fts5B
24910 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
24920 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
24930 6e 75 73 65 64 29 3b 0a 20 20 66 74 73 35 42 75  nused);.  fts5Bu
24940 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
24950 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69  (&p->rc, pBuf, i
24960 44 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69  Delta);.}..stati
24970 63 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e  c void fts5Appen
24980 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  dPoslist(.  Fts5
24990 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20  Index *p,.  i64 
249a0 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74  iDelta,.  Fts5It
249b0 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74  er *pMulti,.  Ft
249c0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29  s5Buffer *pBuf.)
249d0 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20  {.  int nData = 
249e0 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e 44 61  pMulti->base.nDa
249f0 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44  ta;.  assert( nD
24a00 61 74 61 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ata>0 );.  if( p
24a10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
24a20 26 26 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72  && 0==fts5Buffer
24a30 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75  Grow(&p->rc, pBu
24a40 66 2c 20 6e 44 61 74 61 2b 39 2b 39 29 20 29 7b  f, nData+9+9) ){
24a50 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
24a60 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
24a70 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 20  pBuf, iDelta);. 
24a80 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
24a90 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42  eAppendVarint(pB
24aa0 75 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a 20 20  uf, nData*2);.  
24ab0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24ac0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
24ad0 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 70 44   pMulti->base.pD
24ae0 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d  ata, nData);.  }
24af0 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
24b00 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
24b10 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73 74  Next(Fts5Doclist
24b20 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
24b30 75 38 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 61  u8 *p = pIter->a
24b40 50 6f 73 6c 69 73 74 20 2b 20 70 49 74 65 72 2d  Poslist + pIter-
24b50 3e 6e 53 69 7a 65 20 2b 20 70 49 74 65 72 2d 3e  >nSize + pIter->
24b60 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61 73 73  nPoslist;..  ass
24b70 65 72 74 28 20 70 49 74 65 72 2d 3e 61 50 6f 73  ert( pIter->aPos
24b80 6c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 3e  list );.  if( p>
24b90 3d 70 49 74 65 72 2d 3e 61 45 6f 66 20 29 7b 0a  =pIter->aEof ){.
24ba0 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c      pIter->aPosl
24bb0 69 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ist = 0;.  }else
24bc0 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  {.    i64 iDelta
24bd0 3b 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 35  ;..    p += fts5
24be0 47 65 74 56 61 72 69 6e 74 28 70 2c 20 28 75 36  GetVarint(p, (u6
24bf0 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
24c00 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
24c10 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f  = iDelta;..    /
24c20 2a 20 52 65 61 64 20 70 6f 73 69 74 69 6f 6e 20  * Read position 
24c30 6c 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20  list size */.   
24c40 20 69 66 28 20 70 5b 30 5d 20 26 20 30 78 38 30   if( p[0] & 0x80
24c50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
24c60 6f 73 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  os;.      pIter-
24c70 3e 6e 53 69 7a 65 20 3d 20 66 74 73 35 47 65 74  >nSize = fts5Get
24c80 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73  Varint32(p, nPos
24c90 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
24ca0 6e 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73  nPoslist = (nPos
24cb0 3e 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >>1);.    }else{
24cc0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50  .      pIter->nP
24cd0 6f 73 6c 69 73 74 20 3d 20 28 28 69 6e 74 29 28  oslist = ((int)(
24ce0 70 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20  p[0])) >> 1;.   
24cf0 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20     pIter->nSize 
24d00 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
24d10 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
24d20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = p;.  }.}..stat
24d30 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
24d40 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46  istIterInit(.  F
24d50 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
24d60 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49   .  Fts5DoclistI
24d70 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20  ter *pIter.){.  
24d80 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
24d90 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
24da0 3b 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  ;.  pIter->aPosl
24db0 69 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20  ist = pBuf->p;. 
24dc0 20 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26   pIter->aEof = &
24dd0 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
24de0 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49  ;.  fts5DoclistI
24df0 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
24e00 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41  }..#if 0./*.** A
24e10 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20  ppend a doclist 
24e20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  to buffer pBuf..
24e30 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
24e40 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
24e50 20 73 70 61 63 65 20 77 69 74 68 69 6e 20 74 68   space within th
24e60 65 20 62 75 66 66 65 72 20 68 61 73 20 61 6c 72  e buffer has alr
24e70 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c  eady been.** all
24e80 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ocated..*/.stati
24e90 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
24ea0 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 46  AppendDocid(.  F
24eb0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24ed0 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 69 74  * Buffer to writ
24ee0 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70  e to */.  i64 *p
24ef0 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20  iLastRowid,     
24f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
24f10 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f  OUT: Previous ro
24f20 77 69 64 20 77 72 69 74 74 65 6e 20 28 69 66 20  wid written (if 
24f30 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52  any) */.  i64 iR
24f40 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
24f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
24f60 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  id to append */.
24f70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  ){.  assert( pBu
24f80 66 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c  f->n!=0 || (*piL
24f90 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a  astRowid)==0 );.
24fa0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24fb0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
24fc0 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c  f, iRowid - *piL
24fd0 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69  astRowid);.  *pi
24fe0 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
24ff0 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64  id;.}.#endif..#d
25000 65 66 69 6e 65 20 66 74 73 35 4d 65 72 67 65 41  efine fts5MergeA
25010 70 70 65 6e 64 44 6f 63 69 64 28 70 42 75 66 2c  ppendDocid(pBuf,
25020 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f   iLastRowid, iRo
25030 77 69 64 29 20 7b 20 20 20 20 20 20 20 5c 0a 20  wid) {       \. 
25040 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
25050 3e 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52  >n!=0 || (iLastR
25060 6f 77 69 64 29 3d 3d 30 20 29 3b 20 20 20 20 20  owid)==0 );     
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
25080 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
25090 41 70 70 65 6e 64 56 61 72 69 6e 74 28 28 70 42  AppendVarint((pB
250a0 75 66 29 2c 20 28 69 52 6f 77 69 64 29 20 2d 20  uf), (iRowid) - 
250b0 28 69 4c 61 73 74 52 6f 77 69 64 29 29 3b 20 5c  (iLastRowid)); \
250c0 0a 20 20 28 69 4c 61 73 74 52 6f 77 69 64 29 20  .  (iLastRowid) 
250d0 3d 20 28 69 52 6f 77 69 64 29 3b 20 20 20 20 20  = (iRowid);     
250e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  \.}../*.** Swap 
25110 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
25120 62 75 66 66 65 72 20 2a 70 31 20 77 69 74 68 20  buffer *p1 with 
25130 74 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a 2f 0a  that of *p2..*/.
25140 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
25150 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42  BufferSwap(Fts5B
25160 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42  uffer *p1, Fts5B
25170 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74  uffer *p2){.  Ft
25180 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a  s5Buffer tmp = *
25190 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b  p1;.  *p1 = *p2;
251a0 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a  .  *p2 = tmp;.}.
251b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
251c0 35 4e 65 78 74 52 6f 77 69 64 28 46 74 73 35 42  5NextRowid(Fts5B
251d0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 6e 74  uffer *pBuf, int
251e0 20 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a 70 69   *piOff, i64 *pi
251f0 52 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20 69 20  Rowid){.  int i 
25200 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66 28 20  = *piOff;.  if( 
25210 69 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a 20 20  i>=pBuf->n ){.  
25220 20 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20    *piOff = -1;. 
25230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36 34 20   }else{.    u64 
25240 69 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f 66 66  iVal;.    *piOff
25250 20 3d 20 69 20 2b 20 73 71 6c 69 74 65 33 46 74   = i + sqlite3Ft
25260 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75  s5GetVarint(&pBu
25270 66 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c 29 3b  f->p[i], &iVal);
25280 0a 20 20 20 20 2a 70 69 52 6f 77 69 64 20 2b 3d  .    *piRowid +=
25290 20 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iVal;.  }.}../*
252a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
252b0 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 66 74  equivalent of ft
252c0 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
252d0 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 3d  ts() for detail=
252e0 6e 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20 49 6e  none mode..** In
252f0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 62   this case the b
25300 75 66 66 65 72 73 20 63 6f 6e 73 69 73 74 20 6f  uffers consist o
25310 66 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65  f a delta-encode
25320 64 20 6c 69 73 74 20 6f 66 20 72 6f 77 69 64 73  d list of rowids
25330 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
25340 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 52   void fts5MergeR
25350 6f 77 69 64 4c 69 73 74 73 28 0a 20 20 46 74 73  owidLists(.  Fts
25360 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25380 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
25390 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ect */.  Fts5Buf
253a0 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20  fer *p1,        
253b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
253c0 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  t list to merge 
253d0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
253e0 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  *p2             
253f0 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c       /* Second l
25400 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
25410 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 30 3b  ){.  int i1 = 0;
25420 0a 20 20 69 6e 74 20 69 32 20 3d 20 30 3b 0a 20  .  int i2 = 0;. 
25430 20 69 36 34 20 69 52 6f 77 69 64 31 20 3d 20 30   i64 iRowid1 = 0
25440 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 32 20  ;.  i64 iRowid2 
25450 3d 20 30 3b 0a 20 20 69 36 34 20 69 4f 75 74 20  = 0;.  i64 iOut 
25460 3d 20 30 3b 0a 0a 20 20 46 74 73 35 42 75 66 66  = 0;..  Fts5Buff
25470 65 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73 65 74  er out;.  memset
25480 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (&out, 0, sizeof
25490 28 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69 74 65  (out));.  sqlite
254a0 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
254b0 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31  &p->rc, &out, p1
254c0 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20  ->n + p2->n);.  
254d0 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
254e0 72 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78 74 52  rn;..  fts5NextR
254f0 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69  owid(p1, &i1, &i
25500 52 6f 77 69 64 31 29 3b 0a 20 20 66 74 73 35 4e  Rowid1);.  fts5N
25510 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69 32  extRowid(p2, &i2
25520 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20 77  , &iRowid2);.  w
25530 68 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c 20 69  hile( i1>=0 || i
25540 32 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  2>=0 ){.    if( 
25550 69 31 3e 3d 30 20 26 26 20 28 69 32 3c 30 20 7c  i1>=0 && (i2<0 |
25560 7c 20 69 52 6f 77 69 64 31 3c 69 52 6f 77 69 64  | iRowid1<iRowid
25570 32 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  2) ){.      asse
25580 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69  rt( iOut==0 || i
25590 52 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b 0a 20  Rowid1>iOut );. 
255a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
255b0 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
255c0 26 6f 75 74 2c 20 69 52 6f 77 69 64 31 20 2d 20  &out, iRowid1 - 
255d0 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f 75  iOut);.      iOu
255e0 74 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20 20 20  t = iRowid1;.   
255f0 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64     fts5NextRowid
25600 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69  (p1, &i1, &iRowi
25610 64 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  d1);.    }else{.
25620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
25630 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 32  ut==0 || iRowid2
25640 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66  >iOut );.      f
25650 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
25660 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20  endVarint(&out, 
25670 69 52 6f 77 69 64 32 20 2d 20 69 4f 75 74 29 3b  iRowid2 - iOut);
25680 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52  .      iOut = iR
25690 6f 77 69 64 32 3b 0a 20 20 20 20 20 20 69 66 28  owid2;.      if(
256a0 20 69 31 3e 3d 30 20 26 26 20 69 52 6f 77 69 64   i1>=0 && iRowid
256b0 31 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a 20 20  1==iRowid2 ){.  
256c0 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f        fts5NextRo
256d0 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52  wid(p1, &i1, &iR
256e0 6f 77 69 64 31 29 3b 0a 20 20 20 20 20 20 7d 0a  owid1);.      }.
256f0 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f        fts5NextRo
25700 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52  wid(p2, &i2, &iR
25710 6f 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a 20 20  owid2);.    }.  
25720 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  }..  fts5BufferS
25730 77 61 70 28 26 6f 75 74 2c 20 70 31 29 3b 0a 20  wap(&out, p1);. 
25740 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
25750 26 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &out);.}../*.** 
25760 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20 70  Buffers p1 and p
25770 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73  2 contain doclis
25780 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
25790 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e  n merges the con
257a0 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74  tent.** of the t
257b0 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65  wo doclists toge
257c0 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62 75  ther and sets bu
257d0 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20 72  ffer p1 to the r
257e0 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20  esult before.** 
257f0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
25800 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25810 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
25820 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d  de is left in p-
25830 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  >rc. If an error
25840 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
25850 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
25860 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
25870 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
25880 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65 66  id fts5MergePref
25890 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49  ixLists(.  Fts5I
258a0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
258b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
258c0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
258d0 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
258e0 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20  r *p1,          
258f0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25900 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f  list to merge */
25910 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
25920 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
25930 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73     /* Second lis
25940 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b  t to merge */.){
25950 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a  .  if( p2->n ){.
25960 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77      i64 iLastRow
25970 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35  id = 0;.    Fts5
25980 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b 0a  DoclistIter i1;.
25990 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
259a0 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73 35  ter i2;.    Fts5
259b0 42 75 66 66 65 72 20 6f 75 74 20 3d 20 7b 30 2c  Buffer out = {0,
259c0 20 30 2c 20 30 7d 3b 0a 20 20 20 20 46 74 73 35   0, 0};.    Fts5
259d0 42 75 66 66 65 72 20 74 6d 70 20 3d 20 7b 30 2c  Buffer tmp = {0,
259e0 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 2f 2a 20   0, 0};..    /* 
259f0 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  The maximum size
25a00 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   of the output i
25a10 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  s equal to the s
25a20 75 6d 20 6f 66 20 74 68 65 20 74 77 6f 20 0a 20  um of the two . 
25a30 20 20 20 2a 2a 20 69 6e 70 75 74 20 73 69 7a 65     ** input size
25a40 73 20 2b 20 31 20 76 61 72 69 6e 74 20 28 39 20  s + 1 varint (9 
25a50 62 79 74 65 73 29 2e 20 54 68 65 20 65 78 74 72  bytes). The extr
25a60 61 20 76 61 72 69 6e 74 20 69 73 20 62 65 63 61  a varint is beca
25a70 75 73 65 20 69 66 20 74 68 65 0a 20 20 20 20 2a  use if the.    *
25a80 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  * first rowid in
25a90 20 6f 6e 65 20 69 6e 70 75 74 20 69 73 20 61 20   one input is a 
25aa0 6c 61 72 67 65 20 6e 65 67 61 74 69 76 65 20 6e  large negative n
25ab0 75 6d 62 65 72 2c 20 61 6e 64 20 74 68 65 20 66  umber, and the f
25ac0 69 72 73 74 20 69 6e 0a 20 20 20 20 2a 2a 20 74  irst in.    ** t
25ad0 68 65 20 6f 74 68 65 72 20 61 20 6e 6f 6e 2d 6e  he other a non-n
25ae0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2c 20  egative number, 
25af0 74 68 65 20 64 65 6c 74 61 20 66 6f 72 20 74 68  the delta for th
25b00 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 0a 20  e non-negative. 
25b10 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 77 69 6c     ** number wil
25b20 6c 20 62 65 20 6c 61 72 67 65 72 20 6f 6e 20 64  l be larger on d
25b30 69 73 6b 20 74 68 61 6e 20 74 68 65 20 6c 69 74  isk than the lit
25b40 65 72 61 6c 20 69 6e 74 65 67 65 72 20 76 61 6c  eral integer val
25b50 75 65 0a 20 20 20 20 2a 2a 20 77 61 73 2e 20 20  ue.    ** was.  
25b60 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
25b70 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
25b80 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70  (&p->rc, &out, p
25b90 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 20 2b 20 39  1->n + p2->n + 9
25ba0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
25bb0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
25bc0 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a 20 20  nit(p1, &i1);.  
25bd0 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
25be0 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29 3b 0a  rInit(p2, &i2);.
25bf0 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
25c00 0a 20 20 20 20 20 20 69 66 28 20 69 31 2e 69 52  .      if( i1.iR
25c10 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 20 29  owid<i2.iRowid )
25c20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  {.        /* Cop
25c30 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31 20  y entry from i1 
25c40 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  */.        fts5M
25c50 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
25c60 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
25c70 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i1.iRowid);.  
25c80 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
25c90 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
25ca0 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74  out, i1.aPoslist
25cb0 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69 31  , i1.nPoslist+i1
25cc0 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  .nSize);.       
25cd0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
25ce0 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20  Next(&i1);.     
25cf0 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69     if( i1.aPosli
25d00 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  st==0 ) break;. 
25d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
25d20 65 20 69 66 28 20 69 32 2e 69 52 6f 77 69 64 21  e if( i2.iRowid!
25d30 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20  =i1.iRowid ){.  
25d40 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e        /* Copy en
25d50 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20  try from i2 */. 
25d60 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
25d70 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74  AppendDocid(&out
25d80 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32  , iLastRowid, i2
25d90 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
25da0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
25db0 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
25dc0 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32   i2.aPoslist, i2
25dd0 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53 69  .nPoslist+i2.nSi
25de0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ze);.        fts
25df0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
25e00 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 69  (&i2);.        i
25e10 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i2.aPoslist==
25e20 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
25e30 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20   }.      else{. 
25e40 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20         /* Merge 
25e50 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e  the two position
25e60 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20   lists. */ .    
25e70 20 20 20 20 69 36 34 20 69 50 6f 73 31 20 3d 20      i64 iPos1 = 
25e80 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  0;.        i64 i
25e90 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  Pos2 = 0;.      
25ea0 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20 30 3b    int iOff1 = 0;
25eb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
25ec0 66 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  f2 = 0;.        
25ed0 75 38 20 2a 61 31 20 3d 20 26 69 31 2e 61 50 6f  u8 *a1 = &i1.aPo
25ee0 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b  slist[i1.nSize];
25ef0 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 32 20  .        u8 *a2 
25f00 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73 74 5b 69  = &i2.aPoslist[i
25f10 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20 20 20  2.nSize];..     
25f20 20 20 20 69 36 34 20 69 50 72 65 76 20 3d 20 30     i64 iPrev = 0
25f30 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  ;.        Fts5Po
25f40 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69 74  slistWriter writ
25f50 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  er;.        mems
25f60 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73  et(&writer, 0, s
25f70 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a  izeof(writer));.
25f80 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
25f90 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
25fa0 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
25fb0 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
25fc0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
25fd0 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20  ro(&tmp);.      
25fe0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
25ff0 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
26000 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  &tmp, i1.nPoslis
26010 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69 73 74 29  t + i2.nPoslist)
26020 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
26030 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
26040 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
26050 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
26060 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  1, i1.nPoslist, 
26070 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b  &iOff1, &iPos1);
26080 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26090 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
260a0 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  4(a2, i2.nPoslis
260b0 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73  t, &iOff2, &iPos
260c0 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
260d0 72 74 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20  rt( iPos1>=0 && 
260e0 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20 20 20  iPos2>=0 );..   
260f0 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69       if( iPos1<i
26100 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos2 ){.        
26110 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
26120 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26  listSafeAppend(&
26130 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f  tmp, &iPrev, iPo
26140 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  s1);.          s
26150 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
26160 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e  tNext64(a1, i1.n
26170 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c  Poslist, &iOff1,
26180 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20   &iPos1);.      
26190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
261a0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
261b0 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
261c0 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
261d0 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
261e0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
261f0 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e  stNext64(a2, i2.
26200 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32  nPoslist, &iOff2
26210 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  , &iPos2);.     
26220 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
26230 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50  ( iPos1>=0 && iP
26240 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  os2>=0 ){.      
26250 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
26260 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26270 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a 20  iPos1<iPos2 ){. 
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26290 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29 7b   iPos1!=iPrev ){
262a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
262b0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
262c0 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74  istSafeAppend(&t
262d0 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73  mp, &iPrev, iPos
262e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
262f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26300 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
26310 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69  listNext64(a1, i
26320 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
26330 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20  f1, &iPos1);.   
26340 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
26350 50 6f 73 31 3c 30 20 29 20 62 72 65 61 6b 3b 0a  Pos1<0 ) break;.
26360 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
26370 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
26380 20 61 73 73 65 72 74 28 20 69 50 6f 73 32 21 3d   assert( iPos2!=
26390 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20 20  iPrev );.       
263a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
263b0 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70  s5PoslistSafeApp
263c0 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76  end(&tmp, &iPrev
263d0 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20  , iPos2);.      
263e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
263f0 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
26400 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  (a2, i2.nPoslist
26410 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32  , &iOff2, &iPos2
26420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26430 20 69 66 28 20 69 50 6f 73 32 3c 30 20 29 20 62   if( iPos2<0 ) b
26440 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
26450 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
26460 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
26470 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d 30 20     if( iPos1>=0 
26480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
26490 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29 7b   iPos1!=iPrev ){
264a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
264b0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
264c0 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
264d0 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a  &iPrev, iPos1);.
264e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
264f0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
26500 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
26510 74 6d 70 2c 20 26 61 31 5b 69 4f 66 66 31 5d 2c  tmp, &a1[iOff1],
26520 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2d 69 4f 66   i1.nPoslist-iOf
26530 66 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  f1);.        }el
26540 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
26550 73 65 72 74 28 20 69 50 6f 73 32 3e 3d 30 20 26  sert( iPos2>=0 &
26560 26 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29  & iPos2!=iPrev )
26570 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
26580 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61  te3Fts5PoslistSa
26590 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  feAppend(&tmp, &
265a0 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20  iPrev, iPos2);. 
265b0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
265c0 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
265d0 62 28 26 74 6d 70 2c 20 26 61 32 5b 69 4f 66 66  b(&tmp, &a2[iOff
265e0 32 5d 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2d  2], i2.nPoslist-
265f0 69 4f 66 66 32 29 3b 0a 20 20 20 20 20 20 20 20  iOff2);.        
26600 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52  }..        /* WR
26610 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
26620 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
26630 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
26640 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e  rint(&out, tmp.n
26650 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66   * 2);.        f
26660 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
26670 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d  endBlob(&out, tm
26680 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20  p.p, tmp.n);.   
26690 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
266a0 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20  IterNext(&i1);. 
266b0 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69         fts5Docli
266c0 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b  stIterNext(&i2);
266d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31 2e  .        if( i1.
266e0 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69  aPoslist==0 || i
266f0 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20  2.aPoslist==0 ) 
26700 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26710 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 31     }..    if( i1
26720 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20  .aPoslist ){.   
26730 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
26740 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
26750 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f  astRowid, i1.iRo
26760 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35  wid);.      fts5
26770 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
26780 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61 50  Blob(&out, i1.aP
26790 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45 6f 66 20  oslist, i1.aEof 
267a0 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b 0a  - i1.aPoslist);.
267b0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
267c0 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 20 29  f( i2.aPoslist )
267d0 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72 67  {.      fts5Merg
267e0 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75  eAppendDocid(&ou
267f0 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  t, iLastRowid, i
26800 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
26810 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
26820 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20  ppendBlob(&out, 
26830 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e  i2.aPoslist, i2.
26840 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f 73 6c 69  aEof - i2.aPosli
26850 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  st);.    }.    a
26860 73 73 65 72 74 28 20 6f 75 74 2e 6e 3c 3d 28 70  ssert( out.n<=(p
26870 31 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20 29 3b  1->n+p2->n+9) );
26880 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
26890 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20  Set(&p->rc, p1, 
268a0 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20  out.n, out.p);. 
268b0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
268c0 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74 73  e(&tmp);.    fts
268d0 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75 74  5BufferFree(&out
268e0 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
268f0 20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70 50   void fts5SetupP
26900 72 65 66 69 78 49 74 65 72 28 0a 20 20 46 74 73  refixIter(.  Fts
26910 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26930 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66 72  Index to read fr
26940 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  om */.  int bDes
26950 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26960 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26970 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f  for "ORDER BY ro
26980 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20 63  wid DESC" */.  c
26990 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c  onst u8 *pToken,
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
269b0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
269c0 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61  ing prefix to ma
269d0 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  tch */.  int nTo
269e0 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
269f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
26a00 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65   of buffer pToke
26a10 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  n in bytes */.  
26a20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
26a30 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
26a40 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63  /* Restrict matc
26a50 68 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f 6c  hes to these col
26a60 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49 74  umns */.  Fts5It
26a70 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20  er **ppIter     
26a80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
26a90 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   iterator */.){.
26aa0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
26ab0 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
26ac0 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20  Buffer *aBuf;.  
26ad0 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d  const int nBuf =
26ae0 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78   32;..  void (*x
26af0 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64 65 78  Merge)(Fts5Index
26b00 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
26b10 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20  Fts5Buffer*);.  
26b20 76 6f 69 64 20 28 2a 78 41 70 70 65 6e 64 29 28  void (*xAppend)(
26b30 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36 34 2c  Fts5Index*, i64,
26b40 20 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35   Fts5Iter*, Fts5
26b50 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66 28 20  Buffer*);.  if( 
26b60 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
26b70 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
26b80 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78 4d 65  _NONE ){.    xMe
26b90 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65 52  rge = fts5MergeR
26ba0 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20 20 78  owidLists;.    x
26bb0 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70 70  Append = fts5App
26bc0 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73  endRowid;.  }els
26bd0 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d 20  e{.    xMerge = 
26be0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
26bf0 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e  ists;.    xAppen
26c00 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64 50 6f  d = fts5AppendPo
26c10 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 42  slist;.  }..  aB
26c20 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72  uf = (Fts5Buffer
26c30 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
26c40 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  p, sizeof(Fts5Bu
26c50 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70  ffer)*nBuf);.  p
26c60 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
26c70 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
26c80 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70 53    if( aBuf && pS
26c90 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e  truct ){.    con
26ca0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46  st int flags = F
26cb0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
26cc0 43 41 4e 20 0a 20 20 20 20 20 20 20 20 20 20 20  CAN .           
26cd0 20 20 20 20 20 20 20 20 20 7c 20 46 54 53 35 49           | FTS5I
26ce0 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45  NDEX_QUERY_SKIPE
26cf0 4d 50 54 59 20 0a 20 20 20 20 20 20 20 20 20 20  MPTY .          
26d00 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53 35            | FTS5
26d10 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55  INDEX_QUERY_NOOU
26d20 54 50 55 54 3b 0a 20 20 20 20 69 6e 74 20 69 3b  TPUT;.    int i;
26d30 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
26d40 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
26d50 35 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20 20  5Iter *p1 = 0;  
26d60 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75     /* Iterator u
26d70 73 65 64 20 74 6f 20 67 61 74 68 65 72 20 64 61  sed to gather da
26d80 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f  ta from index */
26d90 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
26da0 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35 42 75  Data;.    Fts5Bu
26db0 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 20 20  ffer doclist;.  
26dc0 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
26dd0 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   1;..    memset(
26de0 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a  &doclist, 0, siz
26df0 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20  eof(doclist));. 
26e00 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
26e10 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
26e20 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74 2c 20  flags, pColset, 
26e30 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20  pToken, nToken, 
26e40 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20  -1, 0, &p1);.   
26e50 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
26e60 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 31 29  utCb(&p->rc, p1)
26e70 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20 6e 6f  ;.    for( /* no
26e80 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20 20 20  -op */ ;.       
26e90 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
26ea0 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20  f(p, p1)==0;.   
26eb0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
26ec0 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c 20 26  erNext2(p, p1, &
26ed0 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20 29 7b  bNewTerm).    ){
26ee0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
26ef0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 31 2d 3e  er *pSeg = &p1->
26f00 61 53 65 67 5b 20 70 31 2d 3e 61 46 69 72 73 74  aSeg[ p1->aFirst
26f10 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
26f20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20      int nTerm = 
26f30 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20  pSeg->term.n;.  
26f40 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54      const u8 *pT
26f50 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d  erm = pSeg->term
26f60 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e 78 53  .p;.      p1->xS
26f70 65 74 4f 75 74 70 75 74 73 28 70 31 2c 20 70 53  etOutputs(p1, pS
26f80 65 67 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  eg);..      asse
26f90 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70 54  rt_nc( memcmp(pT
26fa0 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e  oken, pTerm, MIN
26fb0 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29  (nToken, nTerm))
26fc0 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  <=0 );.      if(
26fd0 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20   bNewTerm ){.   
26fe0 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e       if( nTerm<n
26ff0 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  Token || memcmp(
27000 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e  pToken, pTerm, n
27010 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a  Token) ) break;.
27020 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
27030 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44 61 74  f( p1->base.nDat
27040 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  a==0 ) continue;
27050 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e  ..      if( p1->
27060 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69 4c 61  base.iRowid<=iLa
27070 73 74 52 6f 77 69 64 20 26 26 20 64 6f 63 6c 69  stRowid && docli
27080 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  st.n>0 ){.      
27090 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
270a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
270b0 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a  oclist.n; i++){.
270c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
270d0 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20  ( i<nBuf );.    
270e0 20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b 69        if( aBuf[i
270f0 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ].n==0 ){.      
27100 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
27110 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26  Swap(&doclist, &
27120 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
27130 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
27140 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a  Zero(&doclist);.
27150 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27160 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 4d 65  .            xMe
27170 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c  rge(p, &doclist,
27180 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
27190 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
271a0 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29  erZero(&aBuf[i])
271b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
271c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
271d0 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
271e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 78        }..      x
271f0 41 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e 62 61  Append(p, p1->ba
27200 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73 74 52  se.iRowid-iLastR
27210 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f 63 6c 69  owid, p1, &docli
27220 73 74 29 3b 0a 20 20 20 20 20 20 69 4c 61 73 74  st);.      iLast
27230 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61 73 65  Rowid = p1->base
27240 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a  .iRowid;.    }..
27250 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
27260 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Buf; i++){.     
27270 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
27280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27290 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c   xMerge(p, &docl
272a0 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
272b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
272c0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61 42  s5BufferFree(&aB
272d0 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  uf[i]);.    }.  
272e0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
272f0 72 65 65 28 70 31 29 3b 0a 0a 20 20 20 20 70 44  ree(p1);..    pD
27300 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  ata = fts5IdxMal
27310 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
27320 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69 73  s5Data) + doclis
27330 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 44  t.n);.    if( pD
27340 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61  ata ){.      pDa
27350 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44  ta->p = (u8*)&pD
27360 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44  ata[1];.      pD
27370 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d  ata->nn = pData-
27380 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73  >szLeaf = doclis
27390 74 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t.n;.      if( d
273a0 6f 63 6c 69 73 74 2e 6e 20 29 20 6d 65 6d 63 70  oclist.n ) memcp
273b0 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c  y(pData->p, docl
273c0 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e  ist.p, doclist.n
273d0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
273e0 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44  tiIterNew2(p, pD
273f0 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74  ata, bDesc, ppIt
27400 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
27410 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64  ts5BufferFree(&d
27420 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  oclist);.  }..  
27430 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
27440 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
27450 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42   sqlite3_free(aB
27460 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  uf);.}.../*.** I
27470 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c  ndicate that all
27480 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
27490 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  s to sqlite3Fts5
274a0 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72  IndexWrite() per
274b0 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tain.** to the d
274c0 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77  ocument with row
274d0 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  id iRowid..*/.in
274e0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
274f0 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73  exBeginWrite(Fts
27500 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62  5Index *p, int b
27510 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77  Delete, i64 iRow
27520 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  id){.  assert( p
27530 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
27540 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
27550 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
27560 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
27570 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
27580 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  cated */.  if( p
27590 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->pHash==0 ){.  
275a0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
275b0 33 46 74 73 35 48 61 73 68 4e 65 77 28 70 2d 3e  3Fts5HashNew(p->
275c0 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70 48 61  pConfig, &p->pHa
275d0 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67  sh, &p->nPending
275e0 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Data);.  }..  /*
275f0 20 46 6c 75 73 68 20 74 68 65 20 68 61 73 68 20   Flush the hash 
27600 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 69 66  table to disk if
27610 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
27620 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72  f( iRowid<p->iWr
27630 69 74 65 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20  iteRowid .   || 
27640 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69  (iRowid==p->iWri
27650 74 65 52 6f 77 69 64 20 26 26 20 70 2d 3e 62 44  teRowid && p->bD
27660 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  elete==0).   || 
27670 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  (p->nPendingData
27680 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   > p->pConfig->n
27690 48 61 73 68 53 69 7a 65 29 20 0a 20 20 29 7b 0a  HashSize) .  ){.
276a0 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75      fts5IndexFlu
276b0 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d  sh(p);.  }..  p-
276c0 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69  >iWriteRowid = i
276d0 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c  Rowid;.  p->bDel
276e0 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20  ete = bDelete;. 
276f0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
27700 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
27710 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61  *.** Commit data
27720 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
27730 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27740 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20  xSync(Fts5Index 
27750 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
27760 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
27770 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c  );.  fts5IndexFl
27780 75 73 68 28 70 29 3b 0a 20 20 66 74 73 35 43 6c  ush(p);.  fts5Cl
27790 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
277a0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
277b0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
277c0 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20  .** Discard any 
277d0 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
277e0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
277f0 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74  h tables. Do not
27800 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20   write it.** to 
27810 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
27820 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75  ditionally, assu
27830 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  me that the cont
27840 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61  ents of the %_da
27850 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20  ta.** table may 
27860 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20  have changed on 
27870 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d  disk. So any in-
27880 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66  memory caches of
27890 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f   %_data .** reco
278a0 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61  rds must be inva
278b0 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  lidated..*/.int 
278c0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
278d0 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64  Rollback(Fts5Ind
278e0 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c  ex *p){.  fts5Cl
278f0 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
27900 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
27910 44 61 74 61 28 70 29 3b 0a 20 20 66 74 73 35 53  Data(p);.  fts5S
27920 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
27930 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65  te(p);.  /* asse
27940 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
27950 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74  E_OK ); */.  ret
27960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27970 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61  ../*.** The %_da
27980 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  ta table is comp
27990 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65  letely empty whe
279a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
279b0 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a  is called. This.
279c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75  ** function popu
279d0 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74 68  lates it with th
279e0 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74  e initial struct
279f0 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ure objects for 
27a00 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61  each index,.** a
27a10 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  nd the initial v
27a20 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61  ersion of the "a
27a30 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
27a40 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f  (a zero-byte blo
27a50 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
27a60 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69  e3Fts5IndexReini
27a70 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
27a80 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
27a90 20 73 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74   s;.  fts5Struct
27aa0 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
27ab0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
27ac0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
27ad0 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35  ucture));.  fts5
27ae0 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
27af0 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
27b00 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c  , (const u8*)"",
27b10 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   0);.  fts5Struc
27b20 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29  tureWrite(p, &s)
27b30 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
27b40 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
27b50 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
27b60 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ew Fts5Index han
27b70 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65  dle. If the bCre
27b80 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ate argument is 
27b90 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20  true, create.** 
27ba0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
27bb0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f  he underlying %_
27bc0 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
27bd0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
27be0 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
27bf0 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
27c00 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
27c10 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
27c20 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20  erwise, set *pp 
27c30 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75  to NULL and retu
27c40 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
27c50 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
27c60 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27c70 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66  Open(.  Fts5Conf
27c80 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
27c90 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20  int bCreate, .  
27ca0 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a  Fts5Index **pp,.
27cb0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
27cc0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
27cd0 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e  ITE_OK;.  Fts5In
27ce0 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
27cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
27d00 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70   object */..  *p
27d10 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64  p = p = (Fts5Ind
27d20 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  ex*)sqlite3Fts5M
27d30 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
27d40 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29  izeof(Fts5Index)
27d50 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
27d70 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
27d80 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b  ig;.    p->nWork
27d90 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b  Unit = FTS5_WORK
27da0 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44  _UNIT;.    p->zD
27db0 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ataTbl = sqlite3
27dc0 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
27dd0 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e   "%s_data", pCon
27de0 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  fig->zName);.   
27df0 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c   if( p->zDataTbl
27e00 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20   && bCreate ){. 
27e10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27e20 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
27e30 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  (.          pCon
27e40 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
27e50 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
27e60 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
27e70 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
27e80 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72    );.      if( r
27e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27ea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27eb0 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
27ec0 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64  ble(pConfig, "id
27ed0 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  x", .           
27ee0 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70   "segid, term, p
27ef0 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  gno, PRIMARY KEY
27f00 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20  (segid, term)", 
27f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  .            1, 
27f20 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b  pzErr.        );
27f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27f40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27f50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27f60 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27f70 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20  xReinit(p);.    
27f80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27f90 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
27fa0 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
27fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27fc0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
27fd0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c  lite3Fts5IndexCl
27fe0 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20  ose(p);.    *pp 
27ff0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
28000 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
28010 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70  lose a handle op
28020 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
28030 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
28040 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
28050 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
28060 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
28070 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
28080 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28090 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  _OK;.  if( p ){.
280a0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
280b0 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
280c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
280d0 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 20  validate(p);.   
280e0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
280f0 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20  e(p->pWriter);. 
28100 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
28110 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  ize(p->pDeleter)
28120 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
28130 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72  nalize(p->pIdxWr
28140 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
28150 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
28160 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20  IdxDeleter);.   
28170 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
28180 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  e(p->pIdxSelect)
28190 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
281a0 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61 74 61 56  nalize(p->pDataV
281b0 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c  ersion);.    sql
281c0 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65  ite3Fts5HashFree
281d0 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
281e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
281f0 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73  zDataTbl);.    s
28200 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
28210 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
28230 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
28240 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
28250 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68  ng utf-8 text th
28260 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e  at is n bytes in
28270 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72   .** size. Retur
28280 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
28290 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68  bytes in the nCh
282a0 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65  ar character pre
282b0 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75  fix of the.** bu
282c0 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68  ffer, or 0 if th
282d0 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
282e0 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  n nChar characte
282f0 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a  rs in total..*/.
28300 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
28310 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
28320 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  elen(.  const ch
28330 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42  ar *p, .  int nB
28340 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61  yte, .  int nCha
28350 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  r.){.  int n = 0
28360 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
28370 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69  (i=0; i<nChar; i
28380 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  ++){.    if( n>=
28390 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e 20 30  nByte ) return 0
283a0 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20  ;      /* Input 
283b0 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
283c0 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20  han nChar chars 
283d0 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69  */.    if( (unsi
283e0 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d  gned char)p[n++]
283f0 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
28400 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30  while( (p[n] & 0
28410 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20  xc0)==0x80 ){.  
28420 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
28430 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20     if( n>=nByte 
28440 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
28450 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28460 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
28470 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65  pIn is a UTF-8 e
28480 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e  ncoded string, n
28490 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  In bytes in size
284a0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
284b0 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64  ber of.** unicod
284c0 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  e characters in 
284d0 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  the string..*/.s
284e0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
284f0 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74  dexCharlen(const
28500 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20   char *pIn, int 
28510 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  nIn){.  int nCha
28520 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
28530 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a    .  int i = 0;.
28540 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29    while( i<nIn )
28550 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67  {.    if( (unsig
28560 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b  ned char)pIn[i++
28570 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20  ]>=0xc0 ){.     
28580 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26   while( i<nIn &&
28590 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29   (pIn[i] & 0xc0)
285a0 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20  ==0x80 ) i++;.  
285b0 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b    }.    nChar++;
285c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
285d0 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  har;.}../*.** In
285e0 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64  sert or remove d
285f0 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ata to or from t
28600 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74  he index. Each t
28610 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  ime a document i
28620 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f  s .** added to o
28630 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  r removed from t
28640 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66  he index, this f
28650 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
28660 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  d one or more.**
28670 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   times..**.** Fo
28680 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20  r an insert, it 
28690 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f  must be called o
286a0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b  nce for each tok
286b0 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f  en in the new do
286c0 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68  cument..** If th
286d0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
286e0 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74   delete, it must
286f0 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c   be called (at l
28700 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65  east) once for e
28710 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f  ach.** unique to
28720 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  ken in the docum
28730 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c  ent with an iCol
28740 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e   value less than
28750 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a   zero. The iPos.
28760 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
28770 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c  gnored for a del
28780 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ete..*/.int sqli
28790 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
287a0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
287b0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
287c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
287d0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
287e0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28800 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
28810 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
28820 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
28830 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28850 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
28860 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
28870 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
28880 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
28890 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
288a0 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
288b0 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
288c0 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  x */.){.  int i;
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
288f0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
28900 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
28910 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28920 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
28930 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28940 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
28950 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
28960 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72  Config;..  asser
28970 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
28980 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
28990 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44   (iCol<0)==p->bD
289a0 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  elete );..  /* A
289b0 64 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  dd the entry to 
289c0 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69  the main terms i
289d0 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ndex. */.  rc = 
289e0 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57  sqlite3Fts5HashW
289f0 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70  rite(.      p->p
28a00 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52  Hash, p->iWriteR
28a10 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
28a20 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  , FTS5_MAIN_PREF
28a30 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  IX, pToken, nTok
28a40 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69  en.  );..  for(i
28a50 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e  =0; i<pConfig->n
28a60 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51  Prefix && rc==SQ
28a70 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
28a80 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68     const int nCh
28a90 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50  ar = pConfig->aP
28aa0 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e  refix[i];.    in
28ab0 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
28ac0 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65  3Fts5IndexCharle
28ad0 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65  nToBytelen(pToke
28ae0 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72  n, nToken, nChar
28af0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
28b00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
28b10 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
28b20 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20  ite(p->pHash, . 
28b30 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69           p->iWri
28b40 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
28b50 50 6f 73 2c 20 28 63 68 61 72 29 28 46 54 53 35  Pos, (char)(FTS5
28b60 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31  _MAIN_PREFIX+i+1
28b70 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20  ), pToken,.     
28b80 20 20 20 20 20 6e 42 79 74 65 0a 20 20 20 20 20       nByte.     
28b90 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
28ba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28bb0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
28bc0 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72  iterator to iter
28bd0 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72  ate though all r
28be0 6f 77 69 64 20 74 68 61 74 20 6d 61 74 63 68 20  owid that match 
28bf0 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  the .** specifie
28c00 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e  d token or token
28c10 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20   prefix..*/.int 
28c20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28c30 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64  Query(.  Fts5Ind
28c40 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
28c50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
28c60 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a  index to query *
28c70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28c80 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
28c90 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72  en, /* Token (or
28ca0 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65 72   prefix) to quer
28cb0 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66  y for */.  int f
28cc0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
28cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
28ce0 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
28cf0 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f  QUERY_X flags */
28d00 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
28d10 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
28d20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73     /* Match thes
28d30 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a  e columns only *
28d40 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
28d50 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20  r **ppIter      
28d60 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
28d70 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
28d80 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  */.){.  Fts5Conf
28d90 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
28da0 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35  >pConfig;.  Fts5
28db0 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a  Iter *pRet = 0;.
28dc0 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
28dd0 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20   = {0, 0, 0};.. 
28de0 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59   /* If the QUERY
28df0 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65  _SCAN flag is se
28e00 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  t, all other fla
28e10 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  gs must be clear
28e20 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
28e30 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
28e40 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30  X_QUERY_SCAN)==0
28e50 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49   || flags==FTS5I
28e60 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
28e70 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
28e80 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
28e90 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54  &p->rc, &buf, nT
28ea0 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20  oken+1)==0 ){.  
28eb0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20    int iIdx = 0; 
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72  /* Index to sear
28ee0 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  ch */.    if( nT
28ef0 6f 6b 65 6e 20 29 20 6d 65 6d 63 70 79 28 26 62  oken ) memcpy(&b
28f00 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c  uf.p[1], pToken,
28f10 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 2f   nToken);..    /
28f20 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  * Figure out whi
28f30 63 68 20 69 6e 64 65 78 20 74 6f 20 73 65 61 72  ch index to sear
28f40 63 68 20 61 6e 64 20 73 65 74 20 69 49 64 78 20  ch and set iIdx 
28f50 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
28f60 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 61  this.    ** is a
28f70 20 70 72 65 66 69 78 20 71 75 65 72 79 20 66 6f   prefix query fo
28f80 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
28f90 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64 65 78   no prefix index
28fa0 2c 20 73 65 74 20 69 49 64 78 20 74 6f 0a 20 20  , set iIdx to.  
28fb0 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
28fc0 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  n pConfig->nPref
28fd0 69 78 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ix to indicate t
28fe0 68 61 74 20 74 68 65 20 71 75 65 72 79 20 77 69  hat the query wi
28ff0 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73 61 74  ll be.    ** sat
29000 69 73 66 69 65 64 20 62 79 20 73 63 61 6e 6e 69  isfied by scanni
29010 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  ng multiple term
29020 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e  s in the main in
29030 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
29040 2a 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f  ** If the QUERY_
29050 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20  TEST_NOIDX flag 
29060 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 74  was specified, t
29070 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62 65  hen this must be
29080 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69 78   a.    ** prefix
29090 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64 20  -query. Instead 
290a0 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65 66 69  of using a prefi
290b0 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65 20  x-index (if one 
290c0 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a  exists), .    **
290d0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 70 72   evaluate the pr
290e0 65 66 69 78 20 71 75 65 72 79 20 75 73 69 6e 67  efix query using
290f0 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69 6e   the main FTS in
29100 64 65 78 2e 20 54 68 69 73 20 69 73 20 75 73 65  dex. This is use
29110 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74  d.    ** for int
29120 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ernal sanity che
29130 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e 74  cking by the int
29140 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e 20  egrity-check in 
29150 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f  debug .    ** mo
29160 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69 66  de only.  */.#if
29170 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
29180 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
29190 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d  ->bPrefixIndex==
291a0 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
291b0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
291c0 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20  ST_NOIDX) ){.   
291d0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
291e0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
291f0 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20  RY_PREFIX );.   
29200 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e     iIdx = 1+pCon
29210 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20  fig->nPrefix;.  
29220 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
29230 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
29240 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
29250 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69  REFIX ){.      i
29260 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49  nt nChar = fts5I
29270 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b  ndexCharlen(pTok
29280 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
29290 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
292a0 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
292b0 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
292c0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e          if( pCon
292d0 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
292e0 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72  x-1]==nChar ) br
292f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
29300 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78   }..    if( iIdx
29310 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
29320 69 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ix ){.      /* S
29330 74 72 61 69 67 68 74 20 69 6e 64 65 78 20 6c 6f  traight index lo
29340 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 46 74  okup */.      Ft
29350 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
29360 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
29370 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20  tureRead(p);.   
29380 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 28 75     buf.p[0] = (u
29390 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  8)(FTS5_MAIN_PRE
293a0 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 20  FIX + iIdx);.   
293b0 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
293c0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
293d0 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
293e0 74 72 75 63 74 2c 20 66 6c 61 67 73 20 7c 20 46  truct, flags | F
293f0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
29400 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20 20 20 20  KIPEMPTY, .     
29410 20 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2c 20         pColset, 
29420 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c  buf.p, nToken+1,
29430 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a 20 20   -1, 0, &pRet.  
29440 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29450 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
29460 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
29470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
29480 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  e{.      /* Scan
29490 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
294a0 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65  in the main inde
294b0 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  x */.      int b
294c0 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20  Desc = (flags & 
294d0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
294e0 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20  DESC)!=0;.      
294f0 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f  buf.p[0] = FTS5_
29500 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20  MAIN_PREFIX;.   
29510 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66     fts5SetupPref
29520 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c  ixIter(p, bDesc,
29530 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
29540 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74  , pColset, &pRet
29550 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29560 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
29570 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f 6c 73  K || pRet->pCols
29580 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  et==0 );.      f
29590 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
295a0 43 62 28 26 70 2d 3e 72 63 2c 20 70 52 65 74 29  Cb(&p->rc, pRet)
295b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
295c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
295d0 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
295e0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 52 65  ter *pSeg = &pRe
295f0 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e 61 46  t->aSeg[pRet->aF
29600 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
29610 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
29620 67 2d 3e 70 4c 65 61 66 20 29 20 70 52 65 74 2d  g->pLeaf ) pRet-
29630 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 52 65  >xSetOutputs(pRe
29640 74 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  t, pSeg);.      
29650 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
29660 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20   p->rc ){.      
29670 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
29680 6c 6f 73 65 28 28 46 74 73 35 49 6e 64 65 78 49  lose((Fts5IndexI
29690 74 65 72 2a 29 70 52 65 74 29 3b 0a 20 20 20 20  ter*)pRet);.    
296a0 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
296b0 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
296c0 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r(p);.    }..   
296d0 20 2a 70 70 49 74 65 72 20 3d 20 28 46 74 73 35   *ppIter = (Fts5
296e0 49 6e 64 65 78 49 74 65 72 2a 29 70 52 65 74 3b  IndexIter*)pRet;
296f0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
29700 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
29710 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  ;.  }.  return f
29720 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
29730 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
29740 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
29750 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
29760 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
29770 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a  ent is at EOF..*
29780 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  /./*.** Move to 
29790 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
297a0 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74  g rowid. .*/.int
297b0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
297c0 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74  Next(Fts5IndexIt
297d0 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b  er *pIndexIter){
297e0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
297f0 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
29800 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 61 73  pIndexIter;.  as
29810 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
29820 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  dex->rc==SQLITE_
29830 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74  OK );.  fts5Mult
29840 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d  iIterNext(pIter-
29850 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20  >pIndex, pIter, 
29860 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
29870 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
29880 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
29890 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  }../*.** Move to
298a0 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
298b0 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55  ng term/rowid. U
298c0 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76  sed by the fts5v
298d0 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  ocab module..*/.
298e0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
298f0 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35  terNextScan(Fts5
29900 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
29910 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74  xIter){.  Fts5It
29920 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73  er *pIter = (Fts
29930 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
29940 72 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r;.  Fts5Index *
29950 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
29960 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  x;..  assert( pI
29970 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
29980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
29990 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
299a0 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
299b0 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0);.  if( p->rc=
299c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
299d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
299e0 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
299f0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
29a00 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
29a10 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
29a20 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d  af && pSeg->term
29a30 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e  .p[0]!=FTS5_MAIN
29a40 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20  _PREFIX ){.     
29a50 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
29a60 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20  (pSeg->pLeaf);. 
29a70 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66       pSeg->pLeaf
29a80 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65   = 0;.      pIte
29a90 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31  r->base.bEof = 1
29aa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
29ab0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
29ac0 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
29ad0 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
29ae0 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
29af0 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74  matching rowid t
29b00 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72  hat occurs at or
29b10 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54   after iMatch. T
29b20 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e  he.** definition
29b30 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72   of "at or after
29b40 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  " depends on whe
29b50 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74  ther this iterat
29b60 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69  or iterates.** i
29b70 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64  n ascending or d
29b80 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
29b90 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  order..*/.int sq
29ba0 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
29bb0 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49  tFrom(Fts5IndexI
29bc0 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c  ter *pIndexIter,
29bd0 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20   i64 iMatch){.  
29be0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20  Fts5Iter *pIter 
29bf0 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e  = (Fts5Iter*)pIn
29c00 64 65 78 49 74 65 72 3b 0a 20 20 66 74 73 35 4d  dexIter;.  fts5M
29c10 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
29c20 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
29c30 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a  pIter, iMatch);.
29c40 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
29c50 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
29c60 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
29c70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
29c80 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f  rent term..*/.co
29c90 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
29ca0 33 46 74 73 35 49 74 65 72 54 65 72 6d 28 46 74  3Fts5IterTerm(Ft
29cb0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
29cc0 64 65 78 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e  dexIter, int *pn
29cd0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  ){.  int n;.  co
29ce0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
29cf0 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d  onst char*)fts5M
29d00 75 6c 74 69 49 74 65 72 54 65 72 6d 28 28 46 74  ultiIterTerm((Ft
29d10 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
29d20 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d  er, &n);.  *pn =
29d30 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26   n-1;.  return &
29d40 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  z[1];.}../*.** C
29d50 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72  lose an iterator
29d60 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61   opened by an ea
29d70 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71  rlier call to sq
29d80 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
29d90 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ery()..*/.void s
29da0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
29db0 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49 74 65  ose(Fts5IndexIte
29dc0 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a  r *pIndexIter){.
29dd0 20 20 69 66 28 20 70 49 6e 64 65 78 49 74 65 72    if( pIndexIter
29de0 20 29 7b 0a 20 20 20 20 46 74 73 35 49 74 65 72   ){.    Fts5Iter
29df0 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
29e00 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
29e10 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
29e20 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e  pIndex = pIter->
29e30 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
29e40 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
29e50 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c  ter);.    fts5Cl
29e60 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78  oseReader(pIndex
29e70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
29e80 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20  Read and decode 
29e90 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
29ea0 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64  ecord from the d
29eb0 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  atabase. .**.** 
29ec0 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65  Parameter anSize
29ed0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
29ee0 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20  n array of size 
29ef0 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c  nCol, where nCol
29f00 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   is.** the numbe
29f10 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65  r of user define
29f20 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
29f30 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   FTS table..*/.i
29f40 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
29f50 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
29f60 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
29f70 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e   *pnRow, i64 *an
29f80 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f  Size){.  int nCo
29f90 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
29fa0 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61  nCol;.  Fts5Data
29fb0 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52   *pData;..  *pnR
29fc0 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ow = 0;.  memset
29fd0 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65  (anSize, 0, size
29fe0 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b  of(i64) * nCol);
29ff0 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
2a000 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
2a010 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b  AVERAGES_ROWID);
2a020 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
2a030 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
2a040 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ->nn ){.    int 
2a050 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
2a060 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74  Col;.    i += ft
2a070 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
2a080 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29  ta->p[i], (u64*)
2a090 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28  pnRow);.    for(
2a0a0 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d  iCol=0; i<pData-
2a0b0 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c  >nn && iCol<nCol
2a0c0 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
2a0d0 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
2a0e0 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d  int(&pData->p[i]
2a0f0 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b  , (u64*)&anSize[
2a100 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  iCol]);.    }.  
2a110 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  }..  fts5DataRel
2a120 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72  ease(pData);.  r
2a130 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
2a140 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
2a150 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
2a160 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73  urrent "averages
2a170 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68  " record with th
2a180 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a190 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70  e buffer .** sup
2a1a0 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63  plied as the sec
2a1b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
2a1c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2a1d0 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
2a1e0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63  (Fts5Index *p, c
2a1f0 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
2a200 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73  int nData){.  as
2a210 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
2a220 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
2a230 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
2a240 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2a250 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  , pData, nData);
2a260 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
2a270 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
2a280 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2a290 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2a2a0 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f  f blocks this mo
2a2b0 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72  dule has read fr
2a2c0 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  om the %_data.**
2a2d0 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20   table since it 
2a2e0 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  was created..*/.
2a2f0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2a300 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e  ndexReads(Fts5In
2a310 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  dex *p){.  retur
2a320 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f  n p->nRead;.}../
2a330 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d  *.** Set the 32-
2a340 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  bit cookie value
2a350 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
2a360 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75  tart of all stru
2a370 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64  cture .** record
2a380 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  s to the value p
2a390 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a3a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
2a3b0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
2a3c0 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
2a3d0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
2a3e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2a3f0 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
2a400 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2a410 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f  3Fts5IndexSetCoo
2a420 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  kie(Fts5Index *p
2a430 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69  , int iNew){.  i
2a440 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a460 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a470 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
2a480 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
2a490 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20  >pConfig;    /* 
2a4a0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62  Configuration ob
2a4b0 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f  ject */.  u8 aCo
2a4c0 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20  okie[4];        
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a4e0 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65  * Binary represe
2a4f0 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20  ntation of iNew 
2a500 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
2a510 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20  b *pBlob = 0;.. 
2a520 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
2a530 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
2a540 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
2a550 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a  aCookie, iNew);.
2a560 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2a570 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
2a580 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  g->db, pConfig->
2a590 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
2a5a0 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22  , .      "block"
2a5b0 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
2a5c0 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f  _ROWID, 1, &pBlo
2a5d0 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  b.  );.  if( rc=
2a5e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a5f0 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77    sqlite3_blob_w
2a600 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f  rite(pBlob, aCoo
2a610 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  kie, 4, 0);.    
2a620 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
2a630 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a  b_close(pBlob);.
2a640 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2a650 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
2a660 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e  Fts5IndexLoadCon
2a670 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70  fig(Fts5Index *p
2a680 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
2a690 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70  re *pStruct;.  p
2a6a0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
2a6b0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
2a6c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2a6d0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
2a6e0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2a6f0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2a700 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2a710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2a750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a790 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
2a7a0 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
2a7b0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2a7c0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
2a7d0 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63  y-check .** func
2a7e0 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f  tionality..*/../
2a7f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69  *.** Return a si
2a800 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61  mple checksum va
2a810 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  lue based on the
2a820 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75   arguments..*/.u
2a830 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  64 sqlite3Fts5In
2a840 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20  dexEntryCksum(. 
2a850 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
2a860 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74  int iCol, .  int
2a870 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49   iPos, .  int iI
2a880 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
2a890 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e   *pTerm,.  int n
2a8a0 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Term.){.  int i;
2a8b0 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f  .  u64 ret = iRo
2a8c0 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  wid;.  ret += (r
2a8d0 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20  et<<3) + iCol;. 
2a8e0 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
2a8f0 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69   + iPos;.  if( i
2a900 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20  Idx>=0 ) ret += 
2a910 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35  (ret<<3) + (FTS5
2a920 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
2a930 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Idx);.  for(i=0;
2a940 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72   i<nTerm; i++) r
2a950 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
2a960 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74   pTerm[i];.  ret
2a970 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64  urn ret;.}..#ifd
2a980 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2a990 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2a9a0 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e  ion is purely an
2a9b0 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
2a9c0 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
2a9d0 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
2a9e0 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
2a9f0 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
2aa00 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
2aa10 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
2aa20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74  Instead, it test
2aa30 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  s that the same 
2aa40 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69  set of pgno/rowi
2aa50 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  d combinations a
2aa60 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72  re .** visited r
2aa70 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2aa80 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74  ther the doclist
2aa90 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65  -index identifie
2aaa0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a  d by parameters.
2aab0 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20  ** iSegid/iLeaf 
2aac0 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66  is iterated in f
2aad0 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72  orwards or rever
2aae0 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  se order..*/.sta
2aaf0 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
2ab00 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20  tDlidxReverse(. 
2ab10 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
2ab20 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20    int iSegid,   
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab40 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
2ab50 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a  to load from */.
2ab60 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20    int iLeaf     
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab80 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73    /* Load doclis
2ab90 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73  t-index for this
2aba0 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74   leaf */.){.  Ft
2abb0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
2abc0 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63  idx = 0;.  u64 c
2abd0 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36  ksum1 = 13;.  u6
2abe0 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a  4 cksum2 = 13;..
2abf0 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
2ac00 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
2ac10 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65  , 0, iSegid, iLe
2ac20 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  af);.      fts5D
2ac30 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
2ac40 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
2ac50 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
2ac60 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20  xt(p, pDlidx).  
2ac70 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
2ac80 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  d = fts5DlidxIte
2ac90 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a  rRowid(pDlidx);.
2aca0 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66      int pgno = f
2acb0 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2acc0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73  (pDlidx);.    as
2acd0 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66  sert( pgno>iLeaf
2ace0 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b   );.    cksum1 +
2acf0 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
2ad00 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
2ad10 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
2ad20 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
2ad30 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f  Dlidx = 0;..  fo
2ad40 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
2ad50 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c  dxIterInit(p, 1,
2ad60 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b   iSegid, iLeaf);
2ad70 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
2ad80 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
2ad90 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  x)==0;.      fts
2ada0 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70  5DlidxIterPrev(p
2adb0 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  , pDlidx).  ){. 
2adc0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
2add0 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
2ade0 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  id(pDlidx);.    
2adf0 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44  int pgno = fts5D
2ae00 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2ae10 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74  idx);.    assert
2ae20 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  ( fts5DlidxIterP
2ae30 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61  gno(pDlidx)>iLea
2ae40 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20  f );.    cksum2 
2ae50 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
2ae60 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
2ae70 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
2ae80 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
2ae90 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69  pDlidx = 0;..  i
2aea0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2aeb0 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63  _OK && cksum1!=c
2aec0 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
2aed0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a  FTS5_CORRUPT;.}.
2aee0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2aef0 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74  QueryCksum(.  Ft
2af00 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2af20 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65   Fts5 index obje
2af30 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
2af40 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2af50 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
2af60 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79      /* Index key
2af70 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
2af80 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afa0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e     /* Size of in
2afb0 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73  dex key in bytes
2afc0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
2aff0 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72  or Fts5IndexQuer
2b000 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73  y */.  u64 *pCks
2b010 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  um              
2b020 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2b030 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  : Checksum value
2b040 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65   */.){.  int eDe
2b050 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
2b060 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36  g->eDetail;.  u6
2b070 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75  4 cksum = *pCksu
2b080 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  m;.  Fts5IndexIt
2b090 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
2b0a0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2b0b0 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
2b0c0 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20  p, z, n, flags, 
2b0d0 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20 20 77  0, &pIter);..  w
2b0e0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2b0f0 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
2b100 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74  3Fts5IterEof(pIt
2b110 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20 72  er) ){.    i64 r
2b120 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52  owid = pIter->iR
2b130 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 65  owid;..    if( e
2b140 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
2b150 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
2b160 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74    cksum ^= sqlit
2b170 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2b180 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20  Cksum(rowid, 0, 
2b190 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a  0, iIdx, z, n);.
2b1a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b1b0 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
2b1c0 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20  er sReader;.    
2b1d0 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73    for(sqlite3Fts
2b1e0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
2b1f0 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74 61 2c  it(pIter->pData,
2b200 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26   pIter->nData, &
2b210 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  sReader);.      
2b220 20 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66      sReader.bEof
2b230 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ==0;.          s
2b240 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2b250 74 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65  tReaderNext(&sRe
2b260 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20  ader).      ){. 
2b270 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
2b280 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  = FTS5_POS2COLUM
2b290 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b  N(sReader.iPos);
2b2a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
2b2b0 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  f = FTS5_POS2OFF
2b2c0 53 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73  SET(sReader.iPos
2b2d0 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
2b2e0 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
2b2f0 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72  ndexEntryCksum(r
2b300 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66  owid, iCol, iOff
2b310 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20  , iIdx, z, n);. 
2b320 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2b330 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2b350 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2b360 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20 20 20  Next(pIter);.   
2b370 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2b380 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49  Fts5IterClose(pI
2b390 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d  ter);..  *pCksum
2b3a0 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75   = cksum;.  retu
2b3b0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2b3c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2b3d0 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e  s also purely an
2b3e0 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
2b3f0 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
2b400 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
2b410 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
2b420 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
2b430 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
2b440 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61   any way..*/.sta
2b450 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
2b460 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  tTerm(.  Fts5Ind
2b470 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75  ex *p, .  Fts5Bu
2b480 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20  ffer *pPrev,    
2b490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
2b4a0 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20  vious term */.  
2b4b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
2b4c0 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
2b4d0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20  /* Possibly new 
2b4e0 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a  term to test */.
2b4f0 20 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a    u64 expected,.
2b500 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b    u64 *pCksum.){
2b510 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
2b520 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e  c;.  if( pPrev->
2b530 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
2b540 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70  BufferSet(&rc, p
2b550 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20  Prev, n, (const 
2b560 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a  u8*)z);.  }else.
2b570 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b580 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e  _OK && (pPrev->n
2b590 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50  !=n || memcmp(pP
2b5a0 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29  rev->p, z, n)) )
2b5b0 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33  {.    u64 cksum3
2b5c0 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20   = *pCksum;.    
2b5d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
2b5e0 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  m = (const char*
2b5f0 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20  )&pPrev->p[1];  
2b600 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65  /* term sans pre
2b610 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20  fix-byte */.    
2b620 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65  int nTerm = pPre
2b630 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20  v->n-1;         
2b640 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
2b650 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
2b660 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28      int iIdx = (
2b670 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54  pPrev->p[0] - FT
2b680 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b  S5_MAIN_PREFIX);
2b690 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
2b6a0 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20   (iIdx==0 ? 0 : 
2b6b0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2b6c0 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34  PREFIX);.    u64
2b6d0 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36   ck1 = 0;.    u6
2b6e0 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20  4 ck2 = 0;..    
2b6f0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2b700 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
2b710 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44  ed for ASC and D
2b720 45 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a  ESC queries are.
2b730 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e      ** the same.
2b740 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68   If not, call th
2b750 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  is corruption.  
2b760 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  */.    rc = fts5
2b770 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2b780 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2b790 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a  , flags, &ck1);.
2b7a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b7b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2b7c0 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
2b7d0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
2b7e0 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  C;.      rc = ft
2b7f0 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
2b800 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
2b810 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20  rm, f, &ck2);.  
2b820 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2b830 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
2b840 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
2b850 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
2b860 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
2b870 70 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68  prefix query, ch
2b880 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73  eck that the res
2b890 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66  ults returned if
2b8a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
2b8b0 69 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65  index is disable
2b8c0 64 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  d are the same. 
2b8d0 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20  In both ASC and 
2b8e0 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20  DESC order. .   
2b8f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2b900 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62  check may only b
2b910 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74  e performed if t
2b920 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73  he hash table is
2b930 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20   empty. This.   
2b940 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74   ** is because t
2b950 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e  he hash table on
2b960 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69  ly supports a si
2b970 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20  ngle scan query 
2b980 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65  at.    ** a time
2b990 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d  , and the multi-
2b9a0 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77  iter loop from w
2b9b0 68 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69  hich this functi
2b9c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20  on is called.   
2b9d0 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70   ** is already p
2b9e0 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61  erforming such a
2b9f0 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   scan. */.    if
2ba00 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  ( p->nPendingDat
2ba10 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  a==0 ){.      if
2ba20 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d  ( iIdx>0 && rc==
2ba30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ba40 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
2ba50 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
2ba60 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20  RY_TEST_NOIDX;. 
2ba70 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a         ck2 = 0;.
2ba80 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
2ba90 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
2baa0 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
2bab0 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
2bac0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2bad0 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
2bae0 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
2baf0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
2bb00 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30        if( iIdx>0
2bb10 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2bb20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
2bb30 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
2bb40 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
2bb50 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f  NOIDX|FTS5INDEX_
2bb60 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20  QUERY_DESC;.    
2bb70 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20      ck2 = 0;.   
2bb80 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75       rc = fts5Qu
2bb90 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
2bba0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
2bbb0 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20  f, &ck2);.      
2bbc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bbd0 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
2bbe0 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
2bbf0 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
2bc00 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e   }..    cksum3 ^
2bc10 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42  = ck1;.    fts5B
2bc20 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
2bc30 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
2bc40 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20  8*)z);..    if( 
2bc50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2bc60 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65   cksum3!=expecte
2bc70 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
2bc80 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2bc90 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20    }.    *pCksum 
2bca0 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20  = cksum3;.  }.  
2bcb0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a  p->rc = rc;.}. .
2bcc0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
2bcd0 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
2bce0 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66  rse(x,y,z).# def
2bcf0 69 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d  ine fts5TestTerm
2bd00 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  (u,v,w,x,y,z).#e
2bd10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
2bd20 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  k that:.**.**   
2bd30 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66  1) All leaves of
2bd40 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46   pSeg between iF
2bd50 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28  irst and iLast (
2bd60 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74  inclusive) exist
2bd70 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e   and.**      con
2bd80 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e  tain zero terms.
2bd90 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61  .**   2) All lea
2bda0 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77  ves of pSeg betw
2bdb0 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64  een iNoRowid and
2bdc0 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76   iLast (inclusiv
2bdd0 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20  e) exist and.** 
2bde0 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72       contain zer
2bdf0 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61  o rowids..*/.sta
2be00 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
2be10 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2be20 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64  Empty(.  Fts5Ind
2be30 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72  ex *p,.  Fts5Str
2be40 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
2be50 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg,     /* Segm
2be60 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74  ent to check int
2be70 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63  ernal consistenc
2be80 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  y */.  int iFirs
2be90 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69  t,.  int iNoRowi
2bea0 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29  d,.  int iLast.)
2beb0 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
2bec0 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
2bed0 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20  the iter.nEmpty 
2bee0 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67  leaves following
2bef0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
2bf00 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74  f.  ** (a) exist
2bf10 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
2bf20 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20   no terms. */.  
2bf30 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d  for(i=iFirst; p-
2bf40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2bf50 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29  & i<=iLast; i++)
2bf60 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
2bf70 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2bf80 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
2bf90 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
2bfa0 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20  >iSegid, i));.  
2bfb0 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
2bfc0 20 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65       if( !fts5Le
2bfd0 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65  afIsTermless(pLe
2bfe0 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
2bff0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2c000 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69    if( i>=iNoRowi
2c010 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66  d && 0!=fts5Leaf
2c020 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
2c030 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  eaf) ) p->rc = F
2c040 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c050 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52   }.    fts5DataR
2c060 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
2c070 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
2c080 64 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43  d fts5IntegrityC
2c090 68 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e  heckPgidx(Fts5In
2c0a0 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61  dex *p, Fts5Data
2c0b0 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20   *pLeaf){.  int 
2c0c0 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
2c0d0 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42  int ii;..  Fts5B
2c0e0 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c  uffer buf1 = {0,
2c0f0 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66  0,0};.  Fts5Buff
2c100 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30  er buf2 = {0,0,0
2c110 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66  };..  ii = pLeaf
2c120 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c  ->szLeaf;.  whil
2c130 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20  e( ii<pLeaf->nn 
2c140 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
2c150 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
2c160 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  es;.    int iOff
2c170 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b  ;.    int nIncr;
2c180 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35  ..    ii += fts5
2c190 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2c1a0 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72  af->p[ii], nIncr
2c1b0 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20  );.    iTermOff 
2c1c0 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f  += nIncr;.    iO
2c1d0 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a  ff = iTermOff;..
2c1e0 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c      if( iOff>=pL
2c1f0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2c200 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2c210 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2c220 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66  else if( iTermOf
2c230 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20  f==nIncr ){.    
2c240 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
2c250 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2c260 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2c270 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  f->p[iOff], nByt
2c280 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  e);.      if( (i
2c290 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66  Off+nByte)>pLeaf
2c2a0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
2c2b0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2c2c0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2c2d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
2c2e0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
2c2f0 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74  >rc, &buf1, nByt
2c300 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  e, &pLeaf->p[iOf
2c310 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  f]);.      }.   
2c320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
2c330 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a  t nKeep, nByte;.
2c340 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2c350 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2c360 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2c370 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66  Keep);.      iOf
2c380 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2c390 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
2c3a0 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
2c3b0 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75      if( nKeep>bu
2c3c0 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42  f1.n || (iOff+nB
2c3d0 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  yte)>pLeaf->szLe
2c3e0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  af ){.        p-
2c3f0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2c400 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
2c410 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20  .        buf1.n 
2c420 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20  = nKeep;.       
2c430 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
2c440 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
2c450 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65  uf1, nByte, &pLe
2c460 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20  af->p[iOff]);.  
2c470 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2c480 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2c490 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  K ){.        res
2c4a0 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d   = fts5BufferCom
2c4b0 70 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66  pare(&buf1, &buf
2c4c0 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
2c4d0 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d  res<=0 ) p->rc =
2c4e0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2c4f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c500 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
2c510 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75  p->rc, &buf2, bu
2c520 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20  f1.n, buf1.p);. 
2c530 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72   }..  fts5Buffer
2c540 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66  Free(&buf1);.  f
2c550 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
2c560 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  uf2);.}..static 
2c570 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e  void fts5IndexIn
2c580 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
2c590 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ent(.  Fts5Index
2c5a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2c5b0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
2c5c0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
2c5d0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2c5e0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20  Segment *pSeg   
2c5f0 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f     /* Segment to
2c600 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20   check internal 
2c610 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29  consistency */.)
2c620 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
2c630 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
2c640 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nfig;.  sqlite3_
2c650 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
2c660 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e  .  int rc2;.  in
2c670 74 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d  t iIdxPrevLeaf =
2c680 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2c690 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78  -1;.  int iDlidx
2c6a0 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
2c6b0 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66  >pgnoLast;..  if
2c6c0 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ( pSeg->pgnoFirs
2c6d0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  t==0 ) return;..
2c6e0 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
2c6f0 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74  reStmt(p, &pStmt
2c700 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
2c710 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  f(.      "SELECT
2c720 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70   segid, term, (p
2c730 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31  gno>>1), (pgno&1
2c740 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64  ) FROM %Q.'%q_id
2c750 78 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25  x' WHERE segid=%
2c760 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  d",.      pConfi
2c770 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
2c780 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53  >zName, pSeg->iS
2c790 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  egid.  ));..  /*
2c7a0 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
2c7b0 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
2c7c0 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69  archy.  */.  whi
2c7d0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
2c7e0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2c7f0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2c800 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69  (pStmt) ){.    i
2c810 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20  64 iRow;        
2c820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c830 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c  Rowid for this l
2c840 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  eaf */.    Fts5D
2c850 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
2c860 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2c870 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
2c880 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54  /..    int nIdxT
2c890 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  erm = sqlite3_co
2c8a0 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
2c8b0 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 1);.    const 
2c8c0 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d  char *zIdxTerm =
2c8d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2c8e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2c8f0 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
2c900 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20   int iIdxLeaf = 
2c910 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2c920 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20  nt(pStmt, 2);.  
2c930 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20    int bIdxDlidx 
2c940 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2c950 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
2c960 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c  .    /* If the l
2c970 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  eaf in question 
2c980 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2c990 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68   trimmed from th
2c9a0 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20  e segment, .    
2c9b0 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62  ** ignore this b
2c9c0 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68  -tree entry. Oth
2c9d0 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20  erwise, load it 
2c9e0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a  into memory. */.
2c9f0 20 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66      if( iIdxLeaf
2ca00 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  <pSeg->pgnoFirst
2ca10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ca20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47   iRow = FTS5_SEG
2ca30 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
2ca40 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61  >iSegid, iIdxLea
2ca50 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20  f);.    pLeaf = 
2ca60 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20  fts5LeafRead(p, 
2ca70 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  iRow);.    if( p
2ca80 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
2ca90 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
2caa0 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e  hat the leaf con
2cab0 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f  tains at least o
2cac0 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61  ne term, and tha
2cad0 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20  t it is equal.  
2cae0 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65    ** to or large
2caf0 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74  r than the split
2cb00 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d  -key in zIdxTerm
2cb10 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68  .  Also check th
2cb20 61 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  at if there.    
2cb30 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77  ** is also a row
2cb40 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69  id pointer withi
2cb50 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  n the leaf page 
2cb60 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74  header, it point
2cb70 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f  s to a.    ** lo
2cb80 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  cation before th
2cb90 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  e term.  */.    
2cba0 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70  if( pLeaf->nn<=p
2cbb0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2cbc0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2cbd0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2cbe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2cbf0 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
2cc00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2cc10 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d  et of first term
2cc20 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20   on leaf */.    
2cc30 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b    int iRowidOff;
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cc50 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
2cc60 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a   rowid on leaf *
2cc70 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  /.      int nTer
2cc80 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2cc90 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
2cca0 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62  erm on leaf in b
2ccb0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ytes */.      in
2ccc0 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
2ccd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2cce0 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20  parison of term 
2ccf0 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f  and split-key */
2cd00 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66  ..      iOff = f
2cd10 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
2cd20 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2cd30 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
2cd40 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2cd50 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2cd60 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e    if( iRowidOff>
2cd70 3d 69 4f 66 66 20 7c 7c 20 69 4f 66 66 3e 3d 70  =iOff || iOff>=p
2cd80 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2cd90 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
2cda0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2cdb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cdc0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2cdd0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2cde0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
2cdf0 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  m);.        res 
2ce00 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d  = memcmp(&pLeaf-
2ce10 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65  >p[iOff], zIdxTe
2ce20 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e  rm, MIN(nTerm, n
2ce30 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  IdxTerm));.     
2ce40 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
2ce50 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49  res = nTerm - nI
2ce60 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
2ce70 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72  if( res<0 ) p->r
2ce80 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2ce90 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2cea0 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
2ceb0 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65 61  eckPgidx(p, pLea
2cec0 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  f);.    }.    ft
2ced0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
2cee0 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eaf);.    if( p-
2cef0 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
2cf00 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74    /* Now check t
2cf10 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d  hat the iter.nEm
2cf20 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  pty leaves follo
2cf30 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  wing the current
2cf40 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29   leaf.    ** (a)
2cf50 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63   exist and (b) c
2cf60 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e  ontain no terms.
2cf70 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65   */.    fts5Inde
2cf80 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45  xIntegrityCheckE
2cf90 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20 70 2c  mpty(.        p,
2cfa0 20 70 53 65 67 2c 20 69 49 64 78 50 72 65 76 4c   pSeg, iIdxPrevL
2cfb0 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72 65  eaf+1, iDlidxPre
2cfc0 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65 61  vLeaf+1, iIdxLea
2cfd0 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  f-1.    );.    i
2cfe0 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b  f( p->rc ) break
2cff0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2d000 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
2d010 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61  index, check tha
2d020 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74  t it looks right
2d030 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 64  . */.    if( bId
2d040 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  xDlidx ){.      
2d050 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
2d060 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46  Dlidx = 0;  /* F
2d070 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
2d080 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64  ough doclist ind
2d090 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
2d0a0 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78  iPrevLeaf = iIdx
2d0b0 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
2d0c0 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69  iSegid = pSeg->i
2d0d0 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Segid;.      int
2d0e0 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20   iPg = 0;.      
2d0f0 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20  i64 iKey;..     
2d100 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
2d110 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
2d120 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78   0, iSegid, iIdx
2d130 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
2d140 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
2d150 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b  f(p, pDlidx)==0;
2d160 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
2d170 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20  lidxIterNext(p, 
2d180 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29 7b  pDlidx).      ){
2d190 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
2d1a0 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73  ck any rowid-les
2d1b0 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63 63  s pages that occ
2d1c0 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ur before the cu
2d1d0 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20  rrent leaf. */. 
2d1e0 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69         for(iPg=i
2d1f0 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c  PrevLeaf+1; iPg<
2d200 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
2d210 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b  o(pDlidx); iPg++
2d220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65  ){.          iKe
2d230 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  y = FTS5_SEGMENT
2d240 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
2d250 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Pg);.          p
2d260 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
2d270 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
2d280 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
2d290 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2d2a0 20 69 66 28 20 66 74 73 35 4c 65 61 66 46 69 72   if( fts5LeafFir
2d2b0 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
2d2c0 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  )!=0 ) p->rc = F
2d2d0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2d2e0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
2d2f0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2d300 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2d320 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35 44  PrevLeaf = fts5D
2d330 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2d340 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2d350 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2d360 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69 63   leaf page indic
2d370 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
2d380 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  ator really does
2d390 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
2d3a0 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75  ain the rowid su
2d3b0 67 67 65 73 74 65 64 20 62 79 20 74 68 65 20 73  ggested by the s
2d3c0 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ame. */.        
2d3d0 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d  iKey = FTS5_SEGM
2d3e0 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
2d3f0 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20  , iPrevLeaf);.  
2d400 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
2d410 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
2d420 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
2d430 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
2d440 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
2d450 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52            int iR
2d460 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65  owidOff = fts5Le
2d470 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
2d480 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2d490 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
2d4a0 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  OK(pLeaf);.     
2d4b0 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
2d4c0 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ff>=pLeaf->szLea
2d4d0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2d4e0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2d4f0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
2d500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d510 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
2d520 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77  t(&pLeaf->p[iRow
2d530 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  idOff], (u64*)&i
2d540 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
2d550 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d      if( iRowid!=
2d560 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
2d570 69 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e  id(pDlidx) ) p->
2d580 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2d590 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
2d5a0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
2d5b0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2d5c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d5d0 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64 78   }..      iDlidx
2d5e0 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a  PrevLeaf = iPg;.
2d5f0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2d600 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
2d610 0a 20 20 20 20 20 20 66 74 73 35 54 65 73 74 44  .      fts5TestD
2d620 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c 20 69  lidxReverse(p, i
2d630 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
2d640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d650 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61     iDlidxPrevLea
2d660 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  f = pSeg->pgnoLa
2d670 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44  st;.      /* TOD
2d680 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20 69  O: Check there i
2d690 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64  s no doclist ind
2d6a0 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  ex */.    }..   
2d6b0 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20   iIdxPrevLeaf = 
2d6c0 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20  iIdxLeaf;.  }.. 
2d6d0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
2d6e0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2d6f0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2d700 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
2d710 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65   rc2;..  /* Page
2d720 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74   iter.iLeaf must
2d730 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67 68   now be the righ
2d740 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20  tmost leaf-page 
2d750 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a  in the segment *
2d760 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d  /.#if 0.  if( p-
2d770 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2d780 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53  & iter.iLeaf!=pS
2d790 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
2d7a0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2d7b0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65  _CORRUPT;.  }.#e
2d7c0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  ndif.}.../*.** R
2d7d0 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  un internal chec
2d7e0 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ks to ensure tha
2d7f0 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  t the FTS index 
2d800 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  (a) is internall
2d810 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74  y .** consistent
2d820 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
2d830 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68  s entries for wh
2d840 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74  ich the XOR of t
2d850 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  he checksums.** 
2d860 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79  as calculated by
2d870 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2d880 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73  xEntryCksum() is
2d890 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65   cksum..**.** Re
2d8a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2d8b0 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68  UPT if any of th
2d8c0 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  e internal check
2d8d0 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68  s fail, or if th
2d8e0 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f  e.** checksum do
2d8f0 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65  es not match. Re
2d900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2d910 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73  f all checks pas
2d920 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72  s without.** err
2d930 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  or, or some othe
2d940 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  r SQLite error c
2d950 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65  ode if another e
2d960 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a  rror (e.g. OOM).
2d970 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
2d980 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2d990 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2d9a0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75  (Fts5Index *p, u
2d9b0 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e 74  64 cksum){.  int
2d9c0 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
2d9d0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
2d9e0 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30    u64 cksum2 = 0
2d9f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2da00 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
2da10 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20  sed on contents 
2da20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  of indexes */.  
2da30 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69  Fts5Buffer posli
2da40 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  st = {0,0,0};   
2da50 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
2da60 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74  o hold a poslist
2da70 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a   */.  Fts5Iter *
2da80 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
2da90 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
2daa0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2dab0 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a 2f   entire index */
2dac0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2dad0 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20 20   *pStruct;      
2dae0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
2daf0 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65 66  cture */..#ifdef
2db00 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2db10 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74 72 61  /* Used by extra
2db20 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20   internal tests 
2db30 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42  only run if NDEB
2db40 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
2db50 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d  d */.  u64 cksum
2db60 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  3 = 0;          
2db70 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
2db80 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74  um based on cont
2db90 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20  ents of indexes 
2dba0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2dbb0 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  term = {0,0,0}; 
2dbc0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
2dbd0 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74  sed to hold most
2dbe0 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a   recent term */.
2dbf0 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 69  #endif.  const i
2dc00 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49  nt flags = FTS5I
2dc10 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54  NDEX_QUERY_NOOUT
2dc20 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61  PUT;.  .  /* Loa
2dc30 64 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  d the FTS index 
2dc40 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70  structure */.  p
2dc50 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
2dc60 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
2dc70 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2dc80 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
2dc90 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65  es of each segme
2dca0 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61  nt match the lea
2dcb0 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  ves */.  if( pSt
2dcc0 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
2dcd0 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
2dce0 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
2dcf0 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
2dd00 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
2dd10 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2dd20 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
2dd30 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
2dd40 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46  eg++){.        F
2dd50 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2dd60 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74  ent *pSeg = &pSt
2dd70 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
2dd80 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l].aSeg[iSeg];. 
2dd90 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78         fts5Index
2dda0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
2ddb0 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a  gment(p, pSeg);.
2ddc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ddd0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73 75  }..  /* The cksu
2dde0 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  m argument passe
2ddf0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
2de00 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75 6d  on is a checksum
2de10 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a   calculated.  **
2de20 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78   based on all ex
2de30 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20 69  pected entries i
2de40 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  n the FTS index 
2de50 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66 69  (including prefi
2de60 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74  x index.  ** ent
2de70 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f 63  ries). This bloc
2de80 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61 20  k checks that a 
2de90 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61  checksum calcula
2dea0 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
2deb0 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e  .  ** actual con
2dec0 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e 64  tents of FTS ind
2ded0 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c 2e  ex is identical.
2dee0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76  .  **.  ** Two v
2def0 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73  ersions of the s
2df00 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72 65  ame checksum are
2df10 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68 65   calculated. The
2df20 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20 20   first (stack.  
2df30 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73 75  ** variable cksu
2df40 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e 74  m2) based on ent
2df50 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20 66  ries extracted f
2df60 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  rom the full-tex
2df70 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69  t index.  ** whi
2df80 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61  le doing a linea
2df90 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20 69  r scan of each i
2dfa0 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78 20  ndividual index 
2dfb0 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20  in turn. .  **. 
2dfc0 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72 6d   ** As each term
2dfd0 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
2dfe0 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61 20  linear scans, a 
2dff0 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20 66  separate query f
2e000 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  or the.  ** same
2e010 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72 6d   term is perform
2e020 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63 61  ed. cksum3 is ca
2e030 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  lculated based o
2e040 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20 20  n the entries.  
2e050 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ** extracted by 
2e060 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a 20  these queries.. 
2e070 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   */.  for(fts5Mu
2e080 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
2e090 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c  truct, flags, 0,
2e0a0 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70   0, 0, -1, 0, &p
2e0b0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
2e0c0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
2e0d0 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
2e0e0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
2e0f0 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
2e100 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74   0).  ){.    int
2e110 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
2e120 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2e130 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
2e140 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f  s */.    i64 iPo
2e150 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2e160 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
2e170 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69   read from posli
2e180 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  st */.    int iO
2e190 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
2e1a0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2e1b0 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a  within poslist *
2e1c0 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
2e1d0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
2e1e0 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
2e1f0 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
2e200 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
2e210 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b  Term(pIter, &n);
2e220 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2e230 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20   is a new term, 
2e240 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70  query for it. Up
2e250 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68  date cksum3 with
2e260 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f   the results. */
2e270 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72  .    fts5TestTer
2e280 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e  m(p, &term, z, n
2e290 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d  , cksum2, &cksum
2e2a0 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65  3);..    if( eDe
2e2b0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
2e2c0 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
2e2d0 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c 74 69  if( 0==fts5Multi
2e2e0 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
2e2f0 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Iter) ){.       
2e300 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74   cksum2 ^= sqlit
2e310 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2e320 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 30 2c  Cksum(iRowid, 0,
2e330 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20   0, -1, z, n);. 
2e340 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2e350 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74 2e  {.      poslist.
2e360 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73  n = 0;.      fts
2e370 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
2e380 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
2e390 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
2e3a0 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26 70 6f  .iFirst], 0, &po
2e3b0 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  slist);.      wh
2e3c0 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46  ile( 0==sqlite3F
2e3d0 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
2e3e0 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c  (poslist.p, posl
2e3f0 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69  ist.n, &iOff, &i
2e400 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos) ){.        
2e410 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f  int iCol = FTS5_
2e420 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29  POS2COLUMN(iPos)
2e430 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54  ;.        int iT
2e440 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53  okOff = FTS5_POS
2e450 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a 20  2OFFSET(iPos);. 
2e460 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d         cksum2 ^=
2e470 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2e480 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77  xEntryCksum(iRow
2e490 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66  id, iCol, iTokOf
2e4a0 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20  f, -1, z, n);.  
2e4b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2e4c0 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70    fts5TestTerm(p
2e4d0 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63  , &term, 0, 0, c
2e4e0 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b  ksum2, &cksum3);
2e4f0 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
2e500 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  rFree(pIter);.  
2e510 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
2e520 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63  E_OK && cksum!=c
2e530 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
2e540 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
2e550 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2e560 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
2e570 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2e580 42 55 47 0a 20 20 66 74 73 35 42 75 66 66 65 72  BUG.  fts5Buffer
2e590 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65 6e  Free(&term);.#en
2e5a0 64 69 66 0a 20 20 66 74 73 35 42 75 66 66 65 72  dif.  fts5Buffer
2e5b0 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a  Free(&poslist);.
2e5c0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2e5d0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2e5e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2e5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2e630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e670 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
2e680 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
2e690 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e6a0 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2e6b0 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66  de() scalar.** f
2e6c0 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f  unction only..*/
2e6d0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
2e6e0 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f   segment-data ro
2e6f0 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  wid from the %_d
2e700 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ata table. This 
2e710 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74  function is.** t
2e720 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d  he opposite of m
2e730 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e  acro FTS5_SEGMEN
2e740 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74  T_ROWID()..*/.st
2e750 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2e760 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34  codeRowid(.  i64
2e770 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
2e780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e790 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74  Rowid from %_dat
2e7a0 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
2e7b0 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20   *piSegid,      
2e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e7d0 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20  OUT: Segment id 
2e7e0 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64  */.  int *pbDlid
2e7f0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
2e800 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69       /* OUT: Dli
2e810 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74  dx flag */.  int
2e820 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20   *piHeight,     
2e830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e840 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20  OUT: Height */. 
2e850 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20   int *piPgno    
2e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e870 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75   /* OUT: Page nu
2e880 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69  mber */.){.  *pi
2e890 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f  Pgno = (int)(iRo
2e8a0 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
2e8b0 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  < FTS5_DATA_PAGE
2e8c0 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
2e8d0 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
2e8e0 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69  A_PAGE_B;..  *pi
2e8f0 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69  Height = (int)(i
2e900 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2e910 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45   << FTS5_DATA_HE
2e920 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20  IGHT_B) - 1));. 
2e930 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2e940 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a  _DATA_HEIGHT_B;.
2e950 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69  .  *pbDlidx = (i
2e960 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78 30  nt)(iRowid & 0x0
2e970 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e  001);.  iRowid >
2e980 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49  >= FTS5_DATA_DLI
2e990 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20  _B;..  *piSegid 
2e9a0 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2e9b0 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
2e9c0 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31  5_DATA_ID_B) - 1
2e9d0 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ));.}..static vo
2e9e0 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  id fts5DebugRowi
2e9f0 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  d(int *pRc, Fts5
2ea00 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36  Buffer *pBuf, i6
2ea10 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69  4 iKey){.  int i
2ea20 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
2ea30 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20  iPgno, bDlidx;  
2ea40 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f       /* Rowid co
2ea50 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74  mpenents */.  ft
2ea60 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b  s5DecodeRowid(iK
2ea70 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44  ey, &iSegid, &bD
2ea80 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20  lidx, &iHeight, 
2ea90 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  &iPgno);..  if( 
2eaa0 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
2eab0 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f   if( iKey==FTS5_
2eac0 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
2ead0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
2eae0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2eaf0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2eb00 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29 3b   "{averages} ");
2eb10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2eb20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2eb30 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2eb40 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74 72  pRc, pBuf, "{str
2eb50 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d  ucture}");.    }
2eb60 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20  .  }.  else{.   
2eb70 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2eb80 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2eb90 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73 65  Rc, pBuf, "{%sse
2eba0 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f  gid=%d h=%d pgno
2ebb0 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 62  =%d}",.        b
2ebc0 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22  Dlidx ? "dlidx "
2ebd0 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69   : "", iSegid, i
2ebe0 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20  Height, iPgno.  
2ebf0 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74    );.  }.}..stat
2ec00 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
2ec10 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  gStructure(.  in
2ec20 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ec40 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2ec50 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2ec60 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73  fer *pBuf,.  Fts
2ec70 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b  5Structure *p.){
2ec80 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65  .  int iLvl, iSe
2ec90 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2eca0 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
2ecb0 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65  rough levels, se
2ecc0 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72  gments */..  for
2ecd0 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d  (iLvl=0; iLvl<p-
2ece0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
2ecf0 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
2ed00 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
2ed10 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c   &p->aLevel[iLvl
2ed20 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ];.    sqlite3Ft
2ed30 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2ed40 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2ed50 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d  .        " {lvl=
2ed60 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65  %d nMerge=%d nSe
2ed70 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76  g=%d", iLvl, pLv
2ed80 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d  l->nMerge, pLvl-
2ed90 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20 20  >nSeg.    );.   
2eda0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2edb0 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
2edc0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  eg++){.      Fts
2edd0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
2ede0 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d  t *pSeg = &pLvl-
2edf0 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  >aSeg[iSeg];.   
2ee00 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ee10 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ee20 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b 69  (pRc, pBuf, " {i
2ee30 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e  d=%d leaves=%d..
2ee40 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d}", .         
2ee50 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70   pSeg->iSegid, p
2ee60 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20  Seg->pgnoFirst, 
2ee70 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20  pSeg->pgnoLast. 
2ee80 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
2ee90 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2eea0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2eeb0 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b  pRc, pBuf, "}");
2eec0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2eed0 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2eee0 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2eef0 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2ef00 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2ef10 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2ef20 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20  in a serialized 
2ef30 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
2ef40 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ject. This.** fu
2ef50 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
2ef60 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2ef70 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2ef80 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63  f the same objec
2ef90 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66  t.** to the buff
2efa0 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
2efb0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2efc0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
2efd0 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75  d fts5DecodeStru
2efe0 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
2eff0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2f000 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2f010 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2f020 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2f030 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
2f040 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
2f050 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ob.){.  int rc; 
2f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f070 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2f080 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
2f090 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30  Structure *p = 0
2f0a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
2f0b0 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65  ecoded structure
2f0c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63   object */..  rc
2f0d0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
2f0e0 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42  Decode(pBlob, nB
2f0f0 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69  lob, 0, &p);.  i
2f100 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f110 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
2f120 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2f130 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53   }..  fts5DebugS
2f140 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42  tructure(pRc, pB
2f150 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74  uf, p);.  fts5St
2f160 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
2f170 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2f180 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2f190 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
2f1a0 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a  bugging aid..**.
2f1b0 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c  ** Arguments pBl
2f1c0 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e  ob/nBlob contain
2f1d0 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20 72   an "averages" r
2f1e0 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e 63  ecord. This func
2f1f0 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64 73  tion .** appends
2f200 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2f210 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2f220 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74 68   of record to th
2f230 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
2f240 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
2f250 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a  d argument. .*/.
2f260 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2f270 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 0a  DecodeAverages(.
2f280 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2a0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2f2b0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2f2c0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2f2d0 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62   const u8 *pBlob
2f2e0 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20  , int nBlob.){. 
2f2f0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f   int i = 0;.  co
2f300 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63 65  nst char *zSpace
2f310 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65 28   = "";..  while(
2f320 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20   i<nBlob ){.    
2f330 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20  u64 iVal;.    i 
2f340 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
2f350 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b 69  tVarint(&pBlob[i
2f360 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 73  ], &iVal);.    s
2f370 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f380 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f390 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c 20  , pBuf, "%s%d", 
2f3a0 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56 61  zSpace, (int)iVa
2f3b0 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20 3d  l);.    zSpace =
2f3c0 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   " ";.  }.}../*.
2f3d0 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20  ** Buffer (a/n) 
2f3e0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
2f3f0 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  ntain a list of 
2f400 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e  serialized varin
2f410 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68  ts. Read.** each
2f420 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65   varint and appe
2f430 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65  nd its string re
2f440 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20  presentation to 
2f450 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74  buffer pBuf. Ret
2f460 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74  urn.** after eit
2f470 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75  her the input bu
2f480 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65  ffer is exhauste
2f490 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69  d or a 0 value i
2f4a0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
2f4b0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2f4c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2f4d0 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
2f4e0 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2f4f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f500 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2f510 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
2f520 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
2f530 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
2f540 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
2f550 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66  0;.  while( iOff
2f560 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56  <n ){.    int iV
2f570 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  al;.    iOff += 
2f580 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2f590 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b  &a[iOff], iVal);
2f5a0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2f5b0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2f5c0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2f5d0 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a  %d", iVal);.  }.
2f5e0 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d    return iOff;.}
2f5f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72  ../*.** The star
2f600 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e  t of buffer (a/n
2f610 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  ) contains the s
2f620 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  tart of a doclis
2f630 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a  t. The doclist.*
2f640 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  * may or may not
2f650 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74   finish within t
2f660 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  he buffer. This 
2f670 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2f680 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65   a text.** repre
2f690 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
2f6a0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63   part of the doc
2f6b0 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72 65  list that is pre
2f6c0 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a  sent to buffer.*
2f6d0 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54  * pBuf. .**.** T
2f6e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2f6f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2f700 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
2f710 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2f720 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2f730 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69   fts5DecodeDocli
2f740 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
2f750 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
2f760 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
2f770 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64  n){.  i64 iDocid
2f780 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
2f790 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30   = 0;..  if( n>0
2f7a0 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 73   ){.    iOff = s
2f7b0 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2f7c0 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69 44  int(a, (u64*)&iD
2f7d0 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ocid);.    sqlit
2f7e0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f7f0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2f800 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2f810 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77  iDocid);.  }.  w
2f820 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a  hile( iOff<n ){.
2f830 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
2f840 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20 20    int bDel;.    
2f850 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50  iOff += fts5GetP
2f860 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f  oslistSize(&a[iO
2f870 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 65  ff], &nPos, &bDe
2f880 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l);.    sqlite3F
2f890 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2f8a0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2f8b0 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20 6e   " nPos=%d%s", n
2f8c0 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22 22  Pos, bDel?"*":""
2f8d0 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
2f8e0 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
2f8f0 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b 69  (pRc, pBuf, &a[i
2f900 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66  Off], MIN(n-iOff
2f910 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69 66  , nPos));.    if
2f920 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
2f930 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
2f940 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69      iOff += sqli
2f950 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2f960 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
2f970 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
2f980 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74   iDocid += iDelt
2f990 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
2f9a0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f9b0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2f9c0 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44  , " id=%lld", iD
2f9d0 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ocid);.    }.  }
2f9e0 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  ..  return iOff;
2f9f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2fa00 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
2fa10 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2fa20 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 66  de() debugging f
2fa30 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 0a  unction. It is .
2fa40 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  ** only ever use
2fa50 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f  d with detail=no
2fa60 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ne tables..**.**
2fa70 20 42 75 66 66 65 72 20 28 70 44 61 74 61 2f 6e   Buffer (pData/n
2fa80 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73 20 61  Data) contains a
2fa90 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 65 20   doclist in the 
2faa0 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79 20 64  format used by d
2fab0 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74 61  etail=none.** ta
2fac0 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74  bles. This funct
2fad0 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75  ion appends a hu
2fae0 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65 72  man-readable ver
2faf0 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c 69 73  sion of that lis
2fb00 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  t to.** buffer p
2fb10 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  Buf..**.** If *p
2fb20 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e  Rc is other than
2fb30 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2fb40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2fb50 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2fb60 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e  .** no-op. If an
2fb70 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20 65 72   OOM or other er
2fb80 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
2fb90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
2fba0 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65 74 20   *pRc is.** set 
2fbb0 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  to an SQLite err
2fbc0 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72  or code before r
2fbd0 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 66 69  eturning. The fi
2fbe0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62 75 66  nal state of buf
2fbf0 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73 20 75  fer.** pBuf is u
2fc00 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
2fc10 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
2fc20 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2fc30 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69 6e 74  RowidList(.  int
2fc40 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fc60 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
2fc70 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2fc80 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
2fc90 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
2fca0 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78 74  r to append text
2fcb0 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   to */.  const u
2fcc0 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
2fcd0 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ata      /* Data
2fce0 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73 74 2d   to decode list-
2fcf0 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d 20 2a  of-rowids from *
2fd00 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  /.){.  int i = 0
2fd10 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d  ;.  i64 iRowid =
2fd20 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c   0;..  while( i<
2fd30 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63 6f 6e  nData ){.    con
2fd40 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20 3d 20  st char *zApp = 
2fd50 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56 61 6c  "";.    u64 iVal
2fd60 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  ;.    i += sqlit
2fd70 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2fd80 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56 61 6c  &pData[i], &iVal
2fd90 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 2b 3d  );.    iRowid +=
2fda0 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66 28 20   iVal;..    if( 
2fdb0 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74 61  i<nData && pData
2fdc0 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20  [i]==0x00 ){.   
2fdd0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66     i++;.      if
2fde0 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61  ( i<nData && pDa
2fdf0 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20  ta[i]==0x00 ){. 
2fe00 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
2fe10 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22 3b 0a      zApp = "+";.
2fe20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fe30 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a 22 3b       zApp = "*";
2fe40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2fe50 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2fe60 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2fe70 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25  f(pRc, pBuf, " %
2fe80 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64 2c 20  lld%s", iRowid, 
2fe90 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  zApp);.  }.}../*
2fea0 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
2feb0 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
2fec0 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
2fed0 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f  nction fts5_deco
2fee0 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de()..*/.static 
2fef0 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46  void fts5DecodeF
2ff00 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
2ff10 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2ff20 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
2ff30 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
2ff40 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
2ff50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2ff60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ff70 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
2ff80 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
2ff90 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
2ffa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2ffb0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
2ffc0 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f   */.){.  i64 iRo
2ffd0 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2ffe0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2fff0 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69  d for record bei
30000 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
30010 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69 67  int iSegid,iHeig
30020 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b  ht,iPgno,bDlidx;
30030 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65  /* Rowid compone
30040 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  nts */.  const u
30050 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b  8 *aBlob; int n;
30060 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f           /* Reco
30070 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rd to decode */.
30080 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46    u8 *a = 0;.  F
30090 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20  ts5Buffer s;    
300a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
300b0 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20  * Build up text 
300c0 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a  to return here *
300d0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
300e0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
300f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
30100 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  de */.  int nSpa
30110 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 44  ce = 0;.  int eD
30120 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71 6c  etailNone = (sql
30130 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
30140 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73 73  Ctx)!=0);..  ass
30150 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a  ert( nArg==2 );.
30160 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e    UNUSED_PARAM(n
30170 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Arg);.  memset(&
30180 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  s, 0, sizeof(Fts
30190 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f  5Buffer));.  iRo
301a0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
301b0 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b  lue_int64(apVal[
301c0 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  0]);..  /* Make 
301d0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
301e0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61  cond argument (a
301f0 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b   blob) in aBlob[
30200 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20  ]. The aBlob[]. 
30210 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c   ** copy is foll
30220 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44 41 54  owed by FTS5_DAT
30230 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30  A_ZERO_PADDING 0
30240 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63 68  x00 bytes, which
30250 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62   prevents.  ** b
30260 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 20  uffer overreads 
30270 65 76 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f  even if the reco
30280 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  rd is corrupt.  
30290 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  */.  n = sqlite3
302a0 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56  _value_bytes(apV
302b0 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20  al[1]);.  aBlob 
302c0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
302d0 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  blob(apVal[1]);.
302e0 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46    nSpace = n + F
302f0 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
30300 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38  DDING;.  a = (u8
30310 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
30320 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70  locZero(&rc, nSp
30330 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30  ace);.  if( a==0
30340 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f   ) goto decode_o
30350 75 74 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 20  ut;.  if( n>0 ) 
30360 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c  memcpy(a, aBlob,
30370 20 6e 29 3b 0a 0a 20 20 66 74 73 35 44 65 63 6f   n);..  fts5Deco
30380 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20  deRowid(iRowid, 
30390 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78  &iSegid, &bDlidx
303a0 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67  , &iHeight, &iPg
303b0 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75  no);..  fts5Debu
303c0 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20  gRowid(&rc, &s, 
303d0 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62  iRowid);.  if( b
303e0 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
303f0 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20  5Data dlidx;.   
30400 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76   Fts5DlidxLvl lv
30410 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20  l;..    dlidx.p 
30420 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e  = a;.    dlidx.n
30430 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73  n = n;..    mems
30440 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(&lvl, 0, size
30450 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
30460 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61  );.    lvl.pData
30470 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c   = &dlidx;.    l
30480 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  vl.iLeafPgno = i
30490 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66  Pgno;..    for(f
304a0 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
304b0 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d  &lvl); lvl.bEof=
304c0 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  =0; fts5DlidxLvl
304d0 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20  Next(&lvl)){.   
304e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
304f0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
30500 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20  (&rc, &s, .     
30510 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22       " %d(%lld)"
30520 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c  , lvl.iLeafPgno,
30530 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20   lvl.iRowid.    
30540 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c    );.    }.  }el
30550 73 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30  se if( iSegid==0
30560 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77   ){.    if( iRow
30570 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45  id==FTS5_AVERAGE
30580 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  S_ROWID ){.     
30590 20 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61   fts5DecodeAvera
305a0 67 65 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ges(&rc, &s, a, 
305b0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
305c0 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53       fts5DecodeS
305d0 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73  tructure(&rc, &s
305e0 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , a, n);.    }. 
305f0 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 74 61   }else if( eDeta
30600 69 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46 74  ilNone ){.    Ft
30610 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
30620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
30630 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64  urrent term read
30640 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20   from page */.  
30650 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20 20    int szLeaf;.  
30660 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 20    int iPgidxOff 
30670 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47  = szLeaf = fts5G
30680 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20  etU16(&a[2]);.  
30690 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a    int iTermOff;.
306a0 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20      int nKeep = 
306b0 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  0;.    int iOff;
306c0 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65  ..    memset(&te
306d0 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  rm, 0, sizeof(Ft
306e0 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
306f0 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 65   /* Decode any e
30700 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
30710 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
30720 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  st term. */.    
30730 69 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a  if( szLeaf<n ){.
30740 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
30750 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
30760 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
30770 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20  , iTermOff);.   
30780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 54   }else{.      iT
30790 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b  ermOff = szLeaf;
307a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
307b0 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26  ecodeRowidList(&
307c0 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69  rc, &s, &a[4], i
307d0 54 65 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20 20  TermOff-4);..   
307e0 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
307f0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66  ;.    while( iOf
30800 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  f<szLeaf ){.    
30810 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 3b 0a 0a    int nAppend;..
30820 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
30830 65 20 74 65 72 6d 20 64 61 74 61 20 66 6f 72 20  e term data for 
30840 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2a 2f 0a  the next term*/.
30850 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
30860 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
30870 5b 69 4f 66 66 5d 2c 20 6e 41 70 70 65 6e 64 29  [iOff], nAppend)
30880 3b 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d  ;.      term.n =
30890 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 66 74   nKeep;.      ft
308a0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
308b0 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
308c0 41 70 70 65 6e 64 2c 20 26 61 5b 69 4f 66 66 5d  Append, &a[iOff]
308d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
308e0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
308f0 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
30900 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72    &rc, &s, " ter
30910 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c  m=%.*s", term.n,
30920 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65   (const char*)te
30930 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20  rm.p.      );.  
30940 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 41 70 70      iOff += nApp
30950 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  end;..      /* F
30960 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
30970 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  the doclist for 
30980 74 68 69 73 20 74 65 72 6d 20 65 6e 64 73 20 2a  this term ends *
30990 2f 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69  /.      if( iPgi
309a0 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20  dxOff<n ){.     
309b0 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 20 20     int nIncr;.  
309c0 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
309d0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
309e0 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
309f0 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 20 20  , nIncr);.      
30a00 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49    iTermOff += nI
30a10 6e 63 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ncr;.      }else
30a20 7b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f  {.        iTermO
30a30 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  ff = szLeaf;.   
30a40 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35     }..      fts5
30a50 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28  DecodeRowidList(
30a60 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
30a70 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 69 4f 66 66  ], iTermOff-iOff
30a80 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  );.      iOff = 
30a90 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20  iTermOff;.      
30aa0 69 66 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20  if( iOff<szLeaf 
30ab0 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
30ac0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
30ad0 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65  32(&a[iOff], nKe
30ae0 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ep);.      }.   
30af0 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
30b00 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
30b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35   }else{.    Fts5
30b20 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
30b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
30b40 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66  rent term read f
30b50 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  rom page */.    
30b60 69 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20  int szLeaf;     
30b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30b80 20 4f 66 66 73 65 74 20 6f 66 20 70 67 69 64 78   Offset of pgidx
30b90 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69   in a[] */.    i
30ba0 6e 74 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20  nt iPgidxOff;.  
30bb0 20 20 69 6e 74 20 69 50 67 69 64 78 50 72 65 76    int iPgidxPrev
30bc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30bd0 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75  /* Previous valu
30be0 65 20 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64  e read from pgid
30bf0 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65  x */.    int iTe
30c00 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  rmOff = 0;.    i
30c10 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30  nt iRowidOff = 0
30c20 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ;.    int iOff;.
30c30 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74      int nDoclist
30c40 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  ;..    memset(&t
30c50 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
30c60 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
30c70 20 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20    if( n<4 ){.   
30c80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
30c90 66 66 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c  fferSet(&rc, &s,
30ca0 20 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22   7, (const u8*)"
30cb0 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20  corrupt");.     
30cc0 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
30cd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30ce0 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
30cf0 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29  ts5GetU16(&a[0])
30d00 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66  ;.      iPgidxOf
30d10 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73  f = szLeaf = fts
30d20 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a  5GetU16(&a[2]);.
30d30 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78        if( iPgidx
30d40 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
30d50 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
30d60 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
30d70 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20  iTermOff);.     
30d80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
30d90 20 44 65 63 6f 64 65 20 74 68 65 20 70 6f 73 69   Decode the posi
30da0 74 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20 61  tion list tail a
30db0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
30dc0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
30dd0 66 28 20 69 52 6f 77 69 64 4f 66 66 21 3d 30 20  f( iRowidOff!=0 
30de0 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ){.      iOff = 
30df0 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d  iRowidOff;.    }
30e00 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66  else if( iTermOf
30e10 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f  f!=0 ){.      iO
30e20 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20  ff = iTermOff;. 
30e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30e40 69 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  iOff = szLeaf;. 
30e50 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63     }.    fts5Dec
30e60 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20  odePoslist(&rc, 
30e70 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d  &s, &a[4], iOff-
30e80 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f  4);..    /* Deco
30e90 64 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c  de any more docl
30ea0 69 73 74 20 64 61 74 61 20 74 68 61 74 20 61 70  ist data that ap
30eb0 70 65 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67  pears on the pag
30ec0 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  e before the.   
30ed0 20 2a 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20   ** first term. 
30ee0 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20  */.    nDoclist 
30ef0 3d 20 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54  = (iTermOff ? iT
30f00 65 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29  ermOff : szLeaf)
30f10 20 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73   - iOff;.    fts
30f20 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26  5DecodeDoclist(&
30f30 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
30f40 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20  , nDoclist);..  
30f50 20 20 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f    while( iPgidxO
30f60 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  ff<n ){.      in
30f70 74 20 62 46 69 72 73 74 20 3d 20 28 69 50 67 69  t bFirst = (iPgi
30f80 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20  dxOff==szLeaf); 
30f90 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
30fa0 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61  first term on pa
30fb0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ge */.      int 
30fc0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
30fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fe0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61    /* Bytes of da
30ff0 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ta */.      int 
31000 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20  iEnd;.      .   
31010 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20     iPgidxOff += 
31020 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
31030 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e  &a[iPgidxOff], n
31040 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67  Byte);.      iPg
31050 69 64 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65  idxPrev += nByte
31060 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  ;.      iOff = i
31070 50 67 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20  PgidxPrev;..    
31080 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c    if( iPgidxOff<
31090 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  n ){.        fts
310a0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
310b0 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74  iPgidxOff], nByt
310c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64  e);.        iEnd
310d0 20 3d 20 69 50 67 69 64 78 50 72 65 76 20 2b 20   = iPgidxPrev + 
310e0 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c  nByte;.      }el
310f0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64  se{.        iEnd
31100 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20   = szLeaf;.     
31110 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 62 46   }..      if( bF
31120 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  irst==0 ){.     
31130 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
31140 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
31150 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
31160 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42       term.n = nB
31170 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  yte;.      }.   
31180 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
31190 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
311a0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
311b0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
311c0 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65  endBlob(&rc, &te
311d0 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f  rm, nByte, &a[iO
311e0 66 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  ff]);.      iOff
311f0 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20   += nByte;..    
31200 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
31210 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
31220 0a 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20  .          &rc, 
31230 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22  &s, " term=%.*s"
31240 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74  , term.n, (const
31250 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20   char*)term.p.  
31260 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66      );.      iOf
31270 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44  f += fts5DecodeD
31280 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
31290 26 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69  &a[iOff], iEnd-i
312a0 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Off);.    }..   
312b0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
312c0 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20  &term);.  }.  . 
312d0 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71  decode_out:.  sq
312e0 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20  lite3_free(a);. 
312f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31300 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
31310 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
31320 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  tx, (const char*
31330 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54  )s.p, s.n, SQLIT
31340 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
31350 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
31360 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
31370 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a  code(pCtx, rc);.
31380 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
31390 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a  Free(&s);.}../*.
313a0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
313b0 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65  ation of user-de
313c0 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
313d0 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64  ction fts5_rowid
313e0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
313f0 69 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63  id fts5RowidFunc
31400 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
31410 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
31420 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
31430 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74  ion call context
31440 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
31450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31460 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
31470 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20  of args (always 
31480 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  2) */.  sqlite3_
31490 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
314a0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
314b0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
314c0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
314d0 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41   *zArg;.  if( nA
314e0 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rg==0 ){.    sql
314f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
31500 72 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20  r(pCtx, "should 
31510 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73  be: fts5_rowid(s
31520 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20  ubject, ....)", 
31530 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
31540 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20    zArg = (const 
31550 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
31560 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
31570 5d 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  ]);.    if( 0==s
31580 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
31590 41 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20  Arg, "segment") 
315a0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
315b0 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  wid;.      int s
315c0 65 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20  egid, pgno;.    
315d0 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b    if( nArg!=3 ){
315e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
315f0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
31600 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  tx, .           
31610 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73   "should be: fts
31620 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74  5_rowid('segment
31630 27 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29  ', segid, pgno))
31640 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b  ", -1.        );
31650 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31660 20 20 20 20 20 20 73 65 67 69 64 20 3d 20 73 71        segid = sq
31670 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
31680 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20  apVal[1]);.     
31690 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65     pgno = sqlite
316a0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
316b0 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  l[2]);.        i
316c0 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
316d0 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64  MENT_ROWID(segid
316e0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
316f0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
31700 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77  int64(pCtx, iRow
31710 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  id);.      }.   
31720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
31730 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
31740 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20  or(pCtx, .      
31750 20 20 22 66 69 72 73 74 20 61 72 67 20 74 6f 20    "first arg to 
31760 66 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73  fts5_rowid() mus
31770 74 20 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20  t be 'segment'" 
31780 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  , -1.      );.  
31790 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
317a0 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
317b0 61 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73  as part of regis
317c0 74 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20  tering the FTS5 
317d0 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61  module with data
317e0 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
317f0 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74  on db. It regist
31800 65 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72  ers several user
31810 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
31820 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c  functions useful
31830 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a  .** with FTS5..*
31840 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
31850 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
31860 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
31870 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
31880 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c  ome other.** SQL
31890 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
318a0 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
318b0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
318c0 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28  e3Fts5IndexInit(
318d0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
318e0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
318f0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
31900 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73  (.      db, "fts
31910 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51  5_decode", 2, SQ
31920 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
31930 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
31940 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 20 20 69  , 0, 0.  );..  i
31950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31960 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
31970 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
31980 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62  tion(.        db
31990 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e  , "fts5_decode_n
319a0 6f 6e 65 22 2c 20 32 2c 20 0a 20 20 20 20 20 20  one", 2, .      
319b0 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28    SQLITE_UTF8, (
319c0 76 6f 69 64 2a 29 64 62 2c 20 66 74 73 35 44 65  void*)db, fts5De
319d0 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  codeFunction, 0,
319e0 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
319f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31a00 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
31a10 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
31a20 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
31a30 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22  db, "fts5_rowid"
31a40 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
31a50 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46  8, 0, fts5RowidF
31a60 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
31a70 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72    );.  }.  retur
31a80 6e 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71  n rc;.}...int sq
31a90 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
31aa0 73 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  set(Fts5Index *p
31ab0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
31ac0 70 53 74 72 75 63 74 3d 3d 30 20 7c 7c 20 70 2d  pStruct==0 || p-
31ad0 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 21  >iStructVersion!
31ae0 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35  =0 );.  if( fts5
31af0 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
31b00 28 70 29 21 3d 70 2d 3e 69 53 74 72 75 63 74 56  (p)!=p->iStructV
31b10 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 66 74  ersion ){.    ft
31b20 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
31b30 69 64 61 74 65 28 70 29 3b 0a 20 20 7d 0a 20 20  idate(p);.  }.  
31b40 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
31b50 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a           Return(p);.}.