/ Hex Artifact Content
Login

Artifact b062bdb836e195656aac8d6684e943585cff4bf7d7c593c80cb67c3b6cfef7ee:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
4d20: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
4d30: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
4d40: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
4d50: 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 43  slist */.  Fts5C
4d60: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
4d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4d80: 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
4d90: 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
4da0: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64  */..  /* Invoked
4db0: 20 74 6f 20 73 65 74 20 6f 75 74 70 75 74 20 76   to set output v
4dc0: 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76  ariables. */.  v
4dd0: 6f 69 64 20 28 2a 78 53 65 74 4f 75 74 70 75 74  oid (*xSetOutput
4de0: 73 29 28 46 74 73 35 49 74 65 72 2a 2c 20 46 74  s)(Fts5Iter*, Ft
4df0: 73 35 53 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20  s5SegIter*);..  
4e00: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4e30: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4e40: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e60: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4e70: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4e80: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4e90: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4ea0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4eb0: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4ec0: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20  tries */..  i64 
4ed0: 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20  iSwitchRowid;   
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4ef0: 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66  irstest rowid of
4f00: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72   other than aFir
4f10: 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43  st[1] */.  Fts5C
4f20: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
4f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4f40: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
4f50: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
4f60: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61  .  Fts5SegIter a
4f70: 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Seg[1];         
4f80: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
4f90: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4fa0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
4fb0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
4fd0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72   is used to iter
4fe0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4ff0: 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61  contents.** of a
5000: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
5010: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61  ecord..**.** pDa
5020: 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20  ta:.**   Record 
5030: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
5040: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74  oclist-index dat
5050: 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a  a..**.** bEof:.*
5060: 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20  *   Set to true 
5070: 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61  once iterator ha
5080: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a  s reached EOF..*
5090: 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20  *.** iOff:.**   
50a0: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  Set to the curre
50b0: 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
50c0: 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a   record pData..*
50d0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  /.struct Fts5Dli
50e0: 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61  dxLvl {.  Fts5Da
50f0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
5100: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
5110: 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65  for current page
5120: 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a   of this level *
5130: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  /.  int iOff;   
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
5160: 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a  set into pData *
5170: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
51a0: 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ady */.  int iFi
51b0: 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  rstOff;         
51c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
51d0: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
51e0: 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ors */..  /* Out
51f0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
5200: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
5210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5220: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
5230: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
5240: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
5250: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5260: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5270: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5280: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73  LeafPgno */.};.s
5290: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
52a0: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c  ter {.  int nLvl
52b0: 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
52c0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61    Fts5DlidxLvl a
52d0: 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74  Lvl[1];.};..stat
52e0: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
52f0: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
5300: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
5310: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
5320: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
5330: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
5340: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
5350: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5360: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5370: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5380: 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a  In[1];.} ../*.**
5390: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
53a0: 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74  turn a buffer at
53b0: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
53c0: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
53d0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
53e0: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
53f0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
5400: 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  d set the error 
5410: 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  code in.** the F
5420: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20  ts5Index handle 
5430: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5440: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
5450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
5460: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35  s5IdxMalloc(Fts5
5470: 49 6e 64 65 78 20 2a 70 2c 20 73 71 6c 69 74 65  Index *p, sqlite
5480: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
5490: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
54a0: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
54b0: 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d  p->rc, nByte);.}
54c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
54d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
54e0: 74 68 65 20 70 4c 65 66 74 20 62 75 66 66 65 72  the pLeft buffer
54f0: 20 77 69 74 68 20 74 68 65 20 70 52 69 67 68 74   with the pRight
5500: 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a  /nRight blob..**
5510: 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69  .** Return -ve i
5520: 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c  f pLeft is small
5530: 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20  er than pRight, 
5540: 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71  0 if they are eq
5550: 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66  ual or.** +ve if
5560: 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c   pRight is small
5570: 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49  er than pLeft. I
5580: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a  n other words:.*
5590: 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a  *.**     res = *
55a0: 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a  pLeft - *pRight.
55b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
55c0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
55d0: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
55e0: 61 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42  areBlob(.  Fts5B
55f0: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20  uffer *pLeft,   
5600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
5610: 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft hand side of 
5620: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
5630: 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74  const u8 *pRight
5640: 2c 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20  , int nRight    
5650: 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73 69  /* Right hand si
5660: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
5670: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
5680: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
5690: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
56a0: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
56b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20  eft->p, pRight, 
56c0: 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  nCmp);.  return 
56d0: 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74  (res==0 ? (pLeft
56e0: 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20  ->n - nRight) : 
56f0: 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  res);.}.#endif..
5700: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
5710: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
5720: 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73  e two buffers us
5730: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ing memcmp(). If
5740: 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   one buffer.** i
5750: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
5760: 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63  e other, it is c
5770: 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65  onsidered the le
5780: 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sser..**.** Retu
5790: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
57a0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57b0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
57c0: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
57d0: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
57e0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57f0: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
5800: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
5810: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
5820: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
5830: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
5840: 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66  Compare(Fts5Buff
5850: 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42  er *pLeft, Fts5B
5860: 75 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a  uffer *pRight){.
5870: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
5880: 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68  (pLeft->n, pRigh
5890: 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73  t->n);.  int res
58a0: 20 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 4c   = fts5Memcmp(pL
58b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e  eft->p, pRight->
58c0: 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  p, nCmp);.  retu
58d0: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
58e0: 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d  eft->n - pRight-
58f0: 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73  >n) : res);.}..s
5900: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65  tatic int fts5Le
5910: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46  afFirstTermOff(F
5920: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b  ts5Data *pLeaf){
5930: 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74  .  int ret;.  ft
5940: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
5950: 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73  Leaf->p[pLeaf->s
5960: 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20  zLeaf], ret);.  
5970: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
5980: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72  *.** Close the r
5990: 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61  ead-only blob ha
59a0: 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f  ndle, if it is o
59b0: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pen..*/.static v
59c0: 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61  oid fts5CloseRea
59d0: 64 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70  der(Fts5Index *p
59e0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  ){.  if( p->pRea
59f0: 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  der ){.    sqlit
5a00: 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72  e3_blob *pReader
5a10: 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20   = p->pReader;. 
5a20: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5a30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  0;.    sqlite3_b
5a40: 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65  lob_close(pReade
5a50: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
5a60: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
5a70: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
5a80: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
5a90: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5aa0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
5ab0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
5ac0: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
5ad0: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
5ae0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
5af0: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
5b00: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
5b10: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
5b20: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
5b30: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
5b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b50: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
5b60: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28  ITE_OK;..    if(
5b70: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
5b80: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
5b90: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
5ba0: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
5bb0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
5bc0: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
5bd0: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
5be0: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
5bf0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
5c00: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
5c10: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
5c20: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
5c30: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5c40: 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65  Blob = p->pReade
5c50: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  r;.      p->pRea
5c60: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  der = 0;.      r
5c70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5c80: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
5c90: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73  Rowid);.      as
5ca0: 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
5cb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
5cc0: 70 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b  pReader = pBlob;
5cd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
5ce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5cf0: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
5d00: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  der(p);.      }.
5d10: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5d20: 4c 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20  LITE_ABORT ) rc 
5d30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5d50: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  e blob handle is
5d60: 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69   not open at thi
5d70: 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74  s point, open it
5d80: 20 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a   and seek .    *
5d90: 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  * to the request
5da0: 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20  ed entry.  */.  
5db0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5dc0: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
5dd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
5de0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
5df0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
5e00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5e10: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
5e20: 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20  nfig->db, .     
5e30: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
5e40: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
5e50: 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
5e60: 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a   0, &p->pReader.
5e70: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
5e80: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
5e90: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
5ea0: 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73  blob_open() or s
5eb0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
5ec0: 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  en() calls.    *
5ed0: 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64  * above returned
5ee0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72   SQLITE_ERROR, r
5ef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5f00: 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61  RUPT_VTAB instea
5f10: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68  d..    ** All th
5f20: 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20  e reasons those 
5f30: 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20  functions might 
5f40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5f50: 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20  ROR - missing.  
5f60: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73    ** table, miss
5f70: 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f  ing row, non-blo
5f80: 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20  b/text in block 
5f90: 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74  column - indicat
5fa0: 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e  e .    ** backin
5fb0: 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69  g store corrupti
5fc0: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  on.  */.    if( 
5fd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
5fe0: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
5ff0: 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72  RUPT;..    if( r
6000: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6010: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d        u8 *aOut =
6020: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6030: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6040: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6050: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
6060: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
6070: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
6080: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
6090: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 41  sqlite3_int64 nA
60a0: 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 46 74  lloc = sizeof(Ft
60b0: 73 35 44 61 74 61 29 20 2b 20 6e 42 79 74 65 20  s5Data) + nByte 
60c0: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
60d0: 49 4e 47 3b 0a 20 20 20 20 20 20 70 52 65 74 20  ING;.      pRet 
60e0: 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71 6c  = (Fts5Data*)sql
60f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 41  ite3_malloc64(nA
6100: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28  lloc);.      if(
6110: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
6120: 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79 74   pRet->nn = nByt
6130: 65 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20  e;.        aOut 
6140: 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a  = pRet->p = (u8*
6150: 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20  )&pRet[1];.     
6160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6170: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
6180: 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  M;.      }..    
6190: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
61a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
61b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
61c0: 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72  _read(p->pReader
61d0: 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30  , aOut, nByte, 0
61e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
61f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6200: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
6210: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
6220: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
6230: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
6240: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  .        /* TODO
6250: 31 3a 20 46 69 78 20 74 68 69 73 20 2a 2f 0a 20  1: Fix this */. 
6260: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 70 5b 6e         pRet->p[n
6270: 42 79 74 65 5d 20 3d 20 30 78 30 30 3b 0a 20 20  Byte] = 0x00;.  
6280: 20 20 20 20 20 20 70 52 65 74 2d 3e 70 5b 6e 42        pRet->p[nB
6290: 79 74 65 2b 31 5d 20 3d 20 30 78 30 30 3b 0a 20  yte+1] = 0x00;. 
62a0: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 73 7a 4c         pRet->szL
62b0: 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  eaf = fts5GetU16
62c0: 28 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a 20  (&pRet->p[2]);. 
62d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
62e0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
62f0: 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d   p->nRead++;.  }
6300: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 52 65  ..  assert( (pRe
6310: 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53  t==0)==(p->rc!=S
6320: 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72  QLITE_OK) );.  r
6330: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
6340: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
6350: 65 66 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61  eference to data
6360: 20 72 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64   record returned
6370: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
6380: 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61  all to.** fts5Da
6390: 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61  taRead()..*/.sta
63a0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
63b0: 61 52 65 6c 65 61 73 65 28 46 74 73 35 44 61 74  aRelease(Fts5Dat
63c0: 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 73 71 6c  a *pData){.  sql
63d0: 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29  ite3_free(pData)
63e0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35  ;.}..static Fts5
63f0: 44 61 74 61 20 2a 66 74 73 35 4c 65 61 66 52 65  Data *fts5LeafRe
6400: 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ad(Fts5Index *p,
6410: 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20   i64 iRowid){.  
6420: 46 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d  Fts5Data *pRet =
6430: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
6440: 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20   iRowid);.  if( 
6450: 70 52 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20  pRet ){.    if( 
6460: 70 52 65 74 2d 3e 73 7a 4c 65 61 66 3e 70 52 65  pRet->szLeaf>pRe
6470: 74 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 70  t->nn ){.      p
6480: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
6490: 55 50 54 3b 0a 20 20 20 20 20 20 66 74 73 35 44  UPT;.      fts5D
64a0: 61 74 61 52 65 6c 65 61 73 65 28 70 52 65 74 29  ataRelease(pRet)
64b0: 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30  ;.      pRet = 0
64c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
64d0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74  turn pRet;.}..st
64e0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
64f0: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20  exPrepareStmt(. 
6500: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
6510: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
6520: 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a  ppStmt,.  char *
6530: 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d  zSql.){.  if( p-
6540: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
6550: 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29  {.    if( zSql )
6560: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6570: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
6580: 76 33 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64  v3(p->pConfig->d
6590: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20 20 20  b, zSql, -1,.   
65a0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52         SQLITE_PR
65b0: 45 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54  EPARE_PERSISTENT
65c0: 7c 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f  |SQLITE_PREPARE_
65d0: 4e 4f 5f 56 54 41 42 2c 0a 20 20 20 20 20 20 20  NO_VTAB,.       
65e0: 20 20 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20     ppStmt, 0);. 
65f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6600: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
6610: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
6620: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
6630: 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Sql);.  return p
6640: 2d 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ->rc;.}.../*.** 
6650: 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43  INSERT OR REPLAC
6660: 45 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  E a record into 
6670: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
6680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6690: 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46   fts5DataWrite(F
66a0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
66b0: 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75   iRowid, const u
66c0: 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
66d0: 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ata){.  if( p->r
66e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
66f0: 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d  eturn;..  if( p-
6700: 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20  >pWriter==0 ){. 
6710: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6720: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6730: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6740: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6750: 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 73 71   &p->pWriter, sq
6760: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
6770: 20 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43           "REPLAC
6780: 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f  E INTO '%q'.'%q_
6790: 64 61 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29  data'(id, block)
67a0: 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a   VALUES(?,?)", .
67b0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
67c0: 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
67d0: 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20  >zName.    ));. 
67e0: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
67f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71  eturn;.  }..  sq
6800: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
6810: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20  (p->pWriter, 1, 
6820: 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  iRowid);.  sqlit
6830: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e  e3_bind_blob(p->
6840: 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74  pWriter, 2, pDat
6850: 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45  a, nData, SQLITE
6860: 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
6870: 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69  te3_step(p->pWri
6880: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
6890: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
68a0: 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c  >pWriter);.  sql
68b0: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
68c0: 2d 3e 70 57 72 69 74 65 72 2c 20 32 29 3b 0a 7d  ->pWriter, 2);.}
68d0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
68e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  the following SQ
68f0: 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c  L:.**.**     DEL
6900: 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20  ETE FROM %_data 
6910: 57 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e  WHERE id BETWEEN
6920: 20 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c   $iFirst AND $iL
6930: 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ast.*/.static vo
6940: 69 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  id fts5DataDelet
6950: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
6960: 69 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20  i64 iFirst, i64 
6970: 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d  iLast){.  if( p-
6980: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
6990: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
69a0: 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29  p->pDeleter==0 )
69b0: 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
69c0: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
69d0: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72  Config;.    char
69e0: 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
69f0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6a00: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27    "DELETE FROM '
6a10: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48  %q'.'%q_data' WH
6a20: 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64  ERE id>=? AND id
6a30: 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20  <=?", .         
6a40: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
6a50: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
6a60: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73    );.    if( fts
6a70: 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
6a80: 74 28 70 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65  t(p, &p->pDelete
6a90: 72 2c 20 7a 53 71 6c 29 20 29 20 72 65 74 75 72  r, zSql) ) retur
6aa0: 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  n;.  }..  sqlite
6ab0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
6ac0: 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69  pDeleter, 1, iFi
6ad0: 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rst);.  sqlite3_
6ae0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44  bind_int64(p->pD
6af0: 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74  eleter, 2, iLast
6b00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
6b10: 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a  p(p->pDeleter);.
6b20: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
6b30: 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65  3_reset(p->pDele
6b40: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ter);.}../*.** R
6b50: 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64  emove all record
6b60: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
6b70: 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64  h segment iSegid
6b80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6b90: 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53   fts5DataRemoveS
6ba0: 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78  egment(Fts5Index
6bb0: 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29   *p, int iSegid)
6bc0: 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d  {.  i64 iFirst =
6bd0: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
6be0: 57 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a  WID(iSegid, 0);.
6bf0: 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54    i64 iLast = FT
6c00: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
6c10: 28 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b  (iSegid+1, 0)-1;
6c20: 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  .  fts5DataDelet
6c30: 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61  e(p, iFirst, iLa
6c40: 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49  st);.  if( p->pI
6c50: 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a  dxDeleter==0 ){.
6c60: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
6c70: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
6c80: 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e  nfig;.    fts5In
6c90: 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
6ca0: 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  , &p->pIdxDelete
6cb0: 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  r, sqlite3_mprin
6cc0: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44  tf(.          "D
6cd0: 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e  ELETE FROM '%q'.
6ce0: 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73  '%q_idx' WHERE s
6cf0: 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20  egid=?",.       
6d00: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
6d10: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
6d20: 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66      ));.  }.  if
6d30: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
6d40: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
6d50: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49  3_bind_int(p->pI
6d60: 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53  dxDeleter, 1, iS
6d70: 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  egid);.    sqlit
6d80: 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44  e3_step(p->pIdxD
6d90: 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  eleter);.    p->
6da0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
6db0: 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  et(p->pIdxDelete
6dc0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
6dd0: 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
6de0: 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53  ence to an Fts5S
6df0: 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
6e00: 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65  returned by an e
6e10: 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20  arlier .** call 
6e20: 74 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65  to fts5Structure
6e30: 52 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74  Read() or fts5St
6e40: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e  ructureDecode().
6e50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6e60: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
6e70: 65 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75  ease(Fts5Structu
6e80: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
6e90: 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30  if( pStruct && 0
6ea0: 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52  >=(--pStruct->nR
6eb0: 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ef) ){.    int i
6ec0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
6ed0: 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29  truct->nRef==0 )
6ee0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6ef0: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
6f00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
6f10: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6f20: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53  ct->aLevel[i].aS
6f30: 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eg);.    }.    s
6f40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72  qlite3_free(pStr
6f50: 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  uct);.  }.}..sta
6f60: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
6f70: 75 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74  uctureRef(Fts5St
6f80: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
6f90: 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52  ){.  pStruct->nR
6fa0: 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ef++;.}../*.** D
6fb0: 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72  eserialize and r
6fc0: 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74  eturn the struct
6fd0: 75 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65  ure record curre
6fe0: 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73  ntly stored in s
6ff0: 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72  erialized.** for
7000: 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20  m within buffer 
7010: 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a  pData/nData..**.
7020: 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63  ** The Fts5Struc
7030: 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e  ture.aLevel[] an
7040: 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63  d each Fts5Struc
7050: 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d  tureLevel.aSeg[]
7060: 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76   array.** are ov
7070: 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er-allocated by 
7080: 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61  one slot. This a
7090: 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74  llows the struct
70a0: 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  ure contents.** 
70b0: 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c  to be more easil
70c0: 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  y edited..**.** 
70d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
70e0: 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65  rs, *ppOut is se
70f0: 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e  t to NULL and an
7100: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
7110: 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  de.** returned. 
7120: 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75  Otherwise, *ppOu
7130: 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  t is set to poin
7140: 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
7150: 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  ect and.** SQLIT
7160: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
7170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
7180: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
7190: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  (.  const u8 *pD
71a0: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
71b0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
71c0: 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69  ntaining seriali
71d0: 7a 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f  zed structure */
71e0: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  .  int nData,   
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
7210: 66 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79  ffer pData in by
7220: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  tes */.  int *pi
7230: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20  Cookie,         
7240: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
7250: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
7260: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35   value */.  Fts5
7270: 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75  Structure **ppOu
7280: 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t           /* O
7290: 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64  UT: Deserialized
72a0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
72b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
72c0: 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  OK;.  int i = 0;
72d0: 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69  .  int iLvl;.  i
72e0: 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20  nt nLevel = 0;. 
72f0: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
7300: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  0;.  sqlite3_int
7310: 36 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  64 nByte;       
7320: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
7330: 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
7340: 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20  te at pRet */.  
7350: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7360: 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ret = 0;        
7370: 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a  /* Structure obj
7380: 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ect to return */
7390: 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20  ..  /* Grab the 
73a0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
73b0: 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29    if( piCookie )
73c0: 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c   *piCookie = sql
73d0: 69 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44  ite3Fts5Get32(pD
73e0: 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a  ata);.  i = 4;..
73f0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f    /* Read the to
7400: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  tal number of le
7410: 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74  vels and segment
7420: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  s from the start
7430: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72   of the.  ** str
7440: 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20  ucture record.  
7450: 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65  */.  i += fts5Ge
7460: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
7470: 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20  [i], nLevel);.  
7480: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7490: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
74a0: 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69 66 28  nSegment);.  if(
74b0: 20 6e 4c 65 76 65 6c 3e 46 54 53 35 5f 4d 41 58   nLevel>FTS5_MAX
74c0: 5f 53 45 47 4d 45 4e 54 20 20 20 7c 7c 20 6e 4c  _SEGMENT   || nL
74d0: 65 76 65 6c 3c 30 0a 20 20 20 7c 7c 20 6e 53 65  evel<0.   || nSe
74e0: 67 6d 65 6e 74 3e 46 54 53 35 5f 4d 41 58 5f 53  gment>FTS5_MAX_S
74f0: 45 47 4d 45 4e 54 20 7c 7c 20 6e 53 65 67 6d 65  EGMENT || nSegme
7500: 6e 74 3c 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  nt<0.  ){.    re
7510: 74 75 72 6e 20 46 54 53 35 5f 43 4f 52 52 55 50  turn FTS5_CORRUP
7520: 54 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  T;.  }.  nByte =
7530: 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28   (.      sizeof(
7540: 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b  Fts5Structure) +
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75      /* Main stru
7570: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 73  cture */.      s
7580: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7590: 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65  ureLevel) * (nLe
75a0: 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c 65  vel-1)    /* aLe
75b0: 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vel[] array */. 
75c0: 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46 74   );.  pRet = (Ft
75d0: 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c  s5Structure*)sql
75e0: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
75f0: 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a  ro(&rc, nByte);.
7600: 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20  .  if( pRet ){. 
7610: 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20     pRet->nRef = 
7620: 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65  1;.    pRet->nLe
7630: 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20  vel = nLevel;.  
7640: 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e 74    pRet->nSegment
7650: 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20   = nSegment;.   
7660: 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   i += sqlite3Fts
7670: 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
7680: 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72  a[i], &pRet->nWr
7690: 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  iteCounter);..  
76a0: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63    for(iLvl=0; rc
76b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
76c0: 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  Lvl<nLevel; iLvl
76d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
76e0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
76f0: 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65  Lvl = &pRet->aLe
7700: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
7710: 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30 3b   int nTotal = 0;
7720: 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b  .      int iSeg;
7730: 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e  ..      if( i>=n
7740: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
7750: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
7760: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
7770: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
7780: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
7790: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d  ata[i], pLvl->nM
77a0: 65 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  erge);.        i
77b0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
77c0: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
77d0: 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  Total);.        
77e0: 69 66 28 20 6e 54 6f 74 61 6c 3c 70 4c 76 6c 2d  if( nTotal<pLvl-
77f0: 3e 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20 46  >nMerge ) rc = F
7800: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
7810: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
7820: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
7830: 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33  Segment*)sqlite3
7840: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
7850: 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rc, .           
7860: 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66   nTotal * sizeof
7870: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7880: 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 20 29  gment).        )
7890: 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 67 6d 65  ;.        nSegme
78a0: 6e 74 20 2d 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20  nt -= nTotal;.  
78b0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
78c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
78d0: 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  {.        pLvl->
78e0: 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20  nSeg = nTotal;. 
78f0: 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
7900: 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20  0; iSeg<nTotal; 
7910: 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
7920: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
7930: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
7940: 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
7950: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
7960: 20 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20   i>=nData ){.   
7970: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54           rc = FT
7980: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
7990: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
79a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
79b0: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
79c0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
79d0: 5b 69 5d 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  [i], pSeg->iSegi
79e0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  d);.          i 
79f0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7a00: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 53  32(&pData[i], pS
7a10: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg->pgnoFirst);.
7a20: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66            i += f
7a30: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
7a40: 70 44 61 74 61 5b 69 5d 2c 20 70 53 65 67 2d 3e  pData[i], pSeg->
7a50: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20  pgnoLast);.     
7a60: 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
7a70: 67 6e 6f 4c 61 73 74 3c 70 53 65 67 2d 3e 70 67  gnoLast<pSeg->pg
7a80: 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  noFirst ){.     
7a90: 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35         rc = FTS5
7aa0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7ab0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7ac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7ad0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
7ae0: 4c 76 6c 3e 30 20 26 26 20 70 4c 76 6c 5b 2d 31  Lvl>0 && pLvl[-1
7af0: 5d 2e 6e 4d 65 72 67 65 20 26 26 20 6e 54 6f 74  ].nMerge && nTot
7b00: 61 6c 3d 3d 30 20 29 20 72 63 20 3d 20 46 54 53  al==0 ) rc = FTS
7b10: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
7b20: 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 6e 4c 65     if( iLvl==nLe
7b30: 76 65 6c 2d 31 20 26 26 20 70 4c 76 6c 2d 3e 6e  vel-1 && pLvl->n
7b40: 4d 65 72 67 65 20 29 20 72 63 20 3d 20 46 54 53  Merge ) rc = FTS
7b50: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
7b60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
7b70: 20 6e 53 65 67 6d 65 6e 74 21 3d 30 20 26 26 20   nSegment!=0 && 
7b80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
7b90: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
7ba0: 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d  T;..    if( rc!=
7bb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7bc0: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
7bd0: 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20  Release(pRet);. 
7be0: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
7bf0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f     }.  }..  *ppO
7c00: 75 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74  ut = pRet;.  ret
7c10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7c20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7c30: 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
7c40: 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20  Level(int *pRc, 
7c50: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
7c60: 70 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  ppStruct){.  if(
7c70: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
7c80: 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
7c90: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
7ca0: 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20   *ppStruct;.    
7cb0: 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74  int nLevel = pSt
7cc0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  ruct->nLevel;.  
7cd0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
7ce0: 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20  nByte = (.      
7cf0: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7d00: 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20  ucture) +       
7d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7d20: 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  in structure */.
7d30: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46          sizeof(F
7d40: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7d50: 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20  l) * (nLevel+1) 
7d60: 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72   /* aLevel[] arr
7d70: 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20  ay */.    );..  
7d80: 20 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69    pStruct = sqli
7d90: 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 53  te3_realloc64(pS
7da0: 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20  truct, nByte);. 
7db0: 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
7dc0: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  {.      memset(&
7dd0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
7de0: 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65  nLevel], 0, size
7df0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7e00: 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70  Level));.      p
7e10: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b  Struct->nLevel++
7e20: 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63  ;.      *ppStruc
7e30: 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20  t = pStruct;.   
7e40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
7e50: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
7e60: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  M;.    }.  }.}..
7e70: 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76  /*.** Extend lev
7e80: 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20  el iLvl so that 
7e90: 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f  there is room fo
7ea0: 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72  r at least nExtr
7eb0: 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e  a more.** segmen
7ec0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
7ed0: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
7ee0: 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69  ExtendLevel(.  i
7ef0: 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35  nt *pRc, .  Fts5
7f00: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
7f10: 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  ct, .  int iLvl,
7f20: 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20   .  int nExtra, 
7f30: 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29  .  int bInsert.)
7f40: 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
7f50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
7f60: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7f70: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
7f80: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
7f90: 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  ;.    Fts5Struct
7fa0: 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77  ureSegment *aNew
7fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
7fc0: 74 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  t64 nByte;..    
7fd0: 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nByte = (pLvl->n
7fe0: 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20  Seg + nExtra) * 
7ff0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
8000: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
8010: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
8020: 5f 72 65 61 6c 6c 6f 63 36 34 28 70 4c 76 6c 2d  _realloc64(pLvl-
8030: 3e 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20  >aSeg, nByte);. 
8040: 20 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20     if( aNew ){. 
8050: 20 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74       if( bInsert
8060: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==0 ){.        m
8070: 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c  emset(&aNew[pLvl
8080: 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65  ->nSeg], 0, size
8090: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
80a0: 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72  Segment) * nExtr
80b0: 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
80c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f  .        int nMo
80d0: 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20  ve = pLvl->nSeg 
80e0: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
80f0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
8100: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
8110: 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61  &aNew[nExtra], a
8120: 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20  New, nMove);.   
8130: 20 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77       memset(aNew
8140: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
8150: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8160: 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  ) * nExtra);.   
8170: 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d     }.      pLvl-
8180: 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20  >aSeg = aNew;.  
8190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
81a0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
81b0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  EM;.    }.  }.}.
81c0: 0a 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75  .static Fts5Stru
81d0: 63 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63  cture *fts5Struc
81e0: 74 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64  tureReadUncached
81f0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
8200: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
8210: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73  *pRet = 0;.  Fts
8220: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
8230: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
8240: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20   int iCookie;   
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
8270: 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74  n cookie */.  Ft
8280: 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a  s5Data *pData;..
8290: 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
82a0: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
82b0: 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b  TRUCTURE_ROWID);
82c0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
82d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
82e0: 2a 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65  * TODO: Do we ne
82f0: 65 64 20 74 68 69 73 20 69 66 20 74 68 65 20 6c  ed this if the l
8300: 65 61 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70  eaf-index is app
8310: 65 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e  ended? Probably.
8320: 2e 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  .. */.    memset
8330: 28 26 70 44 61 74 61 2d 3e 70 5b 70 44 61 74 61  (&pData->p[pData
8340: 2d 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44  ->nn], 0, FTS5_D
8350: 41 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20  ATA_PADDING);.  
8360: 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74    p->rc = fts5St
8370: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44  ructureDecode(pD
8380: 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e  ata->p, pData->n
8390: 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52  n, &iCookie, &pR
83a0: 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  et);.    if( p->
83b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
83c0: 20 28 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3d   (pConfig->pgsz=
83d0: 3d 30 20 7c 7c 20 70 43 6f 6e 66 69 67 2d 3e 69  =0 || pConfig->i
83e0: 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 29  Cookie!=iCookie)
83f0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8400: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  = sqlite3Fts5Con
8410: 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c  figLoad(pConfig,
8420: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d   iCookie);.    }
8430: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
8440: 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
8450: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
8460: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
8470: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
8480: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
8490: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d   pRet = 0;.    }
84a0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
84b0: 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Ret;.}..static i
84c0: 36 34 20 66 74 73 35 49 6e 64 65 78 44 61 74 61  64 fts5IndexData
84d0: 56 65 72 73 69 6f 6e 28 46 74 73 35 49 6e 64 65  Version(Fts5Inde
84e0: 78 20 2a 70 29 7b 0a 20 20 69 36 34 20 69 56 65  x *p){.  i64 iVe
84f0: 72 73 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 69 66  rsion = 0;..  if
8500: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8510: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
8520: 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 3d 3d 30  >pDataVersion==0
8530: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8540: 3d 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61  = fts5IndexPrepa
8550: 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44  reStmt(p, &p->pD
8560: 61 74 61 56 65 72 73 69 6f 6e 2c 20 0a 20 20 20  ataVersion, .   
8570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
8580: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25  printf("PRAGMA %
8590: 51 2e 64 61 74 61 5f 76 65 72 73 69 6f 6e 22 2c  Q.data_version",
85a0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 7a 44 62   p->pConfig->zDb
85b0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
85c0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
85d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
85e0: 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
85f0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
8600: 65 70 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69  ep(p->pDataVersi
8610: 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 56 65  on) ){.      iVe
8620: 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  rsion = sqlite3_
8630: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 2d 3e  column_int64(p->
8640: 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20 30 29  pDataVersion, 0)
8650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  ;.    }.    p->r
8660: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
8670: 74 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  t(p->pDataVersio
8680: 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
8690: 6e 20 69 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  n iVersion;.}../
86a0: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
86b0: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
86c0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
86d0: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  record..**.** Th
86e0: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
86f0: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
8700: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
8710: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
8720: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
8730: 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72  located as descr
8740: 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f  ibed for functio
8750: 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  n fts5StructureD
8760: 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76  ecode() .** abov
8770: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
8780: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
8790: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
87a0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
87b0: 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46  left in the.** F
87c0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
87d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
87e0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
87f0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
8800: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
8810: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
8820: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
8830: 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53  Structure *fts5S
8840: 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73  tructureRead(Fts
8850: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 0a 20 20 69  5Index *p){..  i
8860: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 3d 3d 30  f( p->pStruct==0
8870: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 53 74 72 75   ){.    p->iStru
8880: 63 74 56 65 72 73 69 6f 6e 20 3d 20 66 74 73 35  ctVersion = fts5
8890: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
88a0: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
88b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
88c0: 0a 20 20 20 20 20 20 70 2d 3e 70 53 74 72 75 63  .      p->pStruc
88d0: 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
88e0: 65 52 65 61 64 55 6e 63 61 63 68 65 64 28 70 29  eReadUncached(p)
88f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
8900: 20 30 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 46   0.  else{.    F
8910: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 54  ts5Structure *pT
8920: 65 73 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  est = fts5Struct
8930: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
8940: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 73  p);.    if( pTes
8950: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
8960: 2c 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  , j;.      asser
8970: 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74  t_nc( p->pStruct
8980: 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 70 54 65 73  ->nSegment==pTes
8990: 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 20  t->nSegment );. 
89a0: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
89b0: 70 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  p->pStruct->nLev
89c0: 65 6c 3d 3d 70 54 65 73 74 2d 3e 6e 4c 65 76 65  el==pTest->nLeve
89d0: 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  l );.      for(i
89e0: 3d 30 3b 20 69 3c 70 54 65 73 74 2d 3e 6e 4c 65  =0; i<pTest->nLe
89f0: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
8a00: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
8a10: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8a20: 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 70 54 65 73  [i].nMerge==pTes
8a30: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
8a40: 72 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rge );.        a
8a50: 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74  ssert_nc( p->pSt
8a60: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
8a70: 6e 53 65 67 3d 3d 70 54 65 73 74 2d 3e 61 4c 65  nSeg==pTest->aLe
8a80: 76 65 6c 5b 69 5d 2e 6e 53 65 67 20 29 3b 0a 20  vel[i].nSeg );. 
8a90: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
8aa0: 6a 3c 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b  j<pTest->aLevel[
8ab0: 69 5d 2e 6e 53 65 67 3b 20 6a 2b 2b 29 7b 0a 20  i].nSeg; j++){. 
8ac0: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
8ad0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8ae0: 31 20 3d 20 26 70 54 65 73 74 2d 3e 61 4c 65 76  1 = &pTest->aLev
8af0: 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20  el[i].aSeg[j];. 
8b00: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
8b10: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8b20: 32 20 3d 20 26 70 2d 3e 70 53 74 72 75 63 74 2d  2 = &p->pStruct-
8b30: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b  >aLevel[i].aSeg[
8b40: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  j];.          as
8b50: 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e 69 53 65  sert_nc( p1->iSe
8b60: 67 69 64 3d 3d 70 32 2d 3e 69 53 65 67 69 64 20  gid==p2->iSegid 
8b70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
8b80: 65 72 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f  ert_nc( p1->pgno
8b90: 46 69 72 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 46  First==p2->pgnoF
8ba0: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
8bb0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d    assert_nc( p1-
8bc0: 3e 70 67 6e 6f 4c 61 73 74 3d 3d 70 32 2d 3e 70  >pgnoLast==p2->p
8bd0: 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  gnoLast );.     
8be0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8bf0: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
8c00: 52 65 6c 65 61 73 65 28 70 54 65 73 74 29 3b 0a  Release(pTest);.
8c10: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
8c20: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ..  if( p->rc!=S
8c30: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8c40: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
8c50: 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e  ->iStructVersion
8c60: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8c70: 20 70 2d 3e 70 53 74 72 75 63 74 21 3d 30 20 29   p->pStruct!=0 )
8c80: 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
8c90: 65 52 65 66 28 70 2d 3e 70 53 74 72 75 63 74 29  eRef(p->pStruct)
8ca0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 53  ;.  return p->pS
8cb0: 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
8cc0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
8cd0: 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 46 74  ureInvalidate(Ft
8ce0: 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
8cf0: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 20 29 7b  f( p->pStruct ){
8d00: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
8d10: 72 65 52 65 6c 65 61 73 65 28 70 2d 3e 70 53 74  reRelease(p->pSt
8d20: 72 75 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53  ruct);.    p->pS
8d30: 74 72 75 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  truct = 0;.  }.}
8d40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8d50: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8d60: 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69  of segments in i
8d70: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
8d80: 53 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20  Struct. This.** 
8d90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
8da0: 20 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61   ever used as pa
8db0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63  rt of assert() c
8dc0: 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69  onditions..*/.#i
8dd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8de0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  G.static int fts
8df0: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8e00: 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75  egments(Fts5Stru
8e10: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8e20: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
8e30: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8e40: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
8e50: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
8e60: 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
8e70: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
8ea0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
8eb0: 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f  levels */.    fo
8ec0: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
8ed0: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
8ee0: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  iLvl++){.      n
8ef0: 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75  Segment += pStru
8f00: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
8f10: 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nSeg;.    }.  }
8f20: 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d  ..  return nSegm
8f30: 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ent;.}.#endif..#
8f40: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
8f50: 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
8f60: 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  pBuf, pBlob, nBl
8f70: 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73  ob) {     \.  as
8f80: 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53  sert( (pBuf)->nS
8f90: 70 61 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e  pace>=((pBuf)->n
8fa0: 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20  +nBlob) );      
8fb0: 20 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70         \.  memcp
8fc0: 79 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42  y(&(pBuf)->p[(pB
8fd0: 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20  uf)->n], pBlob, 
8fe0: 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20  nBlob);         
8ff0: 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e      \.  (pBuf)->
9000: 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20  n += nBlob;     
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9030: 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74   \.}..#define ft
9040: 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
9050: 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
9060: 56 61 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20  Val) {          
9070: 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29        \.  (pBuf)
9080: 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
9090: 73 35 50 75 74 56 61 72 69 6e 74 28 26 28 70 42  s5PutVarint(&(pB
90a0: 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e  uf)->p[(pBuf)->n
90b0: 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20  ], (iVal));  \. 
90c0: 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
90d0: 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d  >nSpace>=(pBuf)-
90e0: 3e 6e 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  >n );           
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
9100: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61  .}.../*.** Seria
9110: 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74  lize and store t
9120: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
9130: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
9140: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
9150: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
9160: 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35  code in the Fts5
9170: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66  Index object. If
9180: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73   an.** error has
9190: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
91a0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
91b0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
91c0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
91d0: 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46  StructureWrite(F
91e0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
91f0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
9200: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  uct){.  if( p->r
9210: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9220: 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62      Fts5Buffer b
9230: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
9240: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73    /* Buffer to s
9250: 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20  erialize record 
9260: 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20  into */.    int 
9270: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
9280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
9290: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
92a0: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
92b0: 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20     int iCookie; 
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65   /* Cookie value
92e0: 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20   to store */..  
92f0: 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
9300: 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
9310: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
9320: 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
9330: 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   );.    memset(&
9340: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
9350: 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
9360: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
9370: 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72  current configur
9380: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
9390: 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d      iCookie = p-
93a0: 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69  >pConfig->iCooki
93b0: 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b  e;.    if( iCook
93c0: 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d  ie<0 ) iCookie =
93d0: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d   0;..    if( 0==
93e0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
93f0: 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62  rSize(&p->rc, &b
9400: 75 66 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a  uf, 4+9+9+9) ){.
9410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
9420: 35 50 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43  5Put32(buf.p, iC
9430: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75  ookie);.      bu
9440: 66 2e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66  f.n = 4;.      f
9450: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
9460: 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20  endVarint(&buf, 
9470: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29  pStruct->nLevel)
9480: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
9490: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
94a0: 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74  nt(&buf, pStruct
94b0: 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ->nSegment);.   
94c0: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
94d0: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62  eAppendVarint(&b
94e0: 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74  uf, (i64)pStruct
94f0: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
9500: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
9510: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
9520: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
9530: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  Lvl++){.      in
9540: 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
9550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
9560: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
9570: 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
9580: 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  */.      Fts5Str
9590: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
95a0: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
95b0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
95c0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
95d0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
95e0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65   &buf, pLvl->nMe
95f0: 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  rge);.      fts5
9600: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9610: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9620: 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20   pLvl->nSeg);.  
9630: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
9640: 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e  ->nMerge<=pLvl->
9650: 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66  nSeg );..      f
9660: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
9670: 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67  pLvl->nSeg; iSeg
9680: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ++){.        fts
9690: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
96a0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
96b0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
96c0: 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g].iSegid);.    
96d0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
96e0: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
96f0: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61  c, &buf, pLvl->a
9700: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69  Seg[iSeg].pgnoFi
9710: 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  rst);.        ft
9720: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9730: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9740: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9750: 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  eg].pgnoLast);. 
9760: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9770: 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
9780: 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  p, FTS5_STRUCTUR
9790: 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20  E_ROWID, buf.p, 
97a0: 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35  buf.n);.    fts5
97b0: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
97c0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73  ;.  }.}..#if 0.s
97d0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
97e0: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e  ebugStructure(in
97f0: 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46  t*,Fts5Buffer*,F
9800: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a  ts5Structure*);.
9810: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9820: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63  PrintStructure(c
9830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74  onst char *zCapt
9840: 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75  ion, Fts5Structu
9850: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
9860: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9870: 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  OK;.  Fts5Buffer
9880: 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
9890: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  buf, 0, sizeof(b
98a0: 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75  uf));.  fts5Debu
98b0: 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  gStructure(&rc, 
98c0: 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a  &buf, pStruct);.
98d0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
98e0: 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43  , "%s: %s\n", zC
98f0: 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a  aption, buf.p);.
9900: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
9910: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
9920: 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73  ee(&buf);.}.#els
9930: 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50  e.# define fts5P
9940: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c  rintStructure(x,
9950: 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  y).#endif..stati
9960: 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e  c int fts5Segmen
9970: 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74  tSize(Fts5Struct
9980: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
9990: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20  ){.  return 1 + 
99a0: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
99b0: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
99c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
99d0: 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65  n a copy of inde
99e0: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
99f0: 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f  uct. Except, pro
9a00: 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a  mote as many .**
9a10: 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73   segments as pos
9a20: 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69  sible to level i
9a30: 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f  Promote. If an O
9a40: 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  OM occurs, NULL 
9a50: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
9a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9a70: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9a80: 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e  moteTo(.  Fts5In
9a90: 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50  dex *p,.  int iP
9aa0: 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a  romote,.  int sz
9ab0: 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53  Promote,.  Fts5S
9ac0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
9ad0: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69  t.){.  int il, i
9ae0: 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  s;.  Fts5Structu
9af0: 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20  reLevel *pOut = 
9b00: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
9b10: 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69  [iPromote];..  i
9b20: 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d  f( pOut->nMerge=
9b30: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c  =0 ){.    for(il
9b40: 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c  =iPromote+1; il<
9b50: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9b60: 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74   il++){.      Ft
9b70: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9b80: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
9b90: 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20  t->aLevel[il];. 
9ba0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
9bb0: 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a  Merge ) return;.
9bc0: 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76        for(is=pLv
9bd0: 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30  l->nSeg-1; is>=0
9be0: 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20  ; is--){.       
9bf0: 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65   int sz = fts5Se
9c00: 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d  gmentSize(&pLvl-
9c10: 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20  >aSeg[is]);.    
9c20: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f      if( sz>szPro
9c30: 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  mote ) return;. 
9c40: 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
9c50: 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
9c60: 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
9c70: 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29   iPromote, 1, 1)
9c80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
9c90: 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
9ca0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
9cb0: 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  t->aSeg, &pLvl->
9cc0: 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66  aSeg[is], sizeof
9cd0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
9ce0: 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20  gment));.       
9cf0: 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20   pOut->nSeg++;. 
9d00: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
9d10: 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
9d20: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9d30: 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61  A new segment ha
9d40: 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74  s just been writ
9d50: 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76  ten to level iLv
9d60: 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  l of index struc
9d70: 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e  ture.** pStruct.
9d80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
9d90: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79  etermines if any
9da0: 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64   segments should
9db0: 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20   be promoted.** 
9dc0: 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67  as a result. Seg
9dd0: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9de0: 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ed in two scenar
9df0: 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
9e00: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
9e10: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73  ust written is s
9e20: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20  maller than one 
9e30: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
9e40: 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20  .**      within 
9e50: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70  the previous pop
9e60: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74  ulated level, it
9e70: 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20   is promoted to 
9e80: 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20  the previous.** 
9e90: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c       populated l
9ea0: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29  evel..**.**   b)
9eb0: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
9ec0: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
9ed0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
9ee0: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
9ef0: 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65  n.**      the ne
9f00: 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76  xt populated lev
9f10: 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65  el, then that se
9f20: 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f  gment, and any o
9f30: 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  ther adjacent.**
9f40: 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74        segments t
9f50: 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61  hat are also sma
9f60: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ller than the on
9f70: 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  e just written, 
9f80: 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f  are .**      pro
9f90: 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  moted. .**.** If
9fa0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
9fb0: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9fc0: 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  ed, the structur
9fd0: 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61  e object is upda
9fe0: 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63  ted.** to reflec
9ff0: 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  t this..*/.stati
a000: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
a010: 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46  turePromote(.  F
a020: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a040: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
a050: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
a060: 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
a070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a080: 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75  dex level just u
a090: 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35  pdated */.  Fts5
a0a0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
a0b0: 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ct          /* I
a0c0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
a0d0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
a0e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a0f0: 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20     int iTst;.   
a100: 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20   int iPromote = 
a110: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72  -1;.    int szPr
a120: 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20  omote = 0;      
a130: 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65        /* Promote
a140: 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73   anything this s
a150: 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a  ize or smaller *
a160: 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  /.    Fts5Struct
a170: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
a180: 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a  ;   /* Segment j
a190: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ust written */. 
a1a0: 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20     int szSeg;   
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d   /* Size of segm
a1d0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
a1e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67   */.    int nSeg
a1f0: 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
a200: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a  el[iLvl].nSeg;..
a210: 20 20 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20      if( nSeg==0 
a220: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53  ) return;.    pS
a230: 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
a240: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
a250: 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  [pStruct->aLevel
a260: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a  [iLvl].nSeg-1];.
a270: 20 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b      szSeg = (1 +
a280: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
a290: 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  - pSeg->pgnoFirs
a2a0: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  t);..    /* Chec
a2b0: 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  k for condition 
a2c0: 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  (a) */.    for(i
a2d0: 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74  Tst=iLvl-1; iTst
a2e0: 3e 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e  >=0 && pStruct->
a2f0: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65  aLevel[iTst].nSe
a300: 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20  g==0; iTst--);. 
a310: 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29     if( iTst>=0 )
a320: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a330: 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d       int szMax =
a340: 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74   0;.      Fts5St
a350: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54  ructureLevel *pT
a360: 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  st = &pStruct->a
a370: 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20  Level[iTst];.   
a380: 20 20 20 61 73 73 65 72 74 28 20 70 54 73 74 2d     assert( pTst-
a390: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20  >nMerge==0 );.  
a3a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a3b0: 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  Tst->nSeg; i++){
a3c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
a3d0: 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  = pTst->aSeg[i].
a3e0: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d  pgnoLast - pTst-
a3f0: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72  >aSeg[i].pgnoFir
a400: 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  st + 1;.        
a410: 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73  if( sz>szMax ) s
a420: 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20  zMax = sz;.     
a430: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
a440: 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20  ax>=szSeg ){.   
a450: 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
a460: 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50  n (a) is true. P
a470: 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73  romote the newes
a480: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76  t segment on lev
a490: 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  el .        ** i
a4a0: 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73  Lvl to level iTs
a4b0: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  t.  */.        i
a4c0: 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a  Promote = iTst;.
a4d0: 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74          szPromot
a4e0: 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20  e = szMax;.     
a4f0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a500: 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61   If condition (a
a510: 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73  ) is not met, as
a520: 73 75 6d 65 20 28 62 29 20 69 73 20 74 72 75 65  sume (b) is true
a530: 2e 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  . StructurePromo
a540: 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73  teTo().    ** is
a550: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69   a no-op if it i
a560: 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69  s not.  */.    i
a570: 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b  f( iPromote<0 ){
a580: 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20  .      iPromote 
a590: 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a  = iLvl;.      sz
a5a0: 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b  Promote = szSeg;
a5b0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
a5c0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
a5d0: 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73  o(p, iPromote, s
a5e0: 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63  zPromote, pStruc
a5f0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
a600: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
a610: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a620: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a630: 6e 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f  nt. If the end o
a640: 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  f the .** doclis
a650: 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20  t-index page is 
a660: 72 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20  reached, return 
a670: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
a680: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a690: 78 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69  xLvlNext(Fts5Dli
a6a0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  dxLvl *pLvl){.  
a6b0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20  Fts5Data *pData 
a6c0: 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a  = pLvl->pData;..
a6d0: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66    if( pLvl->iOff
a6e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
a6f0: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
a700: 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f   );.    pLvl->iO
a710: 66 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c  ff = 1;.    pLvl
a720: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
a730: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
a740: 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c  ->p[1], pLvl->iL
a750: 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  eafPgno);.    pL
a760: 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  vl->iOff += fts5
a770: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
a780: 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c  ->p[pLvl->iOff],
a790: 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52   (u64*)&pLvl->iR
a7a0: 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  owid);.    pLvl-
a7b0: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76  >iFirstOff = pLv
a7c0: 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65  l->iOff;.  }else
a7d0: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  {.    int iOff;.
a7e0: 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76      for(iOff=pLv
a7f0: 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  l->iOff; iOff<pD
a800: 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29  ata->nn; iOff++)
a810: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  {.      if( pDat
a820: 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65  a->p[iOff] ) bre
a830: 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ak; .    }..    
a840: 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  if( iOff<pData->
a850: 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  nn ){.      i64 
a860: 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c  iVal;.      pLvl
a870: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28  ->iLeafPgno += (
a880: 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66  iOff - pLvl->iOf
a890: 66 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f  f) + 1;.      iO
a8a0: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
a8b0: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
a8c0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
a8d0: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  );.      pLvl->i
a8e0: 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Rowid += iVal;. 
a8f0: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20       pLvl->iOff 
a900: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  = iOff;.    }els
a910: 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62  e{.      pLvl->b
a920: 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
a930: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
a940: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  l->bEof;.}../*.*
a950: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
a960: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a970: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a980: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
a990: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  t fts5DlidxIterN
a9a0: 65 78 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a  extR(Fts5Index *
a9b0: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
a9c0: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76   *pIter, int iLv
a9d0: 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c  l){.  Fts5DlidxL
a9e0: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
a9f0: 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a  r->aLvl[iLvl];..
aa00: 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
aa10: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20  Iter->nLvl );.  
aa20: 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  if( fts5DlidxLvl
aa30: 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20  Next(pLvl) ){.  
aa40: 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c    if( (iLvl+1) <
aa50: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a   pIter->nLvl ){.
aa60: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
aa70: 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65  terNextR(p, pIte
aa80: 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20  r, iLvl+1);.    
aa90: 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45    if( pLvl[1].bE
aaa0: 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
aab0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
aac0: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
aad0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c         memset(pL
aae0: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
aaf0: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
ab00: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
ab10: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
ab20: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
ab30: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
ab40: 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c  D(pIter->iSegid,
ab50: 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69   iLvl, pLvl[1].i
ab60: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
ab70: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
ab80: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66   pLvl->pData ) f
ab90: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
aba0: 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pLvl);.      }. 
abb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
abc0: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
abd0: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
abe0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
abf0: 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
ac00: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
ac10: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
ac20: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
ac30: 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72  erNextR(p, pIter
ac40: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
ac50: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
ac60: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
ac70: 61 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65  argument has the
ac80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
ac90: 73 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  s set.** as foll
aca0: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
acb0: 6f 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72  on sets up the r
acc0: 65 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61  est of the itera
acd0: 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  tor so that it.*
ace0: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
acf0: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74  first rowid in t
ad00: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
ad10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a  ..**.**   pData:
ad20: 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20  .**     pointer 
ad30: 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  to doclist-index
ad40: 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20   record, .**.** 
ad50: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
ad60: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74  on is called pIt
ad70: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73  er->iLeafPgno is
ad80: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
ad90: 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20   the.** doclist 
ada0: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
adb0: 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74  th (the one feat
adc0: 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e  uring the term).
add0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
ade0: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
adf0: 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t(Fts5DlidxIter 
ae00: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
ae10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ae20: 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29  Iter->nLvl; i++)
ae30: 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c  {.    fts5DlidxL
ae40: 76 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61  vlNext(&pIter->a
ae50: 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Lvl[i]);.  }.  r
ae60: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
ae70: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73  l[0].bEof;.}...s
ae80: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
ae90: 69 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49  idxIterEof(Fts5I
aea0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
aeb0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
aec0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d    return p->rc!=
aed0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
aee0: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
aef0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
af00: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
af10: 73 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  st(Fts5Index *p,
af20: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
af30: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
af40: 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65  ..  /* Advance e
af50: 61 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65  ach level to the
af60: 20 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74   last entry on t
af70: 68 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a  he last page */.
af80: 20 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e    for(i=pIter->n
af90: 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51  Lvl-1; p->rc==SQ
afa0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b  LITE_OK && i>=0;
afb0: 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44   i--){.    Fts5D
afc0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
afd0: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
afe0: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
aff0: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
b000: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  l)==0 );.    pLv
b010: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20  l->bEof = 0;..  
b020: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
b030: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
b040: 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b  *pChild = &pLvl[
b050: 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44  -1];.      fts5D
b060: 61 74 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c  ataRelease(pChil
b070: 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  d->pData);.     
b080: 20 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20   memset(pChild, 
b090: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
b0a0: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
b0b0: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20  pChild->pData = 
b0c0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
b0d0: 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
b0e0: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
b0f0: 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20  r->iSegid, i-1, 
b100: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pLvl->iLeafPgno)
b110: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
b120: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76    }.}../*.** Mov
b130: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
b140: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
b150: 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  y argument to th
b160: 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
b170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b180: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
b190: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70  (Fts5DlidxLvl *p
b1a0: 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  Lvl){.  int iOff
b1b0: 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a   = pLvl->iOff;..
b1c0: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
b1d0: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28  bEof==0 );.  if(
b1e0: 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69   iOff<=pLvl->iFi
b1f0: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c  rstOff ){.    pL
b200: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
b210: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61  }else{.    u8 *a
b220: 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e   = pLvl->pData->
b230: 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  p;.    i64 iVal;
b240: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
b250: 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
b260: 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a   int nZero = 0;.
b270: 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  .    /* Currentl
b280: 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f  y iOff points to
b290: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
b2a0: 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69  of a varint. Thi
b2b0: 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  s block .    ** 
b2c0: 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20  decrements iOff 
b2d0: 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
b2e0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
b2f0: 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  e of the previou
b300: 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74  s .    ** varint
b310: 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f  . Taking care no
b320: 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65  t to read any me
b330: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74  mory locations t
b340: 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a  hat occur.    **
b350: 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66   before the buff
b360: 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a  er in memory.  *
b370: 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28  /.    iLimit = (
b380: 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20  iOff>9 ? iOff-9 
b390: 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f  : 0);.    for(iO
b3a0: 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69  ff--; iOff>iLimi
b3b0: 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20  t; iOff--){.    
b3c0: 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d    if( (a[iOff-1]
b3d0: 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72   & 0x80)==0 ) br
b3e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
b3f0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
b400: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
b410: 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  Val);.    pLvl->
b420: 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a  iRowid -= iVal;.
b430: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
b440: 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53  gno--;..    /* S
b450: 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61  kip backwards pa
b460: 73 74 20 61 6e 79 20 30 78 30 30 20 76 61 72 69  st any 0x00 vari
b470: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  nts. */.    for(
b480: 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70  ii=iOff-1; ii>=p
b490: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26  Lvl->iFirstOff &
b4a0: 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69  & a[ii]==0x00; i
b4b0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72  i--){.      nZer
b4c0: 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  o++;.    }.    i
b4d0: 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69  f( ii>=pLvl->iFi
b4e0: 72 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d  rstOff && (a[ii]
b4f0: 20 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20   & 0x80) ){.    
b500: 20 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d    /* The byte im
b510: 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65  mediately before
b520: 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 62   the last 0x00 b
b530: 79 74 65 20 68 61 73 20 74 68 65 20 30 78 38 30  yte has the 0x80
b540: 20 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65   bit.      ** se
b550: 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30  t. So the last 0
b560: 78 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61  x00 is only a va
b570: 72 69 6e 74 20 30 20 69 66 20 74 68 65 72 65 20  rint 0 if there 
b580: 61 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a  are 8 more 0x80.
b590: 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62        ** bytes b
b5a0: 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a  efore a[ii]. */.
b5b0: 20 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20        int bZero 
b5c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b5d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73    /* True if las
b5e0: 74 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f  t 0x00 counts */
b5f0: 0a 20 20 20 20 20 20 69 66 28 20 28 69 69 2d 38  .      if( (ii-8
b600: 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  )>=pLvl->iFirstO
b610: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ff ){.        in
b620: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
b630: 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61  (j=1; j<=8 && (a
b640: 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20  [ii-j] & 0x80); 
b650: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a  j++);.        bZ
b660: 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20  ero = (j>8);.   
b670: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62     }.      if( b
b680: 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d  Zero==0 ) nZero-
b690: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76  -;.    }.    pLv
b6a0: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20  l->iLeafPgno -= 
b6b0: 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d  nZero;.    pLvl-
b6c0: 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e  >iOff = iOff - n
b6d0: 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Zero;.  }..  ret
b6e0: 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a  urn pLvl->bEof;.
b6f0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
b700: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52  s5DlidxIterPrevR
b710: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
b720: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
b730: 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a  ter, int iLvl){.
b740: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
b750: 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
b760: 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73  Lvl[iLvl];..  as
b770: 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72  sert( iLvl<pIter
b780: 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20  ->nLvl );.  if( 
b790: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
b7a0: 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66  (pLvl) ){.    if
b7b0: 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74  ( (iLvl+1) < pIt
b7c0: 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20  er->nLvl ){.    
b7d0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
b7e0: 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69  revR(p, pIter, i
b7f0: 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  Lvl+1);.      if
b800: 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d  ( pLvl[1].bEof==
b810: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
b820: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
b830: 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
b840: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
b850: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
b860: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
b870: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
b880: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
b890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53  .            FTS
b8a0: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49  5_DLIDX_ROWID(pI
b8b0: 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76  ter->iSegid, iLv
b8c0: 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66  l, pLvl[1].iLeaf
b8d0: 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
b8e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
b8f0: 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20  l->pData ){.    
b900: 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73        while( fts
b910: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
b920: 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  vl)==0 );.      
b930: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
b940: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
b950: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b960: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
b970: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
b980: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b990: 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 46 74  DlidxIterPrev(Ft
b9a0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
b9b0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b9c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ){.  return fts5
b9d0: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70  DlidxIterPrevR(p
b9e0: 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a  , pIter, 0);.}..
b9f0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63  /*.** Free a doc
ba00: 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61  list-index itera
ba10: 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  tor object alloc
ba20: 61 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64  ated by fts5Dlid
ba30: 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a  xIterInit()..*/.
ba40: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ba50: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74  DlidxIterFree(Ft
ba60: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
ba70: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
ba80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ba90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
baa0: 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
bab0: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
bac0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c  elease(pIter->aL
bad0: 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20  vl[i].pData);.  
bae0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
baf0: 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
bb00: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
bb10: 6c 69 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c  lidxIter *fts5Dl
bb20: 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46  idxIterInit(.  F
bb30: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb50: 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74  * Fts5 Backend t
bb60: 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
bb70: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
bba0: 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a  r ORDER BY ASC *
bbb0: 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20  /.  int iSegid, 
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
bbe0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  d */.  int iLeaf
bbf0: 50 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg              
bc00: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
bc10: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f  age number to lo
bc20: 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a  ad dlidx for */.
bc30: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
bc40: 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
bc50: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44   int i;.  int bD
bc60: 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  one = 0;..  for(
bc70: 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
bc80: 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d  TE_OK && bDone==
bc90: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  0; i++){.    sql
bca0: 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
bcb0: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c   = sizeof(Fts5Dl
bcc0: 69 64 78 49 74 65 72 29 20 2b 20 69 20 2a 20 73  idxIter) + i * s
bcd0: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
bce0: 76 6c 29 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  vl);.    Fts5Dli
bcf0: 64 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20  dxIter *pNew;.. 
bd00: 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 44     pNew = (Fts5D
bd10: 6c 69 64 78 49 74 65 72 2a 29 73 71 6c 69 74 65  lidxIter*)sqlite
bd20: 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 49 74 65  3_realloc64(pIte
bd30: 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  r, nByte);.    i
bd40: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
bd50: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
bd60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
bd70: 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69  lse{.      i64 i
bd80: 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 44 4c 49  Rowid = FTS5_DLI
bd90: 44 58 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  DX_ROWID(iSegid,
bda0: 20 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20 20   i, iLeafPg);.  
bdb0: 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
bdc0: 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e   *pLvl = &pNew->
bdd0: 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70  aLvl[i];.      p
bde0: 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Iter = pNew;.   
bdf0: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
be00: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
be10: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
be20: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
be30: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
be40: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
be50: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26 20   pLvl->pData && 
be60: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b  (pLvl->pData->p[
be70: 30 5d 20 26 20 30 78 30 30 30 31 29 3d 3d 30 20  0] & 0x0001)==0 
be80: 29 7b 0a 20 20 20 20 20 20 20 20 62 44 6f 6e 65  ){.        bDone
be90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
bea0: 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20      pIter->nLvl 
beb0: 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = i+1;.    }.  }
bec0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
bed0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bee0: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  pIter->iSegid = 
bef0: 69 53 65 67 69 64 3b 0a 20 20 20 20 69 66 28 20  iSegid;.    if( 
bf00: 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20  bRev==0 ){.     
bf10: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69   fts5DlidxIterFi
bf20: 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20  rst(pIter);.    
bf30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
bf40: 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70  5DlidxIterLast(p
bf50: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a  , pIter);.    }.
bf60: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
bf70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bf80: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
bf90: 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20  Free(pIter);.   
bfa0: 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a   pIter = 0;.  }.
bfb0: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 3b  .  return pIter;
bfc0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66  .}..static i64 f
bfd0: 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
bfe0: 64 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  d(Fts5DlidxIter 
bff0: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
c000: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
c010: 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74 69  .iRowid;.}.stati
c020: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
c030: 74 65 72 50 67 6e 6f 28 46 74 73 35 44 6c 69 64  terPgno(Fts5Dlid
c040: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
c050: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
c060: 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e 6f  Lvl[0].iLeafPgno
c070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
c080: 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61  the next leaf pa
c090: 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d  ge into the segm
c0a0: 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f  ent iterator..*/
c0b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c0c0: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
c0d0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
c0e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c0f0: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
c100: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
c110: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
c120: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
c130: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
c140: 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70  dvance to next p
c150: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  age */.){.  Fts5
c160: 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 46  Data *pLeaf;.  F
c170: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
c180: 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
c190: 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35 44  r->pSeg;.  fts5D
c1a0: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
c1b0: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65  ->pLeaf);.  pIte
c1c0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a  r->iLeafPgno++;.
c1d0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4e 65    if( pIter->pNe
c1e0: 78 74 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49  xtLeaf ){.    pI
c1f0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74  ter->pLeaf = pIt
c200: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20  er->pNextLeaf;. 
c210: 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
c220: 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  eaf = 0;.  }else
c230: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
c240: 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e  fPgno<=pSeg->pgn
c250: 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74  oLast ){.    pIt
c260: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35  er->pLeaf = fts5
c270: 4c 65 61 66 52 65 61 64 28 70 2c 20 0a 20 20 20  LeafRead(p, .   
c280: 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e       FTS5_SEGMEN
c290: 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
c2a0: 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65  egid, pIter->iLe
c2b0: 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20  afPgno).    );. 
c2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
c2d0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
c2e0: 7d 0a 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65  }.  pLeaf = pIte
c2f0: 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66 28  r->pLeaf;..  if(
c300: 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49   pLeaf ){.    pI
c310: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
c320: 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a   pLeaf->szLeaf;.
c330: 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66      if( fts5Leaf
c340: 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66  IsTermless(pLeaf
c350: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  ) ){.      pIter
c360: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
c370: 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20  = pLeaf->nn+1;. 
c380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c390: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
c3a0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
c3b0: 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 49  t32(&pLeaf->p[pI
c3c0: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c  ter->iPgidxOff],
c3d0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
c3e0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a  ->iEndofDoclist.
c3f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
c400: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75   }.}../*.** Argu
c410: 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f  ment p points to
c420: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
c430: 6e 69 6e 67 20 61 20 76 61 72 69 6e 74 20 74 6f  ning a varint to
c440: 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20   be interpreted 
c450: 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  as a.** position
c460: 20 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64   list size field
c470: 2e 20 52 65 61 64 20 74 68 65 20 76 61 72 69 6e  . Read the varin
c480: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
c490: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c4a0: 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f 72 65  .** read. Before
c4b0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20   returning, set 
c4c0: 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d  *pnSz to the num
c4d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
c4e0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20  the position.** 
c4f0: 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c  list, and *pbDel
c500: 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
c510: 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73  delete flag is s
c520: 65 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  et, or false oth
c530: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
c540: 63 20 69 6e 74 20 66 74 73 35 47 65 74 50 6f 73  c int fts5GetPos
c550: 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73 74 20 75  listSize(const u
c560: 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c  8 *p, int *pnSz,
c570: 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20   int *pbDel){.  
c580: 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e  int nSz;.  int n
c590: 20 3d 20 30 3b 0a 20 20 66 74 73 35 46 61 73 74   = 0;.  fts5Fast
c5a0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e  GetVarint32(p, n
c5b0: 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72 74  , nSz);.  assert
c5c0: 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20  _nc( nSz>=0 );. 
c5d0: 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a   *pnSz = nSz/2;.
c5e0: 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26    *pbDel = nSz &
c5f0: 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75 72   0x0001;.  retur
c600: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74  n n;.}../*.** Ft
c610: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
c620: 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20  ffset currently 
c630: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
c640: 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a  rst byte of a.**
c650: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
c660: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
c670: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
c680: 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72 65   field and store
c690: 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f   it.** in the fo
c6a0: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
c6b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53  s:.**.**   Fts5S
c6c0: 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20  egIter.nPos.**  
c6d0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 62 44 65   Fts5SegIter.bDe
c6e0: 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74  l.**.** Leave Ft
c6f0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
c700: 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20 74  ffset pointing t
c710: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
c720: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69   of the .** posi
c730: 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e  tion list conten
c740: 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73  t (if any)..*/.s
c750: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
c760: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46  egIterLoadNPos(F
c770: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
c780: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
c790: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
c7a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c7b0: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
c7c0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ->iLeafOffset;  
c7d0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61  /* Offset to rea
c7e0: 64 20 61 74 20 2a 2f 0a 20 20 20 20 41 53 53 45  d at */.    ASSE
c7f0: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
c800: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
c810: 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  if( p->pConfig->
c820: 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
c830: 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
c840: 20 20 20 69 6e 74 20 69 45 6f 64 20 3d 20 4d 49     int iEod = MI
c850: 4e 28 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  N(pIter->iEndofD
c860: 6f 63 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 70  oclist, pIter->p
c870: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 29 3b 0a 20  Leaf->szLeaf);. 
c880: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c       pIter->bDel
c890: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65   = 0;.      pIte
c8a0: 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20  r->nPos = 1;.   
c8b0: 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45 6f 64     if( iOff<iEod
c8c0: 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66   && pIter->pLeaf
c8d0: 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a  ->p[iOff]==0 ){.
c8e0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
c8f0: 44 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Del = 1;.       
c900: 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20   iOff++;.       
c910: 20 69 66 28 20 69 4f 66 66 3c 69 45 6f 64 20 26   if( iOff<iEod &
c920: 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  & pIter->pLeaf->
c930: 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20  p[iOff]==0 ){.  
c940: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e          pIter->n
c950: 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Pos = 1;.       
c960: 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20     iOff++;.     
c970: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c980: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
c990: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
c9a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
c9b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b  {.      int nSz;
c9c0: 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47  .      fts5FastG
c9d0: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
c9e0: 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 69 4f 66 66  ->pLeaf->p, iOff
c9f0: 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70 49  , nSz);.      pI
ca00: 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a  ter->bDel = (nSz
ca10: 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20   & 0x0001);.    
ca20: 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20    pIter->nPos = 
ca30: 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73  nSz>>1;.      as
ca40: 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e  sert_nc( pIter->
ca50: 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  nPos>=0 );.    }
ca60: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
ca70: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
ca80: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
ca90: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
caa0: 61 64 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65  adRowid(Fts5Inde
cab0: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
cac0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20  r *pIter){.  u8 
cad0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
cae0: 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  f->p;        /* 
caf0: 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64  Buffer to read d
cb00: 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ata from */.  in
cb10: 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
cb20: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20  iLeafOffset;..  
cb30: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
cb40: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
cb50: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65    if( iOff>=pIte
cb60: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
cb70: 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49   ){.    fts5SegI
cb80: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
cb90: 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
cba0: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
cbb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
cbc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
cbd0: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
cbe0: 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  UPT;.      retur
cbf0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66  n;.    }.    iOf
cc00: 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70  f = 4;.    a = p
cc10: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
cc20: 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71    }.  iOff += sq
cc30: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
cc40: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
cc50: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
cc60: 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  d);.  pIter->iLe
cc70: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
cc80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65  .}../*.** Fts5Se
cc90: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
cca0: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
ccb0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
ccc0: 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  byte of the .** 
ccd0: 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c 64 20  "nSuffix" field 
cce0: 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e 63 74  of a term. Funct
ccf0: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 6e 4b  ion parameter nK
cd00: 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  eep contains the
cd10: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
cd20: 20 22 6e 50 72 65 66 69 78 22 20 66 69 65 6c 64   "nPrefix" field
cd30: 20 28 69 66 20 74 68 65 72 65 20 77 61 73 20 6f   (if there was o
cd40: 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73 73 65  ne - it is passe
cd50: 64 20 30 20 69 66 20 74 68 69 73 20 69 73 0a 2a  d 0 if this is.*
cd60: 2a 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  * the first term
cd70: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 29   in the segment)
cd80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
cd90: 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a  ction populates:
cda0: 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67  .**.**   Fts5Seg
cdb0: 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46  Iter.term.**   F
cdc0: 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64  ts5SegIter.rowid
cdd0: 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  .**.** according
cde0: 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20 28 46  ly and leaves (F
cdf0: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
ce00: 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f 20 74  Offset) set to t
ce10: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
ce20: 20 74 68 65 20 66 69 72 73 74 20 70 6f 73 69 74   the first posit
ce30: 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f  ion list. The po
ce40: 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f  sition list belo
ce50: 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e  nging to documen
ce60: 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67 49 74  t .** (Fts5SegIt
ce70: 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73  er.iRowid)..*/.s
ce80: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
ce90: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46  egIterLoadTerm(F
cea0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
ceb0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
cec0: 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75   int nKeep){.  u
ced0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
cee0: 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f  eaf->p;        /
cef0: 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64  * Buffer to read
cf00: 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20   data from */.  
cf10: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
cf20: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ->iLeafOffset;  
cf30: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61  /* Offset to rea
cf40: 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  d at */.  int nN
cf50: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
cf60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
cf70: 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a  es of new data *
cf80: 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  /..  iOff += fts
cf90: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
cfa0: 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
cfb0: 69 66 28 20 69 4f 66 66 2b 6e 4e 65 77 3e 70 49  if( iOff+nNew>pI
cfc0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
cfd0: 61 66 20 7c 7c 20 6e 4b 65 65 70 3e 70 49 74 65  af || nKeep>pIte
cfe0: 72 2d 3e 74 65 72 6d 2e 6e 20 7c 7c 20 6e 4e 65  r->term.n || nNe
cff0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72  w==0 ){.    p->r
d000: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
d010: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
d020: 7d 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e  }.  pIter->term.
d030: 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73  n = nKeep;.  fts
d040: 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
d050: 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  b(&p->rc, &pIter
d060: 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61  ->term, nNew, &a
d070: 5b 69 4f 66 66 5d 29 3b 0a 20 20 61 73 73 65 72  [iOff]);.  asser
d080: 74 28 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e  t( pIter->term.n
d090: 3c 3d 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 53  <=pIter->term.nS
d0a0: 70 61 63 65 20 29 3b 0a 20 20 69 4f 66 66 20 2b  pace );.  iOff +
d0b0: 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d  = nNew;.  pIter-
d0c0: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
d0d0: 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72   = iOff;.  pIter
d0e0: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
d0f0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
d100: 6e 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  no;.  pIter->iLe
d110: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
d120: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  ..  if( pIter->i
d130: 50 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d  PgidxOff>=pIter-
d140: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20  >pLeaf->nn ){.  
d150: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
d160: 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e  oclist = pIter->
d170: 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d  pLeaf->nn+1;.  }
d180: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
d190: 78 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d  xtra;.    pIter-
d1a0: 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74  >iPgidxOff += ft
d1b0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
d1c0: 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66  [pIter->iPgidxOf
d1d0: 66 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  f], nExtra);.   
d1e0: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
d1f0: 63 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b  clist += nExtra;
d200: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
d210: 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20  terLoadRowid(p, 
d220: 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69  pIter);.}..stati
d230: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
d240: 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
d250: 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c  *, Fts5SegIter*,
d260: 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76   int*);.static v
d270: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
d280: 65 78 74 5f 52 65 76 65 72 73 65 28 46 74 73 35  ext_Reverse(Fts5
d290: 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49  Index*, Fts5SegI
d2a0: 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61  ter*, int*);.sta
d2b0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
d2c0: 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 46 74  IterNext_None(Ft
d2d0: 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65  s5Index*, Fts5Se
d2e0: 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a  gIter*, int*);..
d2f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d300: 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 46  SegIterSetNext(F
d310: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
d320: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
d330: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66  {.  if( pIter->f
d340: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
d350: 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20  TER_REVERSE ){. 
d360: 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20     pIter->xNext 
d370: 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  = fts5SegIterNex
d380: 74 5f 52 65 76 65 72 73 65 3b 0a 20 20 7d 65 6c  t_Reverse;.  }el
d390: 73 65 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69  se if( p->pConfi
d3a0: 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
d3b0: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
d3c0: 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74      pIter->xNext
d3d0: 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65   = fts5SegIterNe
d3e0: 78 74 5f 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73 65  xt_None;.  }else
d3f0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65  {.    pIter->xNe
d400: 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65 72  xt = fts5SegIter
d410: 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Next;.  }.}../*.
d420: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
d430: 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
d440: 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61  t pIter to itera
d450: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  te through the e
d460: 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67  ntries in.** seg
d470: 6d 65 6e 74 20 70 53 65 67 2e 20 54 68 65 20 69  ment pSeg. The i
d480: 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
d490: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
d4a0: 66 69 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e  first entry when
d4b0: 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69   .** this functi
d4c0: 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  on returns..**.*
d4d0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
d4e0: 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
d4f0: 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
d500: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
d510: 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61  r code. If .** a
d520: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
d530: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
d540: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d550: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
d560: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
d570: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
d580: 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
d590: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d5b0: 54 53 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  TS index object 
d5c0: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
d5d0: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
d5e0: 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
d5f0: 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
d600: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
d610: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
d620: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
d630: 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
d640: 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f    if( pSeg->pgno
d650: 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
d660: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
d670: 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69  if the segment i
d680: 73 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20  s being used as 
d690: 61 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69  an input to an i
d6a0: 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a  ncremental.    *
d6b0: 2a 20 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20  * merge and all 
d6c0: 64 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79  data has already
d6d0: 20 62 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e   been "trimmed".
d6e0: 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   See function.  
d6f0: 20 20 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67    ** fts5TrimSeg
d700: 6d 65 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61  ments() for deta
d710: 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ils. In this cas
d720: 65 20 6c 65 61 76 65 20 74 68 65 20 69 74 65 72  e leave the iter
d730: 61 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20  ator empty..    
d740: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  ** The caller wi
d750: 6c 6c 20 73 65 65 20 74 68 65 20 28 70 49 74 65  ll see the (pIte
d760: 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64  r->pLeaf==0) and
d770: 20 61 73 73 75 6d 65 20 74 68 65 20 69 74 65 72   assume the iter
d780: 61 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61  ator is.    ** a
d790: 74 20 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a  t EOF already. *
d7a0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
d7b0: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b  ter->pLeaf==0 );
d7c0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d7d0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
d7e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d7f0: 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
d800: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
d810: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
d820: 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65  rSetNext(p, pIte
d830: 72 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  r);.    pIter->p
d840: 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20  Seg = pSeg;.    
d850: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d860: 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
d870: 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65  st-1;.    fts5Se
d880: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
d890: 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20   pIter);.  }..  
d8a0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
d8b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65  E_OK ){.    pIte
d8c0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d8d0: 20 34 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e   4;.    assert_n
d8e0: 63 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  c( pIter->pLeaf-
d8f0: 3e 6e 6e 3e 34 20 29 3b 0a 20 20 20 20 61 73 73  >nn>4 );.    ass
d900: 65 72 74 5f 6e 63 28 20 66 74 73 35 4c 65 61 66  ert_nc( fts5Leaf
d910: 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74  FirstTermOff(pIt
d920: 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29 3b  er->pLeaf)==4 );
d930: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69  .    pIter->iPgi
d940: 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 70  dxOff = pIter->p
d950: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b 0a  Leaf->szLeaf+1;.
d960: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
d970: 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72  oadTerm(p, pIter
d980: 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53 65  , 0);.    fts5Se
d990: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
d9a0: 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a   pIter);.  }.}..
d9b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d9c0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ion is only ever
d9d0: 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61   called on itera
d9e0: 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79 20  tors created by 
d9f0: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73 35  calls to.** Fts5
da00: 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69 74  IndexQuery() wit
da10: 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f  h the FTS5INDEX_
da20: 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67 20  QUERY_DESC flag 
da30: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  set..**.** The i
da40: 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61 6e  terator is in an
da50: 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20 77   unusual state w
da60: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
da70: 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68 65  n is called: the
da80: 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e  .** Fts5SegIter.
da90: 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72 69  iLeafOffset vari
daa0: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
dab0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
dac0: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
dad0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
dae0: 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68  ize field for th
daf0: 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74  e first relevant
db00: 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61   rowid on the pa
db10: 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ge..** Fts5SegIt
db20: 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74 2c  er.rowid is set,
db30: 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62 44   but nPos and bD
db40: 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a  el are not..**.*
db50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
db60: 61 64 76 61 6e 63 65 73 20 74 68 65 20 69 74 65  advances the ite
db70: 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74  rator so that it
db80: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
db90: 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e 74  ast .** relevant
dba0: 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61   rowid on the pa
dbb0: 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ge and, if neces
dbc0: 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a 65  sary, initialize
dbd0: 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69 64  s the .** aRowid
dbe0: 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52 6f  Offset[] and iRo
dbf0: 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61 62  widOffset variab
dc00: 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f 69  les. At this poi
dc10: 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  nt the iterator.
dc20: 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65 67  ** is in its reg
dc30: 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74 73  ular state - Fts
dc40: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
dc50: 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  fset points to t
dc60: 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74 65  he first.** byte
dc70: 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
dc80: 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61 73   list content as
dc90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 61  sociated with sa
dca0: 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61  id rowid..*/.sta
dcb0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
dcc0: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
dcd0: 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  age(Fts5Index *p
dce0: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
dcf0: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 65 44 65  Iter){.  int eDe
dd00: 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
dd10: 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69 6e  g->eDetail;.  in
dd20: 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  t n = pIter->pLe
dd30: 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e  af->szLeaf;.  in
dd40: 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  t i = pIter->iLe
dd50: 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a  afOffset;.  u8 *
dd60: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
dd70: 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69  ->p;.  int iRowi
dd80: 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  dOffset = 0;..  
dd90: 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e  if( n>pIter->iEn
dda0: 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  dofDoclist ){.  
ddb0: 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e    n = pIter->iEn
ddc0: 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a  dofDoclist;.  }.
ddd0: 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46  .  ASSERT_SZLEAF
dde0: 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  _OK(pIter->pLeaf
ddf0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
de00: 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 20  .    i64 iDelta 
de10: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 65 44  = 0;..    if( eD
de20: 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
de30: 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
de40: 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20   /* todo */.    
de50: 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69    if( i<n && a[i
de60: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
de70: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i++;.        if(
de80: 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20   i<n && a[i]==0 
de90: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ) i++;.      }. 
dea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
deb0: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
dec0: 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
ded0: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f    i += fts5GetPo
dee0: 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d 2c  slistSize(&a[i],
def0: 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
df00: 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50 6f  ;.      i += nPo
df10: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
df20: 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a 20   i>=n ) break;. 
df30: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
df40: 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36  arint(&a[i], (u6
df50: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
df60: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
df70: 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f  = iDelta;..    /
df80: 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20  * If necessary, 
df90: 67 72 6f 77 20 74 68 65 20 70 49 74 65 72 2d 3e  grow the pIter->
dfa0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
dfb0: 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rray. */.    if(
dfc0: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70   iRowidOffset>=p
dfd0: 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73  Iter->nRowidOffs
dfe0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
dff0: 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52  nNew = pIter->nR
e000: 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a  owidOffset + 8;.
e010: 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20        int *aNew 
e020: 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
e030: 72 65 61 6c 6c 6f 63 36 34 28 70 49 74 65 72 2d  realloc64(pIter-
e040: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 6e 4e  >aRowidOffset,nN
e050: 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  ew*sizeof(int));
e060: 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d  .      if( aNew=
e070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
e080: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
e090: 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  EM;.        brea
e0a0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
e0b0: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
e0c0: 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20  fset = aNew;.   
e0d0: 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64     pIter->nRowid
e0e0: 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  Offset = nNew;. 
e0f0: 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d     }..    pIter-
e100: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52  >aRowidOffset[iR
e110: 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20  owidOffset++] = 
e120: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e130: 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  et;.    pIter->i
e140: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a  LeafOffset = i;.
e150: 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f    }.  pIter->iRo
e160: 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  widOffset = iRow
e170: 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35  idOffset;.  fts5
e180: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
e190: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
e1a0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
e1b0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
e1c0: 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73  verseNewPage(Fts
e1d0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
e1e0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
e1f0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
e200: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e210: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
e220: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
e230: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
e240: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
e250: 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  ;..  fts5DataRel
e260: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
e270: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65  f);.  pIter->pLe
e280: 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  af = 0;.  while(
e290: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
e2a0: 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61  K && pIter->iLea
e2b0: 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65  fPgno>pIter->iTe
e2c0: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
e2d0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
e2e0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
e2f0: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e  afPgno--;.    pN
e300: 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
e310: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
e320: 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20  T_ROWID(.       
e330: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e     pIter->pSeg->
e340: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
e350: 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b  LeafPgno.    ));
e360: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
e370: 0a 20 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c  .      /* iTermL
e380: 65 61 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65  eafOffset may be
e390: 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66   equal to szLeaf
e3a0: 20 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   if the term is 
e3b0: 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
e3c0: 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70  * thing on the p
e3d0: 61 67 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66  age - i.e. the f
e3e0: 69 72 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e  irst rowid is on
e3f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
e400: 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  age..      ** In
e410: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
e420: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
e430: 2c 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  , this iterator 
e440: 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20  is at EOF. */.  
e450: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
e460: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
e470: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
e480: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e490: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
e4a0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
e4b0: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
e4c0: 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a  fOffset<pNew->sz
e4d0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
e4e0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
e4f0: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
e500: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e510: 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65  set = pIter->iTe
e520: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  rmLeafOffset;.  
e530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e540: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
e550: 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
e560: 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
e570: 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
e580: 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20  idOff(pNew);.   
e590: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
e5a0: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
e5b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
e5c0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
e5d0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e5e0: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  t = iRowidOff;. 
e5f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e600: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
e610: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
e620: 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74      u8 *a = &pIt
e630: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74  er->pLeaf->p[pIt
e640: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  er->iLeafOffset]
e650: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
e660: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20  >iLeafOffset += 
e670: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c  fts5GetVarint(a,
e680: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
e690: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
e6a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
e6b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
e6c0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
e6d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e6e0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
e6f0: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
e700: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
e710: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
e720: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66  eaf->nn+1;.    f
e730: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
e740: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
e750: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
e760: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
e770: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
e780: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
e790: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
e7a0: 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20  ently.** points 
e7b0: 74 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b  to a delete mark
e7c0: 65 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72  er. A delete mar
e7d0: 6b 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20  ker is an entry 
e7e0: 77 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a  with a 0 byte.**
e7f0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a   position-list..
e800: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
e810: 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
e820: 74 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ty(Fts5Index *p,
e830: 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
e840: 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
e850: 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
e860: 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69  >aSeg[pIter->aFi
e870: 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a  rst[1].iFirst];.
e880: 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
e890: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53  =SQLITE_OK && pS
e8a0: 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65  eg->pLeaf && pSe
e8b0: 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a  g->nPos==0);.}..
e8c0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  /*.** Advance it
e8d0: 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20  erator pIter to 
e8e0: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a  the next entry..
e8f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  **.** This versi
e900: 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49 74 65  on of fts5SegIte
e910: 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c 79 20  rNext() is only 
e920: 75 73 65 64 20 62 79 20 72 65 76 65 72 73 65 20  used by reverse 
e930: 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
e940: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
e950: 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73  gIterNext_Revers
e960: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
e970: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
e980: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
e990: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
e9a0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
e9b0: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
e9c0: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
e9d0: 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
e9e0: 20 2a 70 62 55 6e 75 73 65 64 20 20 20 20 20 20   *pbUnused      
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea00: 55 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  Unused */.){.  a
ea10: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
ea20: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
ea30: 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20  ER_REVERSE );.  
ea40: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
ea50: 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  NextLeaf==0 );. 
ea60: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 62   UNUSED_PARAM(pb
ea70: 55 6e 75 73 65 64 29 3b 0a 0a 20 20 69 66 28 20  Unused);..  if( 
ea80: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
ea90: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 75 38 20  set>0 ){.    u8 
eaa0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
eab0: 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 69 4f  f->p;.    int iO
eac0: 66 66 3b 0a 20 20 20 20 69 36 34 20 69 44 65 6c  ff;.    i64 iDel
ead0: 74 61 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e  ta;..    pIter->
eae0: 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a  iRowidOffset--;.
eaf0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
eb00: 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Offset = pIter->
eb10: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74  aRowidOffset[pIt
eb20: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
eb30: 5d 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ];.    fts5SegIt
eb40: 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
eb50: 74 65 72 29 3b 0a 20 20 20 20 69 4f 66 66 20 3d  ter);.    iOff =
eb60: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
eb70: 73 65 74 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  set;.    if( p->
eb80: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
eb90: 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  !=FTS5_DETAIL_NO
eba0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66  NE ){.      iOff
ebb0: 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b   += pIter->nPos;
ebc0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 47  .    }.    fts5G
ebd0: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
ebe0: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
ebf0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
ec00: 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  owid -= iDelta;.
ec10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
ec20: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
ec30: 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  ewPage(p, pIter)
ec40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
ec50: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
ec60: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
ec70: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
ec80: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  his version of f
ec90: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29  ts5SegIterNext()
eca0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
ecb0: 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 61 6e 64   detail=none and
ecc0: 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72   the.** iterator
ecd0: 20 69 73 20 6e 6f 74 20 61 20 72 65 76 65 72 73   is not a revers
ece0: 65 20 64 69 72 65 63 74 69 6f 6e 20 69 74 65 72  e direction iter
ecf0: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
ed00: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
ed10: 4e 65 78 74 5f 4e 6f 6e 65 28 0a 20 20 46 74 73  Next_None(.  Fts
ed20: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ed40: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
ed50: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
ed60: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
ed70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
ed80: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
ed90: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54  */.  int *pbNewT
eda0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
edb0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
edc0: 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f   for new term */
edd0: 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  .){.  int iOff;.
ede0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
edf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
ee00: 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d   assert( (pIter-
ee10: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
ee20: 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d  GITER_REVERSE)==
ee30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ee40: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
ee50: 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
ee60: 4e 4f 4e 45 20 29 3b 0a 0a 20 20 41 53 53 45 52  NONE );..  ASSER
ee70: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65  T_SZLEAF_OK(pIte
ee80: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66  r->pLeaf);.  iOf
ee90: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
eea0: 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 4e 65  Offset;..  /* Ne
eeb0: 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74  xt entry is on t
eec0: 68 65 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  he next page */.
eed0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65    if( pIter->pSe
eee0: 67 20 26 26 20 69 4f 66 66 3e 3d 70 49 74 65 72  g && iOff>=pIter
eef0: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
ef00: 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ){.    fts5SegIt
ef10: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
ef20: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ter);.    if( p-
ef30: 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c  >rc || pIter->pL
ef40: 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  eaf==0 ) return;
ef50: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
ef60: 69 64 20 3d 20 30 3b 0a 20 20 20 20 69 4f 66 66  id = 0;.    iOff
ef70: 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 4;.  }..  if(
ef80: 20 69 4f 66 66 3c 70 49 74 65 72 2d 3e 69 45 6e   iOff<pIter->iEn
ef90: 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  dofDoclist ){.  
efa0: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
efb0: 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  is on the curren
efc0: 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 36  t page */.    i6
efd0: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 69 4f  4 iDelta;.    iO
efe0: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
eff0: 35 47 65 74 56 61 72 69 6e 74 28 26 70 49 74 65  5GetVarint(&pIte
f000: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  r->pLeaf->p[iOff
f010: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
f020: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
f030: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
f040: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
f050: 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  wid += iDelta;. 
f060: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 74 65   }else if( (pIte
f070: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
f080: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29  SEGITER_ONETERM)
f090: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
f0a0: 49 74 65 72 2d 3e 70 53 65 67 20 29 7b 0a 20 20  Iter->pSeg ){.  
f0b0: 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20      int nKeep = 
f0c0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  0;.      if( iOf
f0d0: 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74  f!=fts5LeafFirst
f0e0: 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70  TermOff(pIter->p
f0f0: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
f100: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
f110: 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d  Varint32(&pIter-
f120: 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  >pLeaf->p[iOff],
f130: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d   nKeep);.      }
f140: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
f150: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
f160: 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  ;.      fts5SegI
f170: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
f180: 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Iter, nKeep);.  
f190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
f1a0: 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
f1b0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   0;.      const 
f1c0: 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b  char *zTerm = 0;
f1d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74  .      int nList
f1e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
f1f0: 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28  ts5HashScanNext(
f200: 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 20  p->pHash);.     
f210: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
f220: 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61  ScanEntry(p->pHa
f230: 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69  sh, &zTerm, &pLi
f240: 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
f250: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
f260: 29 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65  ) goto next_none
f270: 5f 65 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65  _eof;.      pIte
f280: 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75  r->pLeaf->p = (u
f290: 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  8*)pList;.      
f2a0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
f2b0: 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20   = nList;.      
f2c0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
f2d0: 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  Leaf = nList;.  
f2e0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
f2f0: 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74  fDoclist = nList
f300: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
f310: 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
f320: 3e 72 63 2c 26 70 49 74 65 72 2d 3e 74 65 72 6d  >rc,&pIter->term
f330: 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  , (int)strlen(zT
f340: 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d  erm), (u8*)zTerm
f350: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
f360: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
f370: 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73  s5GetVarint(pLis
f380: 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  t, (u64*)&pIter-
f390: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  >iRowid);.    }.
f3a0: 0a 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65  .    if( pbNewTe
f3b0: 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20  rm ) *pbNewTerm 
f3c0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
f3d0: 20 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65    goto next_none
f3e0: 5f 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  _eof;.  }..  fts
f3f0: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
f400: 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 72  (p, pIter);..  r
f410: 65 74 75 72 6e 3b 0a 20 6e 65 78 74 5f 6e 6f 6e  eturn;. next_non
f420: 65 5f 65 6f 66 3a 0a 20 20 66 74 73 35 44 61 74  e_eof:.  fts5Dat
f430: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
f440: 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d  pLeaf);.  pIter-
f450: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 0a  >pLeaf = 0;.}...
f460: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  /*.** Advance it
f470: 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20  erator pIter to 
f480: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
f490: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
f4a0: 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
f4b0: 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
f4c0: 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
f4d0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20   error code. It 
f4e0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  .** is not consi
f4f0: 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
f500: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  f the iterator r
f510: 65 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61  eaches EOF. If a
f520: 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
f530: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
f540: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
f550: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
f560: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
f570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
f580: 35 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20  5SegIterNext(.  
f590: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
f5c0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
f5d0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f5f0: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
f600: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e  ce */.  int *pbN
f610: 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
f620: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f630: 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d  Set for new term
f640: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74   */.){.  Fts5Dat
f650: 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
f660: 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69  ->pLeaf;.  int i
f670: 4f 66 66 3b 0a 20 20 69 6e 74 20 62 4e 65 77 54  Off;.  int bNewT
f680: 65 72 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  erm = 0;.  int n
f690: 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75 38 20 2a  Keep = 0;.  u8 *
f6a0: 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61  a;.  int n;..  a
f6b0: 73 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d  ssert( pbNewTerm
f6c0: 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72  ==0 || *pbNewTer
f6d0: 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
f6e0: 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
f6f0: 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
f700: 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 2f 2a  IL_NONE );..  /*
f710: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
f720: 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74  end of the posit
f730: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20  ion list within 
f740: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f750: 2e 20 2a 2f 0a 20 20 61 20 3d 20 70 4c 65 61 66  . */.  a = pLeaf
f760: 2d 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c 65 61 66  ->p;.  n = pLeaf
f770: 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 41 53 53  ->szLeaf;..  ASS
f780: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
f790: 65 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70  eaf);.  iOff = p
f7a0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f7b0: 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b  t + pIter->nPos;
f7c0: 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29  ..  if( iOff<n )
f7d0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78  {.    /* The nex
f7e0: 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68  t entry is on th
f7f0: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
f800: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63  */.    assert_nc
f810: 28 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69  ( iOff<=pIter->i
f820: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 3b 0a  EndofDoclist );.
f830: 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49      if( iOff>=pI
f840: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
f850: 73 74 20 29 7b 0a 20 20 20 20 20 20 62 4e 65 77  st ){.      bNew
f860: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
f870: 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35 4c 65  if( iOff!=fts5Le
f880: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
f890: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
f8a0: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
f8b0: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
f8c0: 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  ], nKeep);.     
f8d0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
f8e0: 20 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a      u64 iDelta;.
f8f0: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
f900: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
f910: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44  nt(&a[iOff], &iD
f920: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49 74  elta);.      pIt
f930: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
f940: 65 6c 74 61 3b 0a 20 20 20 20 20 20 61 73 73 65  elta;.      asse
f950: 72 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20  rt_nc( iDelta>0 
f960: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  );.    }.    pIt
f970: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
f980: 3d 20 69 4f 66 66 3b 0a 0a 20 20 7d 65 6c 73 65  = iOff;..  }else
f990: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67   if( pIter->pSeg
f9a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
f9b0: 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a   u8 *pList = 0;.
f9c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f9d0: 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 69  zTerm = 0;.    i
f9e0: 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20  nt nList = 0;.  
f9f0: 20 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72    assert( (pIter
fa00: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
fa10: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
fa20: 7c 7c 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a  || pbNewTerm );.
fa30: 20 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65      if( 0==(pIte
fa40: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
fa50: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29  SEGITER_ONETERM)
fa60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fa70: 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78  3Fts5HashScanNex
fa80: 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20  t(p->pHash);.   
fa90: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
faa0: 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
fab0: 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70  Hash, &zTerm, &p
fac0: 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
fad0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
fae0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
faf0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
fb00: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
fb10: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
fb20: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
fb30: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
fb40: 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
fb50: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
fb60: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c  ->pLeaf->nn = nL
fb70: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
fb80: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
fb90: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
fba0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
fbb0: 69 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20  ist = nList+1;. 
fbc0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
fbd0: 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
fbe0: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
fbf0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72  (int)strlen(zTer
fc00: 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 75  m),.          (u
fc10: 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
fc20: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
fc30: 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  set = fts5GetVar
fc40: 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a  int(pList, (u64*
fc50: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
fc60: 3b 0a 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65  ;.      *pbNewTe
fc70: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rm = 1;.    }.  
fc80: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4f 66 66 20  }else{.    iOff 
fc90: 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 65 78 74  = 0;.    /* Next
fca0: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e   entry is not on
fcb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
fcc0: 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  e */.    while( 
fcd0: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
fce0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
fcf0: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
fd00: 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49        pLeaf = pI
fd10: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20  ter->pLeaf;.    
fd20: 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
fd30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 41 53   break;.      AS
fd40: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
fd50: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28  Leaf);.      if(
fd60: 20 28 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61   (iOff = fts5Lea
fd70: 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
fd80: 4c 65 61 66 29 29 20 26 26 20 69 4f 66 66 3c 70  Leaf)) && iOff<p
fd90: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
fda0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
fdb0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
fdc0: 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
fdd0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
fde0: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
fdf0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
fe00: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
fe10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
fe20: 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a  af->nn>pLeaf->sz
fe30: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
fe40: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
fe50: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
fe60: 61 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69  af + fts5GetVari
fe70: 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20  nt32(.          
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 70 49  eaf->szLeaf], pI
fea0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
feb0: 73 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  st.          );.
fec0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fed0: 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
fee0: 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66   pLeaf->nn>pLeaf
fef0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
ff00: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
ff10: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
ff20: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
ff30: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
ff40: 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c      &pLeaf->p[pL
ff50: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f  eaf->szLeaf], iO
ff60: 66 66 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ff.        );.  
ff70: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
ff80: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
ff90: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
ffa0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
ffb0: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 62 4e  iOff;.        bN
ffc0: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
ffd0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
ffe0: 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d  _nc( iOff<pLeaf-
fff0: 3e 73 7a 4c 65 61 66 20 29 3b 0a 20 20 20 20 20  >szLeaf );.     
10000 20 69 66 28 20 69 4f 66 66 3e 70 4c 65 61 66 2d   if( iOff>pLeaf-
10010 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
10020 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
10030 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
10040 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
10050 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10060 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 74   Check if the it
10070 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74  erator is now at
10080 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74   EOF. If so, ret
10090 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20  urn early. */.  
100a0 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
100b0 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4e 65 77   ){.    if( bNew
100c0 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66  Term ){.      if
100d0 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
100e0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
100f0 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20  ETERM ){.       
10100 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
10110 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
10120 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
10130 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
10140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
10150 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
10160 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65  rm(p, pIter, nKe
10170 65 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ep);.        fts
10180 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
10190 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
101a0 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72      if( pbNewTer
101b0 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d  m ) *pbNewTerm =
101c0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
101d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
101e0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
101f0 75 6c 64 20 62 65 20 64 6f 6e 65 20 62 79 20 63  uld be done by c
10200 61 6c 6c 69 6e 67 20 66 74 73 35 53 65 67 49 74  alling fts5SegIt
10210 65 72 4c 6f 61 64 4e 50 6f 73 28 29 2e 20 42 75  erLoadNPos(). Bu
10220 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  t.      ** this 
10230 62 6c 6f 63 6b 20 69 73 20 70 61 72 74 69 63 75  block is particu
10240 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63  larly performanc
10250 65 20 63 72 69 74 69 63 61 6c 2c 20 73 6f 20 65  e critical, so e
10260 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
10270 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  ** code is inlin
10280 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ed. .      **.  
10290 20 20 20 20 2a 2a 20 4c 61 74 65 72 3a 20 53 77      ** Later: Sw
102a0 69 74 63 68 65 64 20 62 61 63 6b 20 74 6f 20 66  itched back to f
102b0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
102c0 6f 73 28 29 20 62 65 63 61 75 73 65 20 69 74 20  os() because it 
102d0 73 75 70 70 6f 72 74 73 0a 20 20 20 20 20 20 2a  supports.      *
102e0 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f  * detail=none mo
102f0 64 65 2e 20 4e 6f 74 20 69 64 65 61 6c 2e 0a 20  de. Not ideal.. 
10300 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
10310 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 61 73 73  t nSz;.      ass
10320 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
10330 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
10340 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c  ssert( pIter->iL
10350 65 61 66 4f 66 66 73 65 74 3c 3d 70 49 74 65 72  eafOffset<=pIter
10360 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 3b 0a 20  ->pLeaf->nn );. 
10370 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
10380 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e  Varint32(pIter->
10390 70 4c 65 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d  pLeaf->p, pIter-
103a0 3e 69 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e 53  >iLeafOffset, nS
103b0 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  z);.      pIter-
103c0 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30  >bDel = (nSz & 0
103d0 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49  x0001);.      pI
103e0 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e  ter->nPos = nSz>
103f0 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  >1;.      assert
10400 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73  _nc( pIter->nPos
10410 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  >=0 );.    }.  }
10420 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .}..#define SWAP
10430 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54  VAL(T, a, b) { T
10440 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62   tmp; tmp=a; a=b
10450 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66  ; b=tmp; }..#def
10460 69 6e 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69  ine fts5IndexSki
10470 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29  pVarint(a, iOff)
10480 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a   {            \.
10490 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66    int iEnd = iOf
104a0 66 2b 39 3b 20 20 20 20 20 20 20 20 20 20 20 20  f+9;            
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 20 20 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b    \.  while( (a[
104d0 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20  iOff++] & 0x80) 
104e0 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20  && iOff<iEnd ); 
104f0 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
10500 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
10510 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
10520 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
10530 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74  wid in a doclist
10540 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10550 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74 65 72  on sets the iter
10560 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20  ator up so that 
10570 69 74 65 72 61 74 65 73 20 69 6e 20 72 65 76 65  iterates in reve
10580 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67  rse order throug
10590 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74  h.** the doclist
105a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
105b0 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
105c0 72 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  rse(Fts5Index *p
105d0 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
105e0 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 6c 69  Iter){.  Fts5Dli
105f0 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
10600 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a   pIter->pDlidx;.
10610 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73    Fts5Data *pLas
10620 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e  t = 0;.  int pgn
10630 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66  oLast = 0;..  if
10640 28 20 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( pDlidx ){.    
10650 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74  int iSegid = pIt
10660 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
10670 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d  ;.    pgnoLast =
10680 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
10690 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
106a0 70 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74 61  pLast = fts5Data
106b0 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
106c0 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
106d0 64 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20  d, pgnoLast));. 
106e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35   }else{.    Fts5
106f0 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
10700 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20  ter->pLeaf;     
10710 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
10720 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20  eaf data */..   
10730 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46   /* Currently, F
10740 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
10750 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f  Offset points to
10760 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
10770 6f 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69  of.    ** positi
10780 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20  on-list content 
10790 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
107a0 72 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75  rowid. Back it u
107b0 70 20 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20  p so that it.   
107c0 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   ** points to th
107d0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70  e start of the p
107e0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
107f0 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20  e field. */.    
10800 69 6e 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20  int iPoslist;.  
10810 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
10820 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  rmLeafPgno==pIte
10830 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
10840 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d        iPoslist =
10850 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
10860 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c  fOffset;.    }el
10870 73 65 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69  se{.      iPosli
10880 73 74 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  st = 4;.    }.  
10890 20 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56    fts5IndexSkipV
108a0 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20  arint(pLeaf->p, 
108b0 69 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70  iPoslist);.    p
108c0 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
108d0 74 20 3d 20 69 50 6f 73 6c 69 73 74 3b 0a 0a 20  t = iPoslist;.. 
108e0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f     /* If this co
108f0 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
10900 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74  then the largest
10910 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
10920 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65  urrent.    ** te
10930 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74  rm may not be st
10940 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
10950 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61  ent page. So sea
10960 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20  rch forward to. 
10970 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20     ** see where 
10980 73 61 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c  said rowid reall
10990 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66  y is.  */.    if
109a0 28 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  ( pIter->iEndofD
109b0 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73  oclist>=pLeaf->s
109c0 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  zLeaf ){.      i
109d0 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46  nt pgno;.      F
109e0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
109f0 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
10a00 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20  r->pSeg;..      
10a10 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69  /* The last rowi
10a20 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
10a30 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74   may not be on t
10a40 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
10a50 20 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a   Search.      **
10a60 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64   forward to find
10a70 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
10a80 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f  ning the last ro
10a90 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  wid.  */.      f
10aa0 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69  or(pgno=pIter->i
10ab0 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e  LeafPgno+1; !p->
10ac0 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67  rc && pgno<=pSeg
10ad0 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f  ->pgnoLast; pgno
10ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ++){.        i64
10af0 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47   iAbs = FTS5_SEG
10b00 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
10b10 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a  >iSegid, pgno);.
10b20 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61          Fts5Data
10b30 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74   *pNew = fts5Dat
10b40 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a  aRead(p, iAbs);.
10b50 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
10b60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
10b70 74 20 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c  t iRowid, bTerml
10b80 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ess;.          i
10b90 52 6f 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66  Rowid = fts5Leaf
10ba0 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e  FirstRowidOff(pN
10bb0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ew);.          b
10bc0 54 65 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c  Termless = fts5L
10bd0 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e  eafIsTermless(pN
10be0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ew);.          i
10bf0 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  f( iRowid ){.   
10c00 20 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c           SWAPVAL
10c10 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77  (Fts5Data*, pNew
10c20 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  , pLast);.      
10c30 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d        pgnoLast =
10c40 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20   pgno;.         
10c50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
10c60 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
10c70 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
10c80 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29  ( bTermless==0 )
10c90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10ca0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10cb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61    }..  /* If pLa
10cc0 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68  st is NULL at th
10cd0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
10ce0 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f  he last rowid fo
10cf0 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20  r this doclist. 
10d00 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20   ** lies on the 
10d10 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69  page currently i
10d20 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
10d30 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69  iterator. In thi
10d40 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74  s case .  ** pIt
10d50 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
10d60 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
10d70 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
10d80 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
10d90 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73  e.  ** field ass
10da0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
10db0 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20   first relevant 
10dc0 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
10dd0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c  e..  **.  ** Or,
10de0 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e   if pLast is non
10df0 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69  -NULL, then it i
10e00 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
10e10 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73  contains the las
10e20 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e  t.  ** rowid. In
10e30 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69   this case confi
10e40 67 75 72 65 20 74 68 65 20 69 74 65 72 61 74 6f  gure the iterato
10e50 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
10e60 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  nts to the.  ** 
10e70 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74  first rowid on t
10e80 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  his page..  */. 
10e90 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20   if( pLast ){.  
10ea0 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
10eb0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
10ec0 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
10ed0 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
10ee0 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74  = pLast;.    pIt
10ef0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
10f00 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f  pgnoLast;.    iO
10f10 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
10f20 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74  stRowidOff(pLast
10f30 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
10f40 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
10f50 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ast->p[iOff], (u
10f60 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
10f70 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  id);.    pIter->
10f80 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
10f90 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73  ff;..    if( fts
10fa0 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
10fb0 70 4c 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pLast) ){.      
10fc0 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
10fd0 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e  list = pLast->nn
10fe0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
10ff0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
11000 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35  ofDoclist = fts5
11010 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
11020 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a  (pLast);.    }..
11030 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
11040 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
11050 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  e(p, pIter);.}..
11060 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
11070 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
11080 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
11090 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f  st rowid of a do
110a0 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20  clist..** There 
110b0 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
110c0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
110d0 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72  th the final ter
110e0 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  m on the current
110f0 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68   .** page. If th
11100 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
11110 73 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  s the last term 
11120 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61  on the page, loa
11130 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  d the .** doclis
11140 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73  t-index from dis
11150 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  k and initialize
11160 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20   an iterator at 
11170 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e  (pIter->pDlidx).
11180 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11190 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
111a0 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  lidx(Fts5Index *
111b0 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
111c0 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53  pIter){.  int iS
111d0 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
111e0 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20  ->iSegid;.  int 
111f0 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66  bRev = (pIter->f
11200 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
11210 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20  TER_REVERSE);.  
11220 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
11230 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20  = pIter->pLeaf; 
11240 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
11250 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  data */..  asser
11260 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
11270 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
11280 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
11290 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
112a0 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  x==0 );..  /* Ch
112b0 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65  eck if the curre
112c0 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20  nt doclist ends 
112d0 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49 66  on this page. If
112e0 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e   it does, return
112f0 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68  .  ** early with
11300 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  out loading the 
11310 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61  doclist-index (a
11320 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20  s it belongs to 
11330 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a  a different.  **
11340 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20   term. */.  if( 
11350 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
11360 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno==pIter->iLe
11370 61 66 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49  afPgno .   && pI
11380 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
11390 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  st<pLeaf->szLeaf
113a0 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
113b0 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  n;.  }..  pIter-
113c0 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c  >pDlidx = fts5Dl
113d0 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62  idxIterInit(p, b
113e0 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72  Rev, iSeg, pIter
113f0 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
11400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
11410 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
11420 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
11430 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72  ond argument cur
11440 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a  rently contains.
11450 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75  ** no valid valu
11460 65 73 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  es except for th
11470 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c  e Fts5SegIter.pL
11480 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61  eaf member varia
11490 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ble. This.** fun
114a0 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74  ction searches t
114b0 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72  he leaf page for
114c0 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67   a term matching
114d0 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a   (pTerm/nTerm)..
114e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65  **.** If the spe
114f0 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 66  cified term is f
11500 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65  ound on the page
11510 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
11520 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70  tor is left.** p
11530 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49  ointing to it. I
11540 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69  f argument bGe i
11550 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74  s zero and the t
11560 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  erm is not found
11570 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f  ,.** the iterato
11580 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
11590 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  ng at EOF..**.**
115a0 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a   If bGe is non-z
115b0 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63  ero and the spec
115c0 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f  ified term is no
115d0 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
115e0 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73  e.** iterator is
115f0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
11600 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74  o the smallest t
11610 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65  erm in the segme
11620 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61  nt that.** is la
11630 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70  rger than the sp
11640 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76  ecified term, ev
11650 65 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20  en if this term 
11660 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a  is not on the.**
11670 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a   current page..*
11680 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
11690 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74  s5LeafSeek(.  Ft
116a0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
116c0 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
116d0 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20   code here */.  
116e0 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20 20 20  int bGe,        
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d  /* True for a >=
11710 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73   search */.  Fts
11720 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11740 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b  Iterator to seek
11750 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
11760 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
11770 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f        /* Term to
11780 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29   search for */.)
11790 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20  {.  int iOff;.  
117a0 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49  const u8 *a = pI
117b0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
117c0 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49   int szLeaf = pI
117d0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
117e0 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49  af;.  int n = pI
117f0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  ter->pLeaf->nn;.
11800 0a 20 20 75 33 32 20 6e 4d 61 74 63 68 20 3d 20  .  u32 nMatch = 
11810 30 3b 0a 20 20 75 33 32 20 6e 4b 65 65 70 20 3d  0;.  u32 nKeep =
11820 20 30 3b 0a 20 20 75 33 32 20 6e 4e 65 77 20 3d   0;.  u32 nNew =
11830 20 30 3b 0a 20 20 75 33 32 20 69 54 65 72 6d 4f   0;.  u32 iTermO
11840 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78  ff;.  int iPgidx
11850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11860 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
11870 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69 64 78   offset in pgidx
11880 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66   */.  int bEndOf
11890 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
118a0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
118b0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69  TE_OK );..  iPgi
118c0 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69  dx = szLeaf;.  i
118d0 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74  Pgidx += fts5Get
118e0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
118f0 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a  dx], iTermOff);.
11900 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
11910 66 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 6e 20  f;.  if( iOff>n 
11920 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
11930 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
11940 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
11950 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20  while( 1 ){..   
11960 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
11970 6f 77 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65  ow many new byte
11980 73 20 61 72 65 20 69 6e 20 74 68 69 73 20 74 65  s are in this te
11990 72 6d 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61  rm */.    fts5Fa
119a0 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  stGetVarint32(a,
119b0 20 69 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20   iOff, nNew);.  
119c0 20 20 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74    if( nKeep<nMat
119d0 63 68 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  ch ){.      goto
119e0 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a   search_failed;.
119f0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
11a00 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68  t( nKeep>=nMatch
11a10 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65   );.    if( nKee
11a20 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20  p==nMatch ){.   
11a30 20 20 20 75 33 32 20 6e 43 6d 70 3b 0a 20 20 20     u32 nCmp;.   
11a40 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
11a50 6e 43 6d 70 20 3d 20 28 75 33 32 29 4d 49 4e 28  nCmp = (u32)MIN(
11a60 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74  nNew, nTerm-nMat
11a70 63 68 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ch);.      for(i
11a80 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29  =0; i<nCmp; i++)
11a90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 5b  {.        if( a[
11aa0 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e  iOff+i]!=pTerm[n
11ab0 4d 61 74 63 68 2b 69 5d 20 29 20 62 72 65 61 6b  Match+i] ) break
11ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11ad0 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20  nMatch += i;..  
11ae0 20 20 20 20 69 66 28 20 28 75 33 32 29 6e 54 65      if( (u32)nTe
11af0 72 6d 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20  rm==nMatch ){.  
11b00 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65        if( i==nNe
11b10 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  w ){.          g
11b20 6f 74 6f 20 73 65 61 72 63 68 5f 73 75 63 63 65  oto search_succe
11b30 73 73 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ss;.        }els
11b40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  e{.          got
11b50 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b  o search_failed;
11b60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11b70 20 7d 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65   }else if( i<nNe
11b80 77 20 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70  w && a[iOff+i]>p
11b90 54 65 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a  Term[nMatch] ){.
11ba0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61          goto sea
11bb0 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  rch_failed;.    
11bc0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
11bd0 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a  f( iPgidx>=n ){.
11be0 20 20 20 20 20 20 62 45 6e 64 4f 66 50 61 67 65        bEndOfPage
11bf0 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
11c00 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 50  k;.    }..    iP
11c10 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
11c20 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
11c30 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  x], nKeep);.    
11c40 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65  iTermOff += nKee
11c50 70 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54  p;.    iOff = iT
11c60 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28  ermOff;..    if(
11c70 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20   iOff>=n ){.    
11c80 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
11c90 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65  ORRUPT;.      re
11ca0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
11cb0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65   /* Read the nKe
11cc0 65 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ep field of the 
11cd0 6e 65 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  next term. */.  
11ce0 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
11cf0 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
11d00 4b 65 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61  Keep);.  }.. sea
11d10 72 63 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  rch_failed:.  if
11d20 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ( bGe==0 ){.    
11d30 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
11d40 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
11d50 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
11d60 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
11d70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 45 6e  .  }else if( bEn
11d80 64 4f 66 50 61 67 65 20 29 7b 0a 20 20 20 20 64  dOfPage ){.    d
11d90 6f 20 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  o {.      fts5Se
11da0 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
11db0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69   pIter);.      i
11dc0 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
11dd0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
11de0 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c     a = pIter->pL
11df0 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66  eaf->p;.      if
11e00 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d  ( fts5LeafIsTerm
11e10 6c 65 73 73 28 70 49 74 65 72 2d 3e 70 4c 65 61  less(pIter->pLea
11e20 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f)==0 ){.       
11e30 20 69 50 67 69 64 78 20 3d 20 70 49 74 65 72 2d   iPgidx = pIter-
11e40 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a  >pLeaf->szLeaf;.
11e50 20 20 20 20 20 20 20 20 69 50 67 69 64 78 20 2b          iPgidx +
11e60 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
11e70 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
11e80 3e 70 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66 66  >p[iPgidx], iOff
11e90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
11ea0 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70  Off<4 || iOff>=p
11eb0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
11ec0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
11ed0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
11ee0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
11ef0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
11f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11f10 20 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20    nKeep = 0;.   
11f20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20         iTermOff 
11f30 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
11f40 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65    n = pIter->pLe
11f50 61 66 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 20 20  af->nn;.        
11f60 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
11f70 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
11f80 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  f], nNew);.     
11f90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11fb0 20 20 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20    }while( 1 );. 
11fc0 20 7d 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63   }.. search_succ
11fd0 65 73 73 3a 0a 20 20 70 49 74 65 72 2d 3e 69 4c  ess:.  pIter->iL
11fe0 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
11ff0 20 2b 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70   + nNew;.  if( p
12000 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
12010 74 3e 6e 20 7c 7c 20 6e 4e 65 77 3c 31 20 29 7b  t>n || nNew<1 ){
12020 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
12030 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
12040 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74  eturn;.  }.  pIt
12050 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
12060 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  set = pIter->iLe
12070 61 66 4f 66 66 73 65 74 3b 0a 20 20 70 49 74 65  afOffset;.  pIte
12080 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
12090 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50   = pIter->iLeafP
120a0 67 6e 6f 3b 0a 0a 20 20 66 74 73 35 42 75 66 66  gno;..  fts5Buff
120b0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
120c0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65  Iter->term, nKee
120d0 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 66 74 73  p, pTerm);.  fts
120e0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
120f0 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  b(&p->rc, &pIter
12100 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61  ->term, nNew, &a
12110 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20 69 66 28 20  [iOff]);..  if( 
12120 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20  iPgidx>=n ){.   
12130 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
12140 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
12150 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
12160 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
12170 74 72 61 3b 0a 20 20 20 20 69 50 67 69 64 78 20  tra;.    iPgidx 
12180 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
12190 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e  32(&a[iPgidx], n
121a0 45 78 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65  Extra);.    pIte
121b0 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
121c0 20 3d 20 69 54 65 72 6d 4f 66 66 20 2b 20 6e 45   = iTermOff + nE
121d0 78 74 72 61 3b 0a 20 20 7d 0a 20 20 70 49 74 65  xtra;.  }.  pIte
121e0 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 69  r->iPgidxOff = i
121f0 50 67 69 64 78 3b 0a 0a 20 20 66 74 73 35 53 65  Pgidx;..  fts5Se
12200 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70  gIterLoadRowid(p
12210 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35  , pIter);.  fts5
12220 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
12230 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74  p, pIter);.}..st
12240 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d  atic sqlite3_stm
12250 74 20 2a 66 74 73 35 49 64 78 53 65 6c 65 63 74  t *fts5IdxSelect
12260 53 74 6d 74 28 46 74 73 35 49 6e 64 65 78 20 2a  Stmt(Fts5Index *
12270 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  p){.  if( p->pId
12280 78 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  xSelect==0 ){.  
12290 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
122a0 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
122b0 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65  ig;.    fts5Inde
122c0 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
122d0 26 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20  &p->pIdxSelect, 
122e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
122f0 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
12300 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 27 25 71  CT pgno FROM '%q
12310 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45  '.'%q_idx' WHERE
12320 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 73 65   ".          "se
12330 67 69 64 3d 3f 20 41 4e 44 20 74 65 72 6d 3c 3d  gid=? AND term<=
12340 3f 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  ? ORDER BY term 
12350 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20  DESC LIMIT 1",. 
12360 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
12370 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
12380 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
12390 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 49  }.  return p->pI
123a0 64 78 53 65 6c 65 63 74 3b 0a 7d 0a 0a 2f 2a 0a  dxSelect;.}../*.
123b0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
123c0 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  e object pIter t
123d0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20  o point to term 
123e0 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68  pTerm/nTerm with
123f0 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53  in segment.** pS
12400 65 67 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  eg. If there is 
12410 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20  no such term in 
12420 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69  the index, the i
12430 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  terator is set t
12440 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  o EOF..**.** If 
12450 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
12460 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73   Fts5Index.rc is
12470 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f   set to an appro
12480 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
12490 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  e. If .** an err
124a0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
124b0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
124c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
124d0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
124e0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
124f0 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 53  oid fts5SegIterS
12500 65 65 6b 49 6e 69 74 28 0a 20 20 46 74 73 35 49  eekInit(.  Fts5I
12510 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
12520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
12530 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20  S5 backend */.  
12540 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
12550 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
12560 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
12570 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
12580 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
12590 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
125a0 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
125b0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
125c0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
125d0 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
125e0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
125f0 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
12600 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
12610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
12620 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
12630 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67   */.){.  int iPg
12640 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20   = 1;.  int bGe 
12650 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  = (flags & FTS5I
12660 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
12670 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d  ;.  int bDlidx =
12680 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12690 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
126a0 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
126b0 74 2d 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c  t-index */.  sql
126c0 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 53  ite3_stmt *pIdxS
126d0 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 61 73  elect = 0;..  as
126e0 73 65 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20  sert( bGe==0 || 
126f0 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
12700 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 3d 3d  EX_QUERY_DESC)==
12710 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12720 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b  Term && nTerm );
12730 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
12740 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
12750 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53  r));.  pIter->pS
12760 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a  eg = pSeg;..  /*
12770 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73   This block sets
12780 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20   stack variable 
12790 69 50 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20  iPg to the leaf 
127a0 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
127b0 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69   may.  ** contai
127c0 6e 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54  n term (pTerm/nT
127d0 65 72 6d 29 2c 20 69 66 20 69 74 20 69 73 20 70  erm), if it is p
127e0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 65  resent in the se
127f0 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 70 49 64 78  gment. */.  pIdx
12800 53 65 6c 65 63 74 20 3d 20 66 74 73 35 49 64 78  Select = fts5Idx
12810 53 65 6c 65 63 74 53 74 6d 74 28 70 29 3b 0a 20  SelectStmt(p);. 
12820 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
12830 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  urn;.  sqlite3_b
12840 69 6e 64 5f 69 6e 74 28 70 49 64 78 53 65 6c 65  ind_int(pIdxSele
12850 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65  ct, 1, pSeg->iSe
12860 67 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  gid);.  sqlite3_
12870 62 69 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53 65  bind_blob(pIdxSe
12880 6c 65 63 74 2c 20 32 2c 20 70 54 65 72 6d 2c 20  lect, 2, pTerm, 
12890 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f 53 54  nTerm, SQLITE_ST
128a0 41 54 49 43 29 3b 0a 20 20 69 66 28 20 53 51 4c  ATIC);.  if( SQL
128b0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
128c0 5f 73 74 65 70 28 70 49 64 78 53 65 6c 65 63 74  _step(pIdxSelect
128d0 29 20 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c  ) ){.    i64 val
128e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
128f0 6e 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74  n_int(pIdxSelect
12900 2c 20 30 29 3b 0a 20 20 20 20 69 50 67 20 3d 20  , 0);.    iPg = 
12910 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29 3b 0a 20  (int)(val>>1);. 
12920 20 20 20 62 44 6c 69 64 78 20 3d 20 28 76 61 6c     bDlidx = (val
12930 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 7d 0a   & 0x0001);.  }.
12940 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
12950 33 5f 72 65 73 65 74 28 70 49 64 78 53 65 6c 65  3_reset(pIdxSele
12960 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  ct);.  sqlite3_b
12970 69 6e 64 5f 6e 75 6c 6c 28 70 49 64 78 53 65 6c  ind_null(pIdxSel
12980 65 63 74 2c 20 32 29 3b 0a 0a 20 20 69 66 28 20  ect, 2);..  if( 
12990 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  iPg<pSeg->pgnoFi
129a0 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d  rst ){.    iPg =
129b0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
129c0 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30  ;.    bDlidx = 0
129d0 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  ;.  }..  pIter->
129e0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20  iLeafPgno = iPg 
129f0 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74  - 1;.  fts5SegIt
12a00 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
12a10 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74  ter);..  if( pIt
12a20 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
12a30 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70 2c   fts5LeafSeek(p,
12a40 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54 65   bGe, pIter, pTe
12a50 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a  rm, nTerm);.  }.
12a60 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
12a70 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d  LITE_OK && bGe==
12a80 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  0 ){.    pIter->
12a90 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
12aa0 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
12ab0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
12ac0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28  eaf ){.      if(
12ad0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
12ae0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
12af0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
12b00 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
12b10 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
12b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12b30 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20   bDlidx ){.     
12b40 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
12b50 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65 72  adDlidx(p, pIter
12b60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12b70 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
12b80 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
12b90 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  C ){.        fts
12ba0 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
12bb0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
12bc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12bd0 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
12be0 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  xt(p, pIter);.. 
12bf0 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a   /* Either:.  **
12c00 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72  .  **   1) an er
12c10 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
12c20 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74  , or.  **   2) t
12c30 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
12c40 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20  ts to EOF, or.  
12c50 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72  **   3) the iter
12c60 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ator points to a
12c70 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72  n entry with ter
12c80 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
12c90 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68   or.  **   4) th
12ca0 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
12cb0 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20  Y_SCAN flag was 
12cc0 73 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72  set and the iter
12cd0 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  ator points.  **
12ce0 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72        to an entr
12cf0 79 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72  y with a term gr
12d00 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
12d10 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54  ual to (pTerm/nT
12d20 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  erm)..  */.  ass
12d30 65 72 74 5f 6e 63 28 20 70 2d 3e 72 63 21 3d 53  ert_nc( p->rc!=S
12d40 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d70 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74  * 1 */.   || pIt
12d80 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20  er->pLeaf==0    
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20             /* 2 
12dc0 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66  */.   || fts5Buf
12dd0 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
12de0 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
12df0 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20  rm, nTerm)==0   
12e00 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20         /* 3 */. 
12e10 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73    || (bGe && fts
12e20 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
12e30 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
12e40 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30   pTerm, nTerm)>0
12e50 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a  )  /* 4 */.  );.
12e60 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
12e70 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
12e80 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
12e90 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
12ea0 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
12eb0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
12ec0 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  able. If there i
12ed0 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
12ee0 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
12ef0 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
12f00 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
12f10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
12f20 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
12f30 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
12f40 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
12f50 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
12f60 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
12f70 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
12f80 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
12f90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
12fa0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
12fb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12fc0 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
12fd0 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
12fe0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12ff0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
13000 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ckend */.  const
13010 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
13020 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
13030 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
13040 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
13070 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
13080 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
13090 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
130a0 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
130b0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
130c0 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d  ){.  int nList =
130d0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   0;.  const u8 *
130e0 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  z = 0;.  int n =
130f0 20 30 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a   0;.  Fts5Data *
13100 70 4c 65 61 66 20 3d 20 30 3b 0a 0a 20 20 61 73  pLeaf = 0;..  as
13110 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29  sert( p->pHash )
13120 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
13130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
13140 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
13150 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
13160 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
13170 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ) ){.    const u
13180 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 0a 20  8 *pList = 0;.. 
13190 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
131a0 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e  e3Fts5HashScanIn
131b0 69 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f  it(p->pHash, (co
131c0 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c  nst char*)pTerm,
131d0 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c   nTerm);.    sql
131e0 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
131f0 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20  Entry(p->pHash, 
13200 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a  (const char**)&z
13210 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
13220 29 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20  );.    n = (z ? 
13230 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e  (int)strlen((con
13240 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29  st char*)z) : 0)
13250 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
13260 29 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 20 3d  ){.      pLeaf =
13270 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
13280 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  , sizeof(Fts5Dat
13290 61 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  a));.      if( p
132a0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
132b0 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29  pLeaf->p = (u8*)
132c0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
132d0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
132e0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
132f0 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28 70  3Fts5HashQuery(p
13300 2d 3e 70 48 61 73 68 2c 20 73 69 7a 65 6f 66 28  ->pHash, sizeof(
13310 46 74 73 35 44 61 74 61 29 2c 20 0a 20 20 20 20  Fts5Data), .    
13320 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
13330 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 28  )pTerm, nTerm, (
13340 76 6f 69 64 2a 2a 29 26 70 4c 65 61 66 2c 20 26  void**)&pLeaf, &
13350 6e 4c 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 20  nList.    );.   
13360 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
13370 20 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28      pLeaf->p = (
13380 75 38 2a 29 26 70 4c 65 61 66 5b 31 5d 3b 0a 20  u8*)&pLeaf[1];. 
13390 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 70 54 65     }.    z = pTe
133a0 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72  rm;.    n = nTer
133b0 6d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  m;.    pIter->fl
133c0 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
133d0 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 7d  TER_ONETERM;.  }
133e0 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b  ..  if( pLeaf ){
133f0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
13400 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
13410 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
13420 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66  n, z);.    pLeaf
13430 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  ->nn = pLeaf->sz
13440 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  Leaf = nList;.  
13450 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
13460 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65   pLeaf;.    pIte
13470 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
13480 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
13490 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26  Leaf->p, (u64*)&
134a0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
134b0 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
134c0 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66  fDoclist = pLeaf
134d0 2d 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66  ->nn;..    if( f
134e0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
134f0 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20  _QUERY_DESC ){. 
13500 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
13510 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
13520 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
13530 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
13540 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
13550 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Iter);.    }else
13560 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
13570 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
13580 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Iter);.    }.  }
13590 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53  ..  fts5SegIterS
135a0 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
135b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20  ;.}../*.** Zero 
135c0 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
135d0 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
135e0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
135f0 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
13600 49 74 65 72 43 6c 65 61 72 28 46 74 73 35 53 65  IterClear(Fts5Se
13610 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
13620 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
13630 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20  &pIter->term);. 
13640 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
13650 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
13660 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
13670 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  e(pIter->pNextLe
13680 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78  af);.  fts5Dlidx
13690 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e  IterFree(pIter->
136a0 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74  pDlidx);.  sqlit
136b0 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61  e3_free(pIter->a
136c0 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20  RowidOffset);.  
136d0 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
136e0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49   sizeof(Fts5SegI
136f0 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  ter));.}..#ifdef
13700 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f   SQLITE_DEBUG../
13710 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13720 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 70 61  on is used as pa
13730 72 74 20 6f 66 20 74 68 65 20 62 69 67 20 61 73  rt of the big as
13740 73 65 72 74 28 29 20 70 72 6f 63 65 64 75 72 65  sert() procedure
13750 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a   implemented by.
13760 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c  ** fts5AssertMul
13770 74 69 49 74 65 72 53 65 74 75 70 28 29 2e 20 49  tiIterSetup(). I
13780 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  t ensures that t
13790 68 65 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e  he result curren
137a0 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  tly stored.** in
137b0 20 2a 70 52 65 73 20 69 73 20 74 68 65 20 63 6f   *pRes is the co
137c0 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20  rrect result of 
137d0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75  comparing the cu
137e0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20  rrent positions 
137f0 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74  of the.** two it
13800 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  erators..*/.stat
13810 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65  ic void fts5Asse
13820 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75  rtComparisonResu
13830 6c 74 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a  lt(.  Fts5Iter *
13840 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65  pIter, .  Fts5Se
13850 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73  gIter *p1,.  Fts
13860 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20  5SegIter *p2,.  
13870 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
13880 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20  s.){.  int i1 = 
13890 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  p1 - pIter->aSeg
138a0 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20  ;.  int i2 = p2 
138b0 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a  - pIter->aSeg;..
138c0 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20    if( p1->pLeaf 
138d0 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a  || p2->pLeaf ){.
138e0 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61      if( p1->pLea
138f0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
13900 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
13910 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65  st==i2 );.    }e
13920 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61  lse if( p2->pLea
13930 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
13940 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
13950 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65  st==i1 );.    }e
13960 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
13970 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65  Min = MIN(p1->te
13980 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e  rm.n, p2->term.n
13990 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  );.      int res
139a0 20 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 31   = fts5Memcmp(p1
139b0 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65  ->term.p, p2->te
139c0 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  rm.p, nMin);.   
139d0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
139e0 72 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e  res = p1->term.n
139f0 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a   - p2->term.n;..
13a00 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
13a10 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13a20 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  rt( pRes->bTermE
13a30 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  q==1 );.        
13a40 61 73 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77  assert( p1->iRow
13a50 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id!=p2->iRowid )
13a60 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
13a70 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70  ((p1->iRowid > p
13a80 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  2->iRowid)==pIte
13a90 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20  r->bRev) ? -1 : 
13aa0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
13ab0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13ac0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30  pRes->bTermEq==0
13ad0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
13ae0 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
13af0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13b00 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
13b10 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
13b20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13b30 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69   pRes->iFirst==i
13b40 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 );.      }.   
13b50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13b60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13b70 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
13b80 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
13b90 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69  defined when thi
13ba0 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63  s module.** is c
13bb0 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74  ompiled. In that
13bc0 20 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63   case, this func
13bd0 74 69 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61  tion is essentia
13be0 6c 6c 79 20 61 6e 20 61 73 73 65 72 74 28 29 20  lly an assert() 
13bf0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73  .** statement us
13c00 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
13c10 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
13c20 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69  f the pIter->aFi
13c30 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  rst[] array.** a
13c40 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73  re correct..*/.s
13c50 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41  tatic void fts5A
13c60 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
13c70 74 75 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70  tup(Fts5Index *p
13c80 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  , Fts5Iter *pIte
13c90 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
13ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13cb0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13cc0 46 69 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e  First = &pIter->
13cd0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
13ce0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
13cf0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
13d00 20 61 73 73 65 72 74 28 20 28 70 46 69 72 73 74   assert( (pFirst
13d10 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74  ->pLeaf==0)==pIt
13d20 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 29 3b  er->base.bEof );
13d30 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
13d40 68 61 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74  hat pIter->iSwit
13d50 63 68 52 6f 77 69 64 20 69 73 20 73 65 74 20 63  chRowid is set c
13d60 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
13d70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
13d80 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  r->nSeg; i++){. 
13d90 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
13da0 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p1 = &pIter->a
13db0 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73  Seg[i];.      as
13dc0 73 65 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74  sert( p1==pFirst
13dd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13de0 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20  p1->pLeaf==0 .  
13df0 20 20 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35           || fts5
13e00 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70  BufferCompare(&p
13e10 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31  First->term, &p1
13e20 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20  ->term) .       
13e30 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69      || p1->iRowi
13e40 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63  d==pIter->iSwitc
13e50 68 52 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20  hRowid.         
13e60 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64    || (p1->iRowid
13e70 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  <pIter->iSwitchR
13e80 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
13e90 65 76 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ev.      );.    
13ea0 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
13eb0 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
13ec0 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  +=2){.      Fts5
13ed0 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70  SegIter *p1 = &p
13ee0 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20  Iter->aSeg[i];. 
13ef0 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
13f00 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p2 = &pIter->a
13f10 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20  Seg[i+1];.      
13f20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
13f30 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
13f40 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20  st[(pIter->nSeg 
13f50 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20  + i) / 2];.     
13f60 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
13f70 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65  risonResult(pIte
13f80 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29  r, p1, p2, pRes)
13f90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
13fa0 28 69 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e  (i=1; i<(pIter->
13fb0 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29  nSeg / 2); i+=2)
13fc0 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
13fd0 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72  ter *p1 = &pIter
13fe0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
13ff0 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73  First[i*2].iFirs
14000 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53  t ];.      Fts5S
14010 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49  egIter *p2 = &pI
14020 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
14030 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e  ->aFirst[i*2+1].
14040 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20  iFirst ];.      
14050 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
14060 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
14070 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73  st[i];.      fts
14080 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f  5AssertCompariso
14090 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70  nResult(pIter, p
140a0 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20  1, p2, pRes);.  
140b0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
140c0 23 20 64 65 66 69 6e 65 20 66 74 73 35 41 73 73  # define fts5Ass
140d0 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
140e0 70 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f  p(x,y).#endif../
140f0 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70  *.** Do the comp
14100 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79  arison necessary
14110 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74   to populate pIt
14120 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d  er->aFirst[iOut]
14130 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
14140 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
14150 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
14160 69 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  it is the index 
14170 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69  of an entry.** i
14180 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65  n the pIter->aSe
14190 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20 69  g[] array that i
141a0 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46  s (a) not at EOF
141b0 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69  , and (b) pointi
141c0 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74  ng.** to a key t
141d0 68 61 74 20 69 73 20 61 20 64 75 70 6c 69 63 61  hat is a duplica
141e0 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68  te of another, h
141f0 69 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20  igher priority, 
14200 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72  .** segment-iter
14210 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67  ator in the pSeg
14220 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aSeg[] array..
14230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
14240 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
14250 70 61 72 65 28 46 74 73 35 49 74 65 72 20 2a 70  pare(Fts5Iter *p
14260 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b  Iter, int iOut){
14270 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20  .  int i1;      
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c     /* Index of l
142a0 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  eft-hand Fts5Seg
142b0 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32  Iter */.  int i2
142c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
142d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
142e0 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  ex of right-hand
142f0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
14300 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74    int iRes;.  Ft
14310 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20  s5SegIter *p1;  
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14330 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   Left-hand Fts5S
14340 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35  egIter */.  Fts5
14350 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20  SegIter *p2;    
14360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14370 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65  ight-hand Fts5Se
14380 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43  gIter */.  Fts5C
14390 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
143a0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
143b0 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ut];..  assert( 
143c0 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67  iOut<pIter->nSeg
143d0 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20   && iOut>0 );.  
143e0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62  assert( pIter->b
143f0 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d  Rev==0 || pIter-
14400 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69  >bRev==1 );..  i
14410 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d  f( iOut>=(pIter-
14420 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20  >nSeg/2) ){.    
14430 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74  i1 = (iOut - pIt
14440 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b  er->nSeg/2) * 2;
14450 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31  .    i2 = i1 + 1
14460 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
14470 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  1 = pIter->aFirs
14480 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74  t[iOut*2].iFirst
14490 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65 72  ;.    i2 = pIter
144a0 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b  ->aFirst[iOut*2+
144b0 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20  1].iFirst;.  }. 
144c0 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   p1 = &pIter->aS
144d0 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26  eg[i1];.  p2 = &
144e0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b  pIter->aSeg[i2];
144f0 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  ..  pRes->bTermE
14500 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d  q = 0;.  if( p1-
14510 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20  >pLeaf==0 ){    
14520 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20         /* If p1 
14530 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20  is at EOF */.   
14540 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65   iRes = i2;.  }e
14550 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61  lse if( p2->pLea
14560 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49  f==0 ){     /* I
14570 66 20 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a  f p2 is at EOF *
14580 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b  /.    iRes = i1;
14590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
145a0 74 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66  t res = fts5Buff
145b0 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74  erCompare(&p1->t
145c0 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b  erm, &p2->term);
145d0 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
145e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f  ){.      assert_
145f0 6e 63 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20  nc( i2>i1 );.   
14600 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 32     assert_nc( i2
14610 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65  !=0 );.      pRe
14620 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a  s->bTermEq = 1;.
14630 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52        if( p1->iR
14640 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64  owid==p2->iRowid
14650 20 29 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e   ){.        p1->
14660 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b  bDel = p2->bDel;
14670 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14680 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i2;.      }.    
14690 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52    res = ((p1->iR
146a0 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69  owid > p2->iRowi
146b0 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29  d)==pIter->bRev)
146c0 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20   ? -1 : +1;.    
146d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65  }.    assert( re
146e0 73 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  s!=0 );.    if( 
146f0 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  res<0 ){.      i
14700 52 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65  Res = i1;.    }e
14710 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20  lse{.      iRes 
14720 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = i2;.    }.  }.
14730 0a 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20  .  pRes->iFirst 
14740 3d 20 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72  = (u16)iRes;.  r
14750 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
14760 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69  * Move the seg-i
14770 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
14780 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
14790 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
147a0 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49   iLeafPgno..** I
147b0 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66  t is an error if
147c0 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20   leaf iLeafPgno 
147d0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
147e0 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  r contains no ro
147f0 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wids..*/.static 
14800 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
14810 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35  GotoPage(.  Fts5
14820 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
14830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14840 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
14850 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
14860 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
14870 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
14880 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
14890 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
148a0 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  o.){.  assert( i
148b0 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
148c0 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
148d0 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  if( iLeafPgno>pI
148e0 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c  ter->pSeg->pgnoL
148f0 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ast ){.    p->rc
14900 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
14910 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
14920 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
14930 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b  ter->pNextLeaf);
14940 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78  .    pIter->pNex
14950 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  tLeaf = 0;.    p
14960 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
14970 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20  = iLeafPgno-1;. 
14980 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
14990 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
149a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
149b0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
149c0 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  | pIter->iLeafPg
149d0 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b  no==iLeafPgno );
149e0 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
149f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14a00 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
14a10 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65      u8 *a = pIte
14a20 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
14a30 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72     int n = pIter
14a40 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  ->pLeaf->szLeaf;
14a50 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66  ..      iOff = f
14a60 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
14a70 64 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61  dOff(pIter->pLea
14a80 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f  f);.      if( iO
14a90 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20  ff<4 || iOff>=n 
14aa0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
14ab0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
14ac0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14ad0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
14ae0 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
14af0 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
14b00 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
14b10 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
14b20 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
14b30 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
14b40 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
14b50 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
14b60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14b70 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
14b80 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
14b90 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14ba0 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73  ment until it is
14bb0 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20   at or .** past 
14bc0 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67  rowid iFrom. Reg
14bd0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
14be0 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74  alue of iFrom, t
14bf0 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a  he iterator is.*
14c00 2a 20 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65  * always advance
14c10 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  d at least once.
14c20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14c30 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46  fts5SegIterNextF
14c40 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
14c50 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14c60 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
14c70 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
14c80 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
14c90 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
14ca0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
14cb0 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
14cc0 36 34 20 69 4d 61 74 63 68 20 20 20 20 20 20 20  64 iMatch       
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14ce0 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74  * Advance iterat
14cf0 6f 72 20 61 74 20 6c 65 61 73 74 20 74 68 69 73  or at least this
14d00 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   far */.){.  int
14d10 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e   bRev = (pIter->
14d20 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
14d30 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20  ITER_REVERSE);. 
14d40 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
14d50 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  pDlidx = pIter->
14d60 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c  pDlidx;.  int iL
14d70 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
14d80 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  >iLeafPgno;.  in
14d90 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20  t bMove = 1;..  
14da0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
14db0 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
14dc0 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20  TER_ONETERM );. 
14dd0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14de0 70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65  pDlidx );.  asse
14df0 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  rt( pIter->pLeaf
14e00 20 29 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d   );..  if( bRev=
14e10 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
14e20 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45   !fts5DlidxIterE
14e30 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26  of(p, pDlidx) &&
14e40 20 69 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64   iMatch>fts5Dlid
14e50 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
14e60 78 29 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61  x) ){.      iLea
14e70 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64  fPgno = fts5Dlid
14e80 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
14e90 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
14ea0 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44  dxIterNext(p, pD
14eb0 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lidx);.    }.   
14ec0 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61   assert_nc( iLea
14ed0 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c  fPgno>=pIter->iL
14ee0 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63  eafPgno || p->rc
14ef0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61   );.    if( iLea
14f00 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65  fPgno>pIter->iLe
14f10 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
14f20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50  fts5SegIterGotoP
14f30 61 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  age(p, pIter, iL
14f40 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  eafPgno);.      
14f50 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  bMove = 0;.    }
14f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14f70 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65  sert( pIter->pNe
14f80 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  xtLeaf==0 );.   
14f90 20 61 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c   assert( iMatch<
14fa0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b  pIter->iRowid );
14fb0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73  .    while( !fts
14fc0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
14fd0 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74   pDlidx) && iMat
14fe0 63 68 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72  ch<fts5DlidxIter
14ff0 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b  Rowid(pDlidx) ){
15000 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
15010 49 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69  IterPrev(p, pDli
15020 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dx);.    }.    i
15030 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44  LeafPgno = fts5D
15040 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
15050 69 64 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  idx);..    asser
15060 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  t( fts5DlidxIter
15070 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c  Eof(p, pDlidx) |
15080 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74  | iLeafPgno<=pIt
15090 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b  er->iLeafPgno );
150a0 0a 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ..    if( iLeafP
150b0 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno<pIter->iLeaf
150c0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49  Pgno ){.      pI
150d0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
150e0 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20   iLeafPgno+1;.  
150f0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
15100 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c  everseNewPage(p,
15110 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62   pIter);.      b
15120 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
15130 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69    }..  do{.    i
15140 66 28 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72  f( bMove && p->r
15150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
15160 49 74 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70  Iter->xNext(p, p
15170 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Iter, 0);.    if
15180 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
15190 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
151a0 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49  f( bRev==0 && pI
151b0 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61  ter->iRowid>=iMa
151c0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
151d0 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26 20   if( bRev!=0 && 
151e0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69  pIter->iRowid<=i
151f0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
15200 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20     bMove = 1;.  
15210 7d 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53  }while( p->rc==S
15220 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a  QLITE_OK );.}...
15230 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69  /*.** Free the i
15240 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
15250 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
15260 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
15270 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15280 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46  5MultiIterFree(F
15290 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
152a0 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
152b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
152c0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
152d0 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
152e0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c     fts5SegIterCl
152f0 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67  ear(&pIter->aSeg
15300 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
15310 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
15320 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
15330 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
15340 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  e(pIter);.  }.}.
15350 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15360 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
15370 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ed(.  Fts5Index 
15380 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
15390 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
153a0 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
153b0 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
153c0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  5Iter *pIter,   
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
153e0 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61  Iterator to upda
153f0 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  te aFirst[] arra
15400 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  y for */.  int i
15410 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20  Changed,        
15420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15430 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61  dex of sub-itera
15440 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65  tor just advance
15450 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73  d */.  int iMins
15460 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
15470 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
15480 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73  m entry in aFirs
15490 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b  t[] to set */.){
154a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
154b0 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69  i=(pIter->nSeg+i
154c0 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69  Changed)/2; i>=i
154d0 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d  Minset && p->rc=
154e0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f  =SQLITE_OK; i=i/
154f0 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b  2){.    int iEq;
15500 0a 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20  .    if( (iEq = 
15510 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
15520 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29  ompare(pIter, i)
15530 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ) ){.      Fts5S
15540 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
15550 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d  pIter->aSeg[iEq]
15560 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15570 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15580 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   );.      pSeg->
15590 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30  xNext(p, pSeg, 0
155a0 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74  );.      i = pIt
155b0 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a  er->nSeg + iEq;.
155c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
155d0 2a 2a 20 53 75 62 2d 69 74 65 72 61 74 6f 72 20  ** Sub-iterator 
155e0 69 43 68 61 6e 67 65 64 20 6f 66 20 69 74 65 72  iChanged of iter
155f0 61 74 6f 72 20 70 49 74 65 72 20 68 61 73 20 6a  ator pIter has j
15600 75 73 74 20 62 65 65 6e 20 61 64 76 61 6e 63 65  ust been advance
15610 64 2e 20 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70  d. It still.** p
15620 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 61 6d  oints to the sam
15630 65 20 74 65 72 6d 20 74 68 6f 75 67 68 20 2d 20  e term though - 
15640 6a 75 73 74 20 61 20 64 69 66 66 65 72 65 6e 74  just a different
15650 20 72 6f 77 69 64 2e 20 54 68 69 73 20 66 75 6e   rowid. This fun
15660 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  ction.** attempt
15670 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  s to update the 
15680 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
15690 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20  pIter->aFirst[] 
156a0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20  accordingly..** 
156b0 49 66 20 69 74 20 64 6f 65 73 20 73 6f 20 73 75  If it does so su
156c0 63 63 65 73 73 66 75 6c 6c 79 2c 20 30 20 69 73  ccessfully, 0 is
156d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
156e0 77 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  wise 1..**.** If
156f0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
15700 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
15710 72 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74  r should call ft
15720 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
15730 63 65 64 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20  ced().** on the 
15740 69 74 65 72 61 74 6f 72 20 69 6e 73 74 65 61 64  iterator instead
15750 2e 20 54 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  . That function 
15760 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 61 73  does the same as
15770 20 74 68 69 73 20 6f 6e 65 2c 20 65 78 63 65 70   this one, excep
15780 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 65 61  t.** that it dea
15790 6c 73 20 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d  ls with more com
157a0 70 6c 69 63 61 74 65 64 20 63 61 73 65 73 20 61  plicated cases a
157b0 73 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74  s well..*/ .stat
157c0 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
157d0 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64  IterAdvanceRowid
157e0 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49  (.  Fts5Iter *pI
157f0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
15800 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
15810 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74  to update aFirst
15820 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a  [] array for */.
15830 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20    int iChanged, 
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75    /* Index of su
15860 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20  b-iterator just 
15870 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 46 74  advanced */.  Ft
15880 73 35 53 65 67 49 74 65 72 20 2a 2a 70 70 46 69  s5SegIter **ppFi
15890 72 73 74 0a 29 7b 0a 20 20 46 74 73 35 53 65 67  rst.){.  Fts5Seg
158a0 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49  Iter *pNew = &pI
158b0 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
158c0 65 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  ed];..  if( pNew
158d0 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d  ->iRowid==pIter-
158e0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20  >iSwitchRowid.  
158f0 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69   || (pNew->iRowi
15900 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  d<pIter->iSwitch
15910 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
15920 52 65 76 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  Rev.  ){.    int
15930 20 69 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49   i;.    Fts5SegI
15940 74 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  ter *pOther = &p
15950 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e  Iter->aSeg[iChan
15960 67 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20  ged ^ 0x0001];. 
15970 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63     pIter->iSwitc
15980 68 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e  hRowid = pIter->
15990 62 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  bRev ? SMALLEST_
159a0 49 4e 54 36 34 20 3a 20 4c 41 52 47 45 53 54 5f  INT64 : LARGEST_
159b0 49 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72 28 69  INT64;.    for(i
159c0 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43  =(pIter->nSeg+iC
159d0 68 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d  hanged)/2; 1; i=
159e0 69 2f 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i/2){.      Fts5
159f0 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
15a00 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69  &pIter->aFirst[i
15a10 5d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ];..      assert
15a20 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b  ( pNew->pLeaf );
15a30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15a40 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20  Res->bTermEq==0 
15a50 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66  || pOther->pLeaf
15a60 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
15a70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a  Res->bTermEq ){.
15a80 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
15a90 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72  ->iRowid==pOther
15aa0 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
15ab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
15ac0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
15ad0 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69  ( (pOther->iRowi
15ae0 64 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d  d>pNew->iRowid)=
15af0 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a  =pIter->bRev ){.
15b00 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
15b10 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
15b20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a  pOther->iRowid;.
15b30 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
15b40 20 70 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20   pOther;.       
15b50 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68   }else if( (pOth
15b60 65 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74 65 72  er->iRowid>pIter
15b70 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d  ->iSwitchRowid)=
15b80 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a  =pIter->bRev ){.
15b90 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
15ba0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
15bb0 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a  pOther->iRowid;.
15bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15bd0 7d 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 69 46  }.      pRes->iF
15be0 69 72 73 74 20 3d 20 28 75 31 36 29 28 70 4e 65  irst = (u16)(pNe
15bf0 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 29  w - pIter->aSeg)
15c00 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  ;.      if( i==1
15c10 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
15c20 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72   pOther = &pIter
15c30 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
15c40 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31  First[i ^ 0x0001
15c50 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
15c60 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 46 69 72 73  }.  }..  *ppFirs
15c70 74 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75  t = pNew;.  retu
15c80 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
15c90 65 74 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45  et the pIter->bE
15ca0 6f 66 20 76 61 72 69 61 62 6c 65 20 62 61 73 65  of variable base
15cb0 64 20 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f  d on the state o
15cc0 66 20 74 68 65 20 73 75 62 2d 69 74 65 72 61 74  f the sub-iterat
15cd0 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
15ce0 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
15cf0 72 53 65 74 45 6f 66 28 46 74 73 35 49 74 65 72  rSetEof(Fts5Iter
15d00 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
15d10 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
15d20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
15d30 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
15d40 46 69 72 73 74 20 5d 3b 0a 20 20 70 49 74 65 72  First ];.  pIter
15d50 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 70 53  ->base.bEof = pS
15d60 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20  eg->pLeaf==0;.  
15d70 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
15d80 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
15d90 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  id;.}../*.** Mov
15da0 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  e the iterator t
15db0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
15dc0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
15dd0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
15de0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
15df0 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e  ft in Fts5Index.
15e00 72 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a  rc. It is not .*
15e10 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20  * considered an 
15e20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65  error if the ite
15e30 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f  rator reaches EO
15e40 46 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61  F, or if it is a
15e50 6c 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f  lready at .** EO
15e60 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
15e70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
15e80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15e90 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
15ea0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15eb0 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  , .  Fts5Iter *p
15ec0 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f  Iter,.  int bFro
15ed0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
15ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15ef0 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f  if argument iFro
15f00 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  m is valid */.  
15f10 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20  i64 iFrom       
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65  /* Advance at le
15f40 61 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68  ast as far as th
15f50 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  is */.){.  int b
15f60 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b  UseFrom = bFrom;
15f70 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
15f80 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29  ->base.bEof==0 )
15f90 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
15fa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15fb0 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20     int iFirst = 
15fc0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
15fd0 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69 6e 74  .iFirst;.    int
15fe0 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20   bNewTerm = 0;. 
15ff0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
16000 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
16010 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20  Seg[iFirst];.   
16020 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
16030 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
16040 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26   if( bUseFrom &&
16050 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b   pSeg->pDlidx ){
16060 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
16070 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53  erNextFrom(p, pS
16080 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20  eg, iFrom);.    
16090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53 65  }else{.      pSe
160a0 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67  g->xNext(p, pSeg
160b0 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20  , &bNewTerm);.  
160c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 53 65    }..    if( pSe
160d0 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62  g->pLeaf==0 || b
160e0 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 7c 7c  NewTerm .     ||
160f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
16100 76 61 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72  vanceRowid(pIter
16110 2c 20 69 46 69 72 73 74 2c 20 26 70 53 65 67 29  , iFirst, &pSeg)
16120 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 74  .    ){.      ft
16130 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
16140 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46  ced(p, pIter, iF
16150 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  irst, 1);.      
16160 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
16170 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20  Eof(pIter);.    
16180 20 20 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d    pSeg = &pIter-
16190 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69  >aSeg[pIter->aFi
161a0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a  rst[1].iFirst];.
161b0 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
161c0 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72  pLeaf==0 ) retur
161d0 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  n;.    }..    ft
161e0 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
161f0 72 53 65 74 75 70 28 70 2c 20 70 49 74 65 72 29  rSetup(p, pIter)
16200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
16210 65 67 3d 3d 26 70 49 74 65 72 2d 3e 61 53 65 67  eg==&pIter->aSeg
16220 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31  [pIter->aFirst[1
16230 5d 2e 69 46 69 72 73 74 5d 20 26 26 20 70 53 65  ].iFirst] && pSe
16240 67 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20  g->pLeaf );.    
16250 69 66 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70  if( pIter->bSkip
16260 45 6d 70 74 79 3d 3d 30 20 7c 7c 20 70 53 65 67  Empty==0 || pSeg
16270 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20 20  ->nPos ){.      
16280 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75  pIter->xSetOutpu
16290 74 73 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b  ts(pIter, pSeg);
162a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
162b0 20 20 20 7d 0a 20 20 20 20 62 55 73 65 46 72 6f     }.    bUseFro
162c0 6d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  m = 0;.  }.}..st
162d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
162e0 6c 74 69 49 74 65 72 4e 65 78 74 32 28 0a 20 20  ltiIterNext2(.  
162f0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
16300 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
16310 2c 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65  ,.  int *pbNewTe
16320 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
16330 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65      /* OUT: True
16340 20 69 66 20 2a 6d 69 67 68 74 2a 20 62 65 20 6e   if *might* be n
16350 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20  ew term */.){.  
16360 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62  assert( pIter->b
16370 53 6b 69 70 45 6d 70 74 79 20 29 3b 0a 20 20 69  SkipEmpty );.  i
16380 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16390 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 62 4e 65  _OK ){.    *pbNe
163a0 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 64  wTerm = 0;.    d
163b0 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69  o{.      int iFi
163c0 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69  rst = pIter->aFi
163d0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20  rst[1].iFirst;. 
163e0 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
163f0 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
16400 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20  >aSeg[iFirst];. 
16410 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72       int bNewTer
16420 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73  m = 0;..      as
16430 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
16440 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
16450 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70  pSeg->xNext(p, p
16460 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b  Seg, &bNewTerm);
16470 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d  .      if( pSeg-
16480 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65  >pLeaf==0 || bNe
16490 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c  wTerm .       ||
164a0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
164b0 76 61 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72  vanceRowid(pIter
164c0 2c 20 69 46 69 72 73 74 2c 20 26 70 53 65 67 29  , iFirst, &pSeg)
164d0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
164e0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
164f0 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72  dvanced(p, pIter
16500 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20  , iFirst, 1);.  
16510 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
16520 74 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29  terSetEof(pIter)
16530 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77  ;.        *pbNew
16540 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
16550 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  }.      fts5Asse
16560 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
16570 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20  (p, pIter);..   
16580 20 7d 77 68 69 6c 65 28 20 66 74 73 35 4d 75 6c   }while( fts5Mul
16590 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c  tiIterIsEmpty(p,
165a0 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d   pIter) );.  }.}
165b0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
165c0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
165d0 5f 4e 6f 6f 70 28 46 74 73 35 49 74 65 72 20 2a  _Noop(Fts5Iter *
165e0 70 55 6e 75 73 65 64 31 2c 20 46 74 73 35 53 65  pUnused1, Fts5Se
165f0 67 49 74 65 72 20 2a 70 55 6e 75 73 65 64 32 29  gIter *pUnused2)
16600 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
16610 32 28 70 55 6e 75 73 65 64 31 2c 20 70 55 6e 75  2(pUnused1, pUnu
16620 73 65 64 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  sed2);.}..static
16630 20 46 74 73 35 49 74 65 72 20 2a 66 74 73 35 4d   Fts5Iter *fts5M
16640 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20  ultiIterAlloc(. 
16650 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16670 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
16680 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
16690 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  in */.  int nSeg
166a0 0a 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  .){.  Fts5Iter *
166b0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f  pNew;.  int nSlo
166c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
166d0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72          /* Power
166e0 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20   of two >= nSeg 
166f0 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d  */..  for(nSlot=
16700 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e  2; nSlot<nSeg; n
16710 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20  Slot=nSlot*2);. 
16720 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d   pNew = fts5IdxM
16730 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20  alloc(p, .      
16740 73 69 7a 65 6f 66 28 46 74 73 35 49 74 65 72 29  sizeof(Fts5Iter)
16750 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
16760 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20      /* pNew */. 
16770 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
16780 53 65 67 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f  SegIter) * (nSlo
16790 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77  t-1) +   /* pNew
167a0 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20  ->aSeg[] */.    
167b0 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65    sizeof(Fts5CRe
167c0 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20  sult) * nSlot   
167d0 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61        /* pNew->a
167e0 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a  First[] */.  );.
167f0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
16800 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e    pNew->nSeg = n
16810 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Slot;.    pNew->
16820 61 46 69 72 73 74 20 3d 20 28 46 74 73 35 43 52  aFirst = (Fts5CR
16830 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53  esult*)&pNew->aS
16840 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70  eg[nSlot];.    p
16850 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b  New->pIndex = p;
16860 0a 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f  .    pNew->xSetO
16870 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
16880 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70  rSetOutputs_Noop
16890 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
168a0 4e 65 77 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  New;.}..static v
168b0 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43  oid fts5PoslistC
168c0 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
168d0 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a  ndex *pUnused, .
168e0 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
168f0 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
16900 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
16910 6b 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  k.){.  UNUSED_PA
16920 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  RAM(pUnused);.  
16930 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e  assert_nc( nChun
16940 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43  k>=0 );.  if( nC
16950 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74  hunk>0 ){.    ft
16960 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
16970 6e 64 42 6c 6f 62 28 28 46 74 73 35 42 75 66 66  ndBlob((Fts5Buff
16980 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70 43  er*)pContext, pC
16990 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20  hunk, nChunk);. 
169a0 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74   }.}..typedef st
169b0 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c  ruct PoslistCall
169c0 62 61 63 6b 43 74 78 20 50 6f 73 6c 69 73 74 43  backCtx PoslistC
169d0 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72 75  allbackCtx;.stru
169e0 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ct PoslistCallba
169f0 63 6b 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75  ckCtx {.  Fts5Bu
16a00 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20  ffer *pBuf;     
16a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
16a20 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66 66  end to this buff
16a30 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  er */.  Fts5Cols
16a40 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
16a50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
16a60 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
16a70 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  his column */.  
16a80 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a  /* See above */.
16ab0 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  };..typedef stru
16ac0 63 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ct PoslistOffset
16ad0 73 43 74 78 20 50 6f 73 6c 69 73 74 4f 66 66 73  sCtx PoslistOffs
16ae0 65 74 73 43 74 78 3b 0a 73 74 72 75 63 74 20 50  etsCtx;.struct P
16af0 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
16b00 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20   {.  Fts5Buffer 
16b10 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  *pBuf;          
16b20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
16b30 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
16b40 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
16b50 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20  Colset;         
16b60 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d     /* Restrict m
16b70 61 74 63 68 65 73 20 74 6f 20 74 68 69 73 20 63  atches to this c
16b80 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
16b90 52 65 61 64 3b 0a 20 20 69 6e 74 20 69 57 72 69  Read;.  int iWri
16ba0 74 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f  te;.};../*.** TO
16bb0 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f  DO: Make this mo
16bc0 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f  re efficient!.*/
16bd0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
16be0 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
16bf0 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
16c00 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  set, int iCol){.
16c10 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
16c20 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e  =0; i<pColset->n
16c30 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
16c40 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  f( pColset->aiCo
16c50 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74  l[i]==iCol ) ret
16c60 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
16c70 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
16c80 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73   void fts5Poslis
16c90 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b  tOffsetsCallback
16ca0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16cb0 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20  Unused, .  void 
16cc0 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
16cd0 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
16ce0 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
16cf0 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74  PoslistOffsetsCt
16d00 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69  x *pCtx = (Posli
16d10 73 74 4f 66 66 73 65 74 73 43 74 78 2a 29 70 43  stOffsetsCtx*)pC
16d20 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44  ontext;.  UNUSED
16d30 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b  _PARAM(pUnused);
16d40 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43  .  assert_nc( nC
16d50 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28  hunk>=0 );.  if(
16d60 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20   nChunk>0 ){.   
16d70 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
16d80 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
16d90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61  ){.      int iVa
16da0 6c 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  l;.      i += ft
16db0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
16dc0 43 68 75 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b  Chunk[i], iVal);
16dd0 0a 20 20 20 20 20 20 69 56 61 6c 20 2b 3d 20 70  .      iVal += p
16de0 43 74 78 2d 3e 69 52 65 61 64 20 2d 20 32 3b 0a  Ctx->iRead - 2;.
16df0 20 20 20 20 20 20 70 43 74 78 2d 3e 69 52 65 61        pCtx->iRea
16e00 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  d = iVal;.      
16e10 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  if( fts5IndexCol
16e20 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43  setTest(pCtx->pC
16e30 6f 6c 73 65 74 2c 20 69 56 61 6c 29 20 29 7b 0a  olset, iVal) ){.
16e40 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
16e50 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
16e60 6e 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 69  nt(pCtx->pBuf, i
16e70 56 61 6c 20 2b 20 32 20 2d 20 70 43 74 78 2d 3e  Val + 2 - pCtx->
16e80 69 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  iWrite);.       
16e90 20 70 43 74 78 2d 3e 69 57 72 69 74 65 20 3d 20   pCtx->iWrite = 
16ea0 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iVal;.      }.  
16eb0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
16ec0 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69  c void fts5Posli
16ed0 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b  stFilterCallback
16ee0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16ef0 55 6e 75 73 65 64 2c 0a 20 20 76 6f 69 64 20 2a  Unused,.  void *
16f00 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e  pContext, .  con
16f10 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
16f20 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50  nt nChunk.){.  P
16f30 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16f40 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69  x *pCtx = (Posli
16f50 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70  stCallbackCtx*)p
16f60 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45  Context;.  UNUSE
16f70 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29  D_PARAM(pUnused)
16f80 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e  ;.  assert_nc( n
16f90 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66  Chunk>=0 );.  if
16fa0 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  ( nChunk>0 ){.  
16fb0 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 72 6f    /* Search thro
16fc0 75 67 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ugh to find the 
16fd0 66 69 72 73 74 20 76 61 72 69 6e 74 20 77 69 74  first varint wit
16fe0 68 20 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20  h value 1. This 
16ff0 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  is the.    ** st
17000 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
17010 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f  columns hits. */
17020 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
17030 20 20 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d      int iStart =
17040 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 74   0;..    if( pCt
17050 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a  x->eState==2 ){.
17060 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
17070 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65        fts5FastGe
17080 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b  tVarint32(pChunk
17090 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  , i, iCol);.    
170a0 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 43    if( fts5IndexC
170b0 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e  olsetTest(pCtx->
170c0 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29  pColset, iCol) )
170d0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
170e0 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  eState = 1;.    
170f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
17100 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
17110 43 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20  Ctx->pBuf, 1);. 
17120 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17130 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
17140 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
17150 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20    }..    do {.  
17160 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68      while( i<nCh
17170 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d  unk && pChunk[i]
17180 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  !=0x01 ){.      
17190 20 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b    while( pChunk[
171a0 69 5d 20 26 20 30 78 38 30 20 29 20 69 2b 2b 3b  i] & 0x80 ) i++;
171b0 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
171c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
171d0 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCtx->eState ){.
171e0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
171f0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
17200 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43  (pCtx->pBuf, &pC
17210 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d  hunk[iStart], i-
17220 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d  iStart);.      }
17230 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68  .      if( i<nCh
17240 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
17250 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt iCol;.       
17260 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
17270 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
17280 20 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20    if( i>=nChunk 
17290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  ){.          pCt
172a0 78 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20  x->eState = 2;. 
172b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
172c0 20 20 20 20 20 20 20 20 66 74 73 35 46 61 73 74          fts5Fast
172d0 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75  GetVarint32(pChu
172e0 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20  nk, i, iCol);.  
172f0 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53          pCtx->eS
17300 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78  tate = fts5Index
17310 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d  ColsetTest(pCtx-
17320 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b  >pColset, iCol);
17330 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
17340 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Ctx->eState ){. 
17350 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
17360 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
17370 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20  lob(pCtx->pBuf, 
17380 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c  &pChunk[iStart],
17390 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20   i-iStart);.    
173a0 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
173b0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   i;.          }.
173c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
173d0 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c  }.    }while( i<
173e0 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a  nChunk );.  }.}.
173f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17400 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20  5ChunkIterate(. 
17410 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17430 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   /* Index object
17440 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
17450 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20  r *pSeg,        
17460 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74        /* Poslist
17470 20 6f 66 20 74 68 69 73 20 69 74 65 72 61 74 6f   of this iterato
17480 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74  r */.  void *pCt
17490 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
174a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
174b0 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43  t pointer for xC
174c0 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  hunk callback */
174d0 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b  .  void (*xChunk
174e0 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f  )(Fts5Index*, vo
174f0 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20  id*, const u8*, 
17500 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52  int).){.  int nR
17510 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b  em = pSeg->nPos;
17520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17530 62 65 72 20 6f 66 20 62 79 74 65 73 20 73 74 69  ber of bytes sti
17540 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20  ll to come */.  
17550 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20  Fts5Data *pData 
17560 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e  = 0;.  u8 *pChun
17570 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  k = &pSeg->pLeaf
17580 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
17590 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43  ffset];.  int nC
175a0 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c  hunk = MIN(nRem,
175b0 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a   pSeg->pLeaf->sz
175c0 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65  Leaf - pSeg->iLe
175d0 61 66 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74  afOffset);.  int
175e0 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c   pgno = pSeg->iL
175f0 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70  eafPgno;.  int p
17600 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20  gnoSave = 0;..  
17610 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
17620 20 64 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b 20 77   does notmwork w
17630 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20  ith detail=none 
17640 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
17650 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
17660 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53  ig->eDetail!=FTS
17670 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
17680 0a 0a 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66  ..  if( (pSeg->f
17690 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
176a0 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20  TER_REVERSE)==0 
176b0 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20  ){.    pgnoSave 
176c0 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20  = pgno+1;.  }.. 
176d0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
176e0 20 78 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c   xChunk(p, pCtx,
176f0 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29   pChunk, nChunk)
17700 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43  ;.    nRem -= nC
17710 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61  hunk;.    fts5Da
17720 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
17730 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d  ;.    if( nRem<=
17740 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
17750 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17760 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20     pgno++;.     
17770 20 70 44 61 74 61 20 3d 20 66 74 73 35 4c 65 61   pData = fts5Lea
17780 66 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  fRead(p, FTS5_SE
17790 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
177a0 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  ->pSeg->iSegid, 
177b0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69 66  pgno));.      if
177c0 28 20 70 44 61 74 61 3d 3d 30 20 29 20 62 72 65  ( pData==0 ) bre
177d0 61 6b 3b 0a 20 20 20 20 20 20 70 43 68 75 6e 6b  ak;.      pChunk
177e0 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b   = &pData->p[4];
177f0 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20  .      nChunk = 
17800 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d  MIN(nRem, pData-
17810 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20  >szLeaf - 4);.  
17820 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67      if( pgno==pg
17830 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20  noSave ){.      
17840 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e    assert( pSeg->
17850 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a  pNextLeaf==0 );.
17860 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e          pSeg->pN
17870 65 78 74 4c 65 61 66 20 3d 20 70 44 61 74 61 3b  extLeaf = pData;
17880 0a 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d  .        pData =
17890 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
178a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
178b0 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
178c0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
178d0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  o a valid entry 
178e0 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a  (not EOF). This.
178f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
17900 6e 64 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  nds the position
17910 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20 74   list data for t
17920 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
17930 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42   to.** buffer pB
17940 75 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  uf. It does not 
17950 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
17960 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
17970 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a   size.** field..
17980 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
17990 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
179a0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
179b0 70 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  p,.  Fts5SegIter
179c0 20 2a 70 53 65 67 2c 0a 20 20 46 74 73 35 43 6f   *pSeg,.  Fts5Co
179d0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20  lset *pColset,. 
179e0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
179f0 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d 66 74  f.){.  if( 0==ft
17a00 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
17a10 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d  >rc, pBuf, pSeg-
17a20 3e 6e 50 6f 73 2b 46 54 53 35 5f 44 41 54 41 5f  >nPos+FTS5_DATA_
17a30 5a 45 52 4f 5f 50 41 44 44 49 4e 47 29 20 29 7b  ZERO_PADDING) ){
17a40 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 42 75  .    memset(&pBu
17a50 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 70 53 65  f->p[pBuf->n+pSe
17a60 67 2d 3e 6e 50 6f 73 5d 2c 20 30 2c 20 46 54 53  g->nPos], 0, FTS
17a70 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
17a80 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ING);.    if( pC
17a90 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  olset==0 ){.    
17aa0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61    fts5ChunkItera
17ab0 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69  te(p, pSeg, (voi
17ac0 64 2a 29 70 42 75 66 2c 20 66 74 73 35 50 6f 73  d*)pBuf, fts5Pos
17ad0 6c 69 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  listCallback);. 
17ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17af0 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  if( p->pConfig->
17b00 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
17b10 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  TAIL_FULL ){.   
17b20 20 20 20 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c       PoslistCall
17b30 62 61 63 6b 43 74 78 20 73 43 74 78 3b 0a 20 20  backCtx sCtx;.  
17b40 20 20 20 20 20 20 73 43 74 78 2e 70 42 75 66 20        sCtx.pBuf 
17b50 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20  = pBuf;.        
17b60 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70  sCtx.pColset = p
17b70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Colset;.        
17b80 73 43 74 78 2e 65 53 74 61 74 65 20 3d 20 66 74  sCtx.eState = ft
17b90 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
17ba0 74 28 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20  t(pColset, 0);. 
17bb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
17bc0 43 74 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c  Ctx.eState==0 ||
17bd0 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 31 20   sCtx.eState==1 
17be0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43  );.        fts5C
17bf0 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70  hunkIterate(p, p
17c00 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74  Seg, (void*)&sCt
17c10 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69  x, fts5PoslistFi
17c20 6c 74 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  lterCallback);. 
17c30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17c40 20 20 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65      PoslistOffse
17c50 74 73 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20  tsCtx sCtx;.    
17c60 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78      memset(&sCtx
17c70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78  , 0, sizeof(sCtx
17c80 29 29 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78  ));.        sCtx
17c90 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20  .pBuf = pBuf;.  
17ca0 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73        sCtx.pCols
17cb0 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20  et = pColset;.  
17cc0 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
17cd0 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
17ce0 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74  (void*)&sCtx, ft
17cf0 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73  s5PoslistOffsets
17d00 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Callback);.     
17d10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
17d20 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72  /*.** IN/OUT par
17d30 61 6d 65 74 65 72 20 28 2a 70 61 29 20 70 6f 69  ameter (*pa) poi
17d40 6e 74 73 20 74 6f 20 61 20 70 6f 73 69 74 69 6f  nts to a positio
17d50 6e 20 6c 69 73 74 20 6e 20 62 79 74 65 73 20 69  n list n bytes i
17d60 6e 20 73 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68  n size. If.** th
17d70 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
17d80 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
17d90 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c   for column iCol
17da0 2c 20 74 68 65 6e 20 28 2a 70 61 29 20 69 73 20  , then (*pa) is 
17db0 73 65 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20  set.** to point 
17dc0 74 6f 20 74 68 65 20 73 75 62 2d 70 6f 73 69 74  to the sub-posit
17dd0 69 6f 6e 2d 6c 69 73 74 20 66 6f 72 20 74 68 61  ion-list for tha
17de0 74 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65  t column and the
17df0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79   number of.** by
17e00 74 65 73 20 69 6e 20 69 74 20 72 65 74 75 72 6e  tes in it return
17e10 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 61  ed. Or, if the a
17e20 72 67 75 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e  rgument position
17e30 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a   list does not.*
17e40 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e  * contain any en
17e50 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e  tries for column
17e60 20 69 43 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e   iCol, return 0.
17e70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
17e80 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
17e90 6f 6c 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ol(.  const u8 *
17ea0 2a 70 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pa,            
17eb0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
17ec0 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c   Pointer to posl
17ed0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ist */.  int n, 
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20           /* IN: 
17f00 53 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74 20  Size of poslist 
17f10 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
17f20 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f40 20 43 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61   Column to extra
17f50 63 74 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20  ct from poslist 
17f60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72  */.){.  int iCur
17f70 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
17f80 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 74 68          /* Anyth
17f90 69 6e 67 20 62 65 66 6f 72 65 20 74 68 65 20 66  ing before the f
17fa0 69 72 73 74 20 30 78 30 31 20 69 73 20 63 6f 6c  irst 0x01 is col
17fb0 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38   0 */.  const u8
17fc0 20 2a 70 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e   *p = *pa;.  con
17fd0 73 74 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70  st u8 *pEnd = &p
17fe0 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  [n];         /* 
17ff0 4f 6e 65 20 62 79 74 65 20 70 61 73 74 20 65 6e  One byte past en
18000 64 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69  d of position li
18010 73 74 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20  st */..  while( 
18020 69 43 6f 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b  iCol>iCurrent ){
18030 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
18040 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20  pointer p until 
18050 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e  it points to pEn
18060 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74  d or an 0x01 byt
18070 65 20 74 68 61 74 20 69 73 0a 20 20 20 20 2a 2a  e that is.    **
18080 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76   not part of a v
18090 61 72 69 6e 74 2e 20 4e 6f 74 65 20 74 68 61 74  arint. Note that
180a0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
180b0 62 6c 65 20 66 6f 72 20 61 20 6e 65 67 61 74 69  ble for a negati
180c0 76 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65 78 74  ve.    ** or ext
180d0 72 65 6d 65 6c 79 20 6c 61 72 67 65 20 76 61 72  remely large var
180e0 69 6e 74 20 74 6f 20 6f 63 63 75 72 20 77 69 74  int to occur wit
180f0 68 69 6e 20 61 6e 20 75 6e 63 6f 72 72 75 70 74  hin an uncorrupt
18100 65 64 20 70 6f 73 69 74 69 6f 6e 20 0a 20 20 20  ed position .   
18110 20 2a 2a 20 6c 69 73 74 2e 20 53 6f 20 74 68 65   ** list. So the
18120 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65 61   last byte of ea
18130 63 68 20 76 61 72 69 6e 74 20 6d 61 79 20 62 65  ch varint may be
18140 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65   assumed to have
18150 20 61 20 63 6c 65 61 72 0a 20 20 20 20 2a 2a 20   a clear.    ** 
18160 30 78 38 30 20 62 69 74 2e 20 20 2a 2f 0a 20 20  0x80 bit.  */.  
18170 20 20 77 68 69 6c 65 28 20 2a 70 21 3d 30 78 30    while( *p!=0x0
18180 31 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  1 ){.      while
18190 28 20 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b  ( *p++ & 0x80 );
181a0 0a 20 20 20 20 20 20 69 66 28 20 70 3e 3d 70 45  .      if( p>=pE
181b0 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  nd ) return 0;. 
181c0 20 20 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70     }.    *pa = p
181d0 2b 2b 3b 0a 20 20 20 20 69 43 75 72 72 65 6e 74  ++;.    iCurrent
181e0 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 69 66 28   = *p++;.    if(
181f0 20 69 43 75 72 72 65 6e 74 20 26 20 30 78 38 30   iCurrent & 0x80
18200 20 29 7b 0a 20 20 20 20 20 20 70 2d 2d 3b 0a 20   ){.      p--;. 
18210 20 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65       p += fts5Ge
18220 74 56 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75  tVarint32(p, iCu
18230 72 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rrent);.    }.  
18240 7d 0a 20 20 69 66 28 20 69 43 6f 6c 21 3d 69 43  }.  if( iCol!=iC
18250 75 72 72 65 6e 74 20 29 20 72 65 74 75 72 6e 20  urrent ) return 
18260 30 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  0;..  /* Advance
18270 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c   pointer p until
18280 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45   it points to pE
18290 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79  nd or an 0x01 by
182a0 74 65 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  te that is.  ** 
182b0 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76 61  not part of a va
182c0 72 69 6e 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28  rint */.  while(
182d0 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 21 3d 30   p<pEnd && *p!=0
182e0 78 30 31 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  x01 ){.    while
182f0 28 20 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b  ( *p++ & 0x80 );
18300 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
18310 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61   - (*pa);.}..sta
18320 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
18330 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28  exExtractColset(
18340 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46  .  int *pRc,.  F
18350 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
18360 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  et,            /
18370 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74  * Colset to filt
18380 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  er on */.  const
18390 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e   u8 *pPos, int n
183a0 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f  Pos,       /* Po
183b0 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
183c0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
183d0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
183e0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
183f0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70  r */.){.  if( *p
18400 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
18410 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18420 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70  fts5BufferZero(p
18430 42 75 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Buf);.    for(i=
18440 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43  0; i<pColset->nC
18450 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
18460 63 6f 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d  const u8 *pSub =
18470 20 70 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74   pPos;.      int
18480 20 6e 53 75 62 20 3d 20 66 74 73 35 49 6e 64 65   nSub = fts5Inde
18490 78 45 78 74 72 61 63 74 43 6f 6c 28 26 70 53 75  xExtractCol(&pSu
184a0 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74  b, nPos, pColset
184b0 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  ->aiCol[i]);.   
184c0 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b 0a 20     if( nSub ){. 
184d0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
184e0 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c  rAppendBlob(pRc,
184f0 20 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75   pBuf, nSub, pSu
18500 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
18510 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  }.  }.}../*.** x
18520 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
18530 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
18540 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a  il=none tables..
18550 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18560 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18570 73 5f 4e 6f 6e 65 28 46 74 73 35 49 74 65 72 20  s_None(Fts5Iter 
18580 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
18590 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 61 73  ter *pSeg){.  as
185a0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
185b0 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  dex->pConfig->eD
185c0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
185d0 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74  IL_NONE );.  pIt
185e0 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
185f0 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
18600 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
18610 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  ata = pSeg->nPos
18620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f  ;.}../*.** xSetO
18630 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20  utputs callback 
18640 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66  used by detail=f
18650 75 6c 6c 20 61 6e 64 20 64 65 74 61 69 6c 3d 63  ull and detail=c
18660 6f 6c 20 74 61 62 6c 65 73 20 77 68 65 6e 20 6e  ol tables when n
18670 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74  o.** column filt
18680 65 72 73 20 61 72 65 20 73 70 65 63 69 66 69 65  ers are specifie
18690 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
186a0 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
186b0 70 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74  puts_Nocolset(Ft
186c0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  s5Iter *pIter, F
186d0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
186e0 29 7b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  ){.  pIter->base
186f0 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
18700 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d  iRowid;.  pIter-
18710 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53  >base.nData = pS
18720 65 67 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73  eg->nPos;..  ass
18730 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
18740 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  ex->pConfig->eDe
18750 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
18760 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  L_NONE );.  asse
18770 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73  rt( pIter->pCols
18780 65 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  et==0 );..  if( 
18790 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
187a0 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53  t+pSeg->nPos<=pS
187b0 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  eg->pLeaf->szLea
187c0 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  f ){.    /* All 
187d0 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f  data is stored o
187e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
187f0 67 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ge. Populate the
18800 20 6f 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20   output .    ** 
18810 76 61 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69  variables to poi
18820 6e 74 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  nt into the body
18830 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a   of the page obj
18840 65 63 74 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65  ect. */.    pIte
18850 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
18860 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
18870 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
18880 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
18890 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20   /* The data is 
188a0 64 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72  distributed over
188b0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67   two or more pag
188c0 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f  es. Copy it into
188d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35   the.    ** Fts5
188e0 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66  Iter.poslist buf
188f0 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74  fer and then set
18900 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e   the output poin
18910 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20  ter to point.   
18920 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66   ** to this buff
18930 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35  er.  */.    fts5
18940 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
18950 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
18960 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
18970 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
18980 78 2c 20 70 53 65 67 2c 20 30 2c 20 26 70 49 74  x, pSeg, 0, &pIt
18990 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
189a0 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
189b0 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
189c0 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  list.p;.  }.}../
189d0 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73  *.** xSetOutputs
189e0 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77   callback used w
189f0 68 65 6e 20 74 68 65 20 46 74 73 35 43 6f 6c 73  hen the Fts5Cols
18a00 65 74 20 6f 62 6a 65 63 74 20 68 61 73 20 6e 43  et object has nC
18a10 6f 6c 3d 3d 30 20 28 6d 61 74 63 68 0a 2a 2a 20  ol==0 (match.** 
18a20 61 67 61 69 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d  against no colum
18a30 6e 73 20 61 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73  ns at all)..*/.s
18a40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
18a50 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 5a 65  terSetOutputs_Ze
18a60 72 6f 43 6f 6c 73 65 74 28 46 74 73 35 49 74 65  roColset(Fts5Ite
18a70 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65  r *pIter, Fts5Se
18a80 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20  gIter *pSeg){.  
18a90 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 53 65  UNUSED_PARAM(pSe
18aa0 67 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  g);.  pIter->bas
18ab0 65 2e 6e 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a  e.nData = 0;.}..
18ac0 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74  /*.** xSetOutput
18ad0 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  s callback used 
18ae0 62 79 20 64 65 74 61 69 6c 3d 63 6f 6c 20 77 68  by detail=col wh
18af0 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  en there is a co
18b00 6c 75 6d 6e 20 66 69 6c 74 65 72 0a 2a 2a 20 61  lumn filter.** a
18b10 6e 64 20 74 68 65 72 65 20 61 72 65 20 31 30 30  nd there are 100
18b20 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73   or more columns
18b30 2e 20 41 6c 73 6f 20 63 61 6c 6c 65 64 20 61 73  . Also called as
18b40 20 61 20 66 61 6c 6c 62 61 63 6b 20 66 72 6f 6d   a fallback from
18b50 0a 2a 2a 20 66 74 73 35 49 74 65 72 53 65 74 4f  .** fts5IterSetO
18b60 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 20 69 66  utputs_Col100 if
18b70 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74   the column-list
18b80 20 73 70 61 6e 73 20 6d 6f 72 65 20 74 68 61 6e   spans more than
18b90 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   one page..*/.st
18ba0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
18bb0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c  erSetOutputs_Col
18bc0 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
18bd0 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
18be0 53 65 67 29 7b 0a 20 20 66 74 73 35 42 75 66 66  Seg){.  fts5Buff
18bf0 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
18c00 6f 73 6c 69 73 74 29 3b 0a 20 20 66 74 73 35 53  oslist);.  fts5S
18c10 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49  egiterPoslist(pI
18c20 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65  ter->pIndex, pSe
18c30 67 2c 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65  g, pIter->pColse
18c40 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  t, &pIter->posli
18c50 73 74 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  st);.  pIter->ba
18c60 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67  se.iRowid = pSeg
18c70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65  ->iRowid;.  pIte
18c80 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
18c90 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
18ca0 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
18cb0 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  nData = pIter->p
18cc0 6f 73 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a  oslist.n;.}../*.
18cd0 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
18ce0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65  allback used whe
18cf0 6e 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65  n: .**.**   * de
18d00 74 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a  tail=col,.**   *
18d10 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75   there is a colu
18d20 6d 6e 20 66 69 6c 74 65 72 2c 20 61 6e 64 0a 2a  mn filter, and.*
18d30 2a 20 20 20 2a 20 74 68 65 20 74 61 62 6c 65 20  *   * the table 
18d40 63 6f 6e 74 61 69 6e 73 20 31 30 30 20 6f 72 20  contains 100 or 
18d50 66 65 77 65 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a  fewer columns. .
18d60 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 70  **.** The last p
18d70 6f 69 6e 74 20 69 73 20 74 6f 20 65 6e 73 75 72  oint is to ensur
18d80 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d  e all column num
18d90 62 65 72 73 20 61 72 65 20 73 74 6f 72 65 64 20  bers are stored 
18da0 61 73 20 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79  as .** single-by
18db0 74 65 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73  te varints..*/.s
18dc0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
18dd0 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
18de0 6c 31 30 30 28 46 74 73 35 49 74 65 72 20 2a 70  l100(Fts5Iter *p
18df0 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
18e00 72 20 2a 70 53 65 67 29 7b 0a 0a 20 20 61 73 73  r *pSeg){..  ass
18e10 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
18e20 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  ex->pConfig->eDe
18e30 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
18e40 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 61  L_COLUMNS );.  a
18e50 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43  ssert( pIter->pC
18e60 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20  olset );..  if( 
18e70 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
18e80 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3e 70 53 65  t+pSeg->nPos>pSe
18e90 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  g->pLeaf->szLeaf
18ea0 20 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72   ){.    fts5Iter
18eb0 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 70  SetOutputs_Col(p
18ec0 49 74 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 7d  Iter, pSeg);.  }
18ed0 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20  else{.    u8 *a 
18ee0 3d 20 28 75 38 2a 29 26 70 53 65 67 2d 3e 70 4c  = (u8*)&pSeg->pL
18ef0 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65  eaf->p[pSeg->iLe
18f00 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 75  afOffset];.    u
18f10 38 20 2a 70 45 6e 64 20 3d 20 28 75 38 2a 29 26  8 *pEnd = (u8*)&
18f20 61 5b 70 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a  a[pSeg->nPos]; .
18f30 20 20 20 20 69 6e 74 20 69 50 72 65 76 20 3d 20      int iPrev = 
18f40 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f  0;.    int *aiCo
18f50 6c 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73  l = pIter->pCols
18f60 65 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69  et->aiCol;.    i
18f70 6e 74 20 2a 61 69 43 6f 6c 45 6e 64 20 3d 20 26  nt *aiColEnd = &
18f80 61 69 43 6f 6c 5b 70 49 74 65 72 2d 3e 70 43 6f  aiCol[pIter->pCo
18f90 6c 73 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20  lset->nCol];..  
18fa0 20 20 75 38 20 2a 61 4f 75 74 20 3d 20 70 49 74    u8 *aOut = pIt
18fb0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
18fc0 20 20 20 69 6e 74 20 69 50 72 65 76 4f 75 74 20     int iPrevOut 
18fd0 3d 20 30 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d  = 0;..    pIter-
18fe0 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
18ff0 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20  Seg->iRowid;..  
19000 20 20 77 68 69 6c 65 28 20 61 3c 70 45 6e 64 20    while( a<pEnd 
19010 29 7b 0a 20 20 20 20 20 20 69 50 72 65 76 20 2b  ){.      iPrev +
19020 3d 20 28 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20  = (int)a++[0] - 
19030 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
19040 2a 61 69 43 6f 6c 3c 69 50 72 65 76 20 29 7b 0a  *aiCol<iPrev ){.
19050 20 20 20 20 20 20 20 20 61 69 43 6f 6c 2b 2b 3b          aiCol++;
19060 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 69 43  .        if( aiC
19070 6f 6c 3d 3d 61 69 43 6f 6c 45 6e 64 20 29 20 67  ol==aiColEnd ) g
19080 6f 74 6f 20 73 65 74 6f 75 74 70 75 74 73 5f 63  oto setoutputs_c
19090 6f 6c 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ol_out;.      }.
190a0 20 20 20 20 20 20 69 66 28 20 2a 61 69 43 6f 6c        if( *aiCol
190b0 3d 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ==iPrev ){.     
190c0 20 20 20 2a 61 4f 75 74 2b 2b 20 3d 20 28 75 38     *aOut++ = (u8
190d0 29 28 28 69 50 72 65 76 20 2d 20 69 50 72 65 76  )((iPrev - iPrev
190e0 4f 75 74 29 20 2b 20 32 29 3b 0a 20 20 20 20 20  Out) + 2);.     
190f0 20 20 20 69 50 72 65 76 4f 75 74 20 3d 20 69 50     iPrevOut = iP
19100 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
19110 20 7d 0a 0a 73 65 74 6f 75 74 70 75 74 73 5f 63   }..setoutputs_c
19120 6f 6c 5f 6f 75 74 3a 0a 20 20 20 20 70 49 74 65  ol_out:.    pIte
19130 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
19140 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
19150 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ;.    pIter->bas
19160 65 2e 6e 44 61 74 61 20 3d 20 61 4f 75 74 20 2d  e.nData = aOut -
19170 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
19180 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
19190 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c  xSetOutputs call
191a0 62 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74  back used by det
191b0 61 69 6c 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68  ail=full when th
191c0 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ere is a column 
191d0 66 69 6c 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  filter..*/.stati
191e0 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
191f0 65 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 28 46  etOutputs_Full(F
19200 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
19210 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
19220 67 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74  g){.  Fts5Colset
19230 20 2a 70 43 6f 6c 73 65 74 20 3d 20 70 49 74 65   *pColset = pIte
19240 72 2d 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49  r->pColset;.  pI
19250 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64  ter->base.iRowid
19260 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
19270 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
19280 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66  r->pIndex->pConf
19290 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
192a0 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b  5_DETAIL_FULL );
192b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 73  .  assert( pCols
192c0 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65  et );..  if( pSe
192d0 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
192e0 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d  Seg->nPos<=pSeg-
192f0 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
19300 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74  {.    /* All dat
19310 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74  a is stored on t
19320 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
19330 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75   Populate the ou
19340 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72  tput .    ** var
19350 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20  iables to point 
19360 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
19370 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
19380 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75  . */.    const u
19390 38 20 2a 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c  8 *a = &pSeg->pL
193a0 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65  eaf->p[pSeg->iLe
193b0 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69  afOffset];.    i
193c0 66 28 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c  f( pColset->nCol
193d0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ==1 ){.      pIt
193e0 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
193f0 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
19400 74 43 6f 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e  tCol(&a, pSeg->n
19410 50 6f 73 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43  Pos,pColset->aiC
19420 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 49  ol[0]);.      pI
19430 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20  ter->base.pData 
19440 3d 20 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = a;.    }else{.
19450 20 20 20 20 20 20 69 6e 74 20 2a 70 52 63 20 3d        int *pRc =
19460 20 26 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d   &pIter->pIndex-
19470 3e 72 63 3b 0a 20 20 20 20 20 20 66 74 73 35 42  >rc;.      fts5B
19480 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
19490 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
194a0 20 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61    fts5IndexExtra
194b0 63 74 43 6f 6c 73 65 74 28 70 52 63 2c 20 70 43  ctColset(pRc, pC
194c0 6f 6c 73 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e  olset, a, pSeg->
194d0 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f  nPos, &pIter->po
194e0 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 49  slist);.      pI
194f0 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20  ter->base.pData 
19500 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
19510 2e 70 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  .p;.      pIter-
19520 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49  >base.nData = pI
19530 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a  ter->poslist.n;.
19540 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
19550 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69     /* The data i
19560 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f 76  s distributed ov
19570 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70  er two or more p
19580 61 67 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e  ages. Copy it in
19590 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74  to the.    ** Ft
195a0 73 35 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62  s5Iter.poslist b
195b0 75 66 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73  uffer and then s
195c0 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f  et the output po
195d0 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20  inter to point. 
195e0 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75     ** to this bu
195f0 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74  ffer.  */.    ft
19600 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49  s5BufferZero(&pI
19610 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
19620 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f     fts5SegiterPo
19630 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e  slist(pIter->pIn
19640 64 65 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73  dex, pSeg, pCols
19650 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c  et, &pIter->posl
19660 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  ist);.    pIter-
19670 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
19680 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
19690 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
196a0 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  nData = pIter->p
196b0 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a  oslist.n;.  }.}.
196c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
196d0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62  5IterSetOutputCb
196e0 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 49  (int *pRc, Fts5I
196f0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
19700 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
19710 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  OK ){.    Fts5Co
19720 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
19730 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
19740 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69 66 28 20  Config;.    if( 
19750 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
19760 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
19770 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  NE ){.      pIte
19780 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
19790 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
197a0 75 74 73 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a  uts_None;.    }.
197b0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 49  .    else if( pI
197c0 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20  ter->pColset==0 
197d0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
197e0 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
197f0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
19800 5f 4e 6f 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d  _Nocolset;.    }
19810 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  ..    else if( p
19820 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e  Iter->pColset->n
19830 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
19840 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75  pIter->xSetOutpu
19850 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74  ts = fts5IterSet
19860 4f 75 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73  Outputs_ZeroCols
19870 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65  et;.    }..    e
19880 6c 73 65 20 69 66 28 20 70 43 6f 6e 66 69 67 2d  lse if( pConfig-
19890 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
198a0 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20  ETAIL_FULL ){.  
198b0 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f      pIter->xSetO
198c0 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
198d0 72 53 65 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c  rSetOutputs_Full
198e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73  ;.    }..    els
198f0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
19900 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69   pConfig->eDetai
19910 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43  l==FTS5_DETAIL_C
19920 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 20 20 20 20  OLUMNS );.      
19930 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  if( pConfig->nCo
19940 6c 3c 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20  l<=100 ){.      
19950 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74    pIter->xSetOut
19960 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
19970 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30  etOutputs_Col100
19980 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19990 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
199a0 70 52 63 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  pRc, &pIter->pos
199b0 6c 69 73 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e  list, pConfig->n
199c0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Col);.      }els
199d0 65 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  e{.        pIter
199e0 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
199f0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
19a00 74 73 5f 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  ts_Col;.      }.
19a10 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
19a20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
19a30 65 77 20 46 74 73 35 49 74 65 72 20 6f 62 6a 65  ew Fts5Iter obje
19a40 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ct..**.** The ne
19a50 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  w object will be
19a60 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
19a70 20 74 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e   through data in
19a80 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
19a90 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c  ct..** If iLevel
19aa0 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c   is -ve, then al
19ab0 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65  l data in all se
19ac0 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64  gments is merged
19ad0 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a  . Or, if iLevel.
19ae0 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72  ** is zero or gr
19af0 65 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d  eater, data from
19b00 20 74 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d   the first nSegm
19b10 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20  ent segments on 
19b20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20  level iLevel.** 
19b30 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a  is merged..**.**
19b40 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e   The iterator in
19b50 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  itially points t
19b60 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  o the first term
19b70 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20  /rowid entry in 
19b80 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64  the .** iterated
19b90 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
19ba0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
19bb0 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e  terNew(.  Fts5In
19bc0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
19bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
19be0 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
19bf0 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
19c00 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
19c10 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20  pStruct,        
19c20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66   /* Structure of
19c30 20 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20   specific index 
19c40 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c60 20 20 20 20 20 2f 2a 20 46 54 53 35 49 4e 44 45       /* FTS5INDE
19c70 58 5f 51 55 45 52 59 5f 58 58 58 20 66 6c 61 67  X_QUERY_XXX flag
19c80 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65  s */.  Fts5Colse
19c90 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20  t *pColset,     
19ca0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74         /* Colset
19cb0 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 28 6f   to filter on (o
19cc0 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e  r NULL) */.  con
19cd0 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
19ce0 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
19cf0 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
19d00 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20  (or NULL/0) */. 
19d10 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65   /* Level to ite
19d40 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c  rate (-1 for all
19d50 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  ) */.  int nSegm
19d60 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
19d70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19d80 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
19d90 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30  merge (iLevel>=0
19da0 29 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20  ) */.  Fts5Iter 
19db0 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20  **ppOut         
19dc0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
19dd0 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
19de0 20 6e 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20   nSeg = 0;      
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e00 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
19e10 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a  t-iters in use *
19e20 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20  /.  int iIter = 
19e30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19e40 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20      /* */.  int 
19e50 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
19e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
19e70 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
19e80 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
19e90 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
19ea0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
19eb0 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b   Fts5Iter *pNew;
19ec0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  ..  assert( (pTe
19ed0 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d  rm==0 && nTerm==
19ee0 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29  0) || iLevel<0 )
19ef0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
19f00 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
19f10 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65  ew multi-seg-ite
19f20 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20  rator. */.  if( 
19f30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19f40 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76   ){.    if( iLev
19f50 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73  el<0 ){.      as
19f60 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
19f70 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72  Segment==fts5Str
19f80 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
19f90 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a  nts(pStruct) );.
19fa0 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74        nSeg = pSt
19fb0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a  ruct->nSegment;.
19fc0 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70        nSeg += (p
19fd0 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29  ->pHash ? 1 : 0)
19fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19ff0 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53     nSeg = MIN(pS
1a000 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1a010 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67  evel].nSeg, nSeg
1a020 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ment);.    }.  }
1a030 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77  .  *ppOut = pNew
1a040 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1a050 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a  Alloc(p, nSeg);.
1a060 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
1a070 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e  return;.  pNew->
1a080 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67  bRev = (0!=(flag
1a090 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
1a0a0 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e  ERY_DESC));.  pN
1a0b0 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d  ew->bSkipEmpty =
1a0c0 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54   (0!=(flags & FT
1a0d0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b  S5INDEX_QUERY_SK
1a0e0 49 50 45 4d 50 54 59 29 29 3b 0a 20 20 70 4e 65  IPEMPTY));.  pNe
1a0f0 77 2d 3e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f  w->pColset = pCo
1a100 6c 73 65 74 3b 0a 20 20 69 66 28 20 28 66 6c 61  lset;.  if( (fla
1a110 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
1a120 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 29 3d 3d  UERY_NOOUTPUT)==
1a130 30 20 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65  0 ){.    fts5Ite
1a140 72 53 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d  rSetOutputCb(&p-
1a150 3e 72 63 2c 20 70 4e 65 77 29 3b 0a 20 20 7d 0a  >rc, pNew);.  }.
1a160 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1a170 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d   each of the com
1a180 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69  ponent segment i
1a190 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69  terators. */.  i
1a1a0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a1b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69  _OK ){.    if( i
1a1c0 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20  Level<0 ){.     
1a1d0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
1a1e0 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74  vel *pEnd = &pSt
1a1f0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  ruct->aLevel[pSt
1a200 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
1a210 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73       if( p->pHas
1a220 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  h ){.        /* 
1a230 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74  Add a segment it
1a240 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63  erator for the c
1a250 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
1a260 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  of the hash tabl
1a270 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 46 74  e. */.        Ft
1a280 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
1a290 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
1a2a0 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  Iter++];.       
1a2b0 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68   fts5SegIterHash
1a2c0 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e  Init(p, pTerm, n
1a2d0 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74  Term, flags, pIt
1a2e0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
1a2f0 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74     for(pLvl=&pSt
1a300 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b  ruct->aLevel[0];
1a310 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c   pLvl<pEnd; pLvl
1a320 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
1a330 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67  (iSeg=pLvl->nSeg
1a340 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65  -1; iSeg>=0; iSe
1a350 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g--){.          
1a360 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1a370 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
1a380 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
1a390 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53 65            Fts5Se
1a3a0 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26  gIter *pIter = &
1a3b0 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72  pNew->aSeg[iIter
1a3c0 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ++];.          i
1a3d0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
1a3e0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
1a3f0 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53  egIterInit(p, pS
1a400 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
1a410 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a420 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
1a430 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20  IterSeekInit(p, 
1a440 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c  pTerm, nTerm, fl
1a450 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72  ags, pSeg, pIter
1a460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1a470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a480 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a490 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
1a4a0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
1a4b0 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ];.      for(iSe
1a4c0 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  g=nSeg-1; iSeg>=
1a4d0 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
1a4e0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
1a4f0 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53  nit(p, &pLvl->aS
1a500 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d  eg[iSeg], &pNew-
1a510 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b  >aSeg[iIter++]);
1a520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a530 20 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72     assert( iIter
1a540 3d 3d 6e 53 65 67 20 29 3b 0a 20 20 7d 0a 0a 20  ==nSeg );.  }.. 
1a550 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
1a560 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
1a570 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1a580 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f  iterators now po
1a590 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68  ints .  ** to th
1a5a0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
1a5b0 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e   its segment. In
1a5c0 20 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69   this case initi
1a5d0 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20  alize the .  ** 
1a5e0 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20  aFirst[] array. 
1a5f0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1a600 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72  has occurred, fr
1a610 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  ee the iterator.
1a620 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20    ** object and 
1a630 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  set the output v
1a640 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e  ariable to NULL.
1a650 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
1a660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a670 20 20 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65     for(iIter=pNe
1a680 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72  w->nSeg-1; iIter
1a690 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20  >0; iIter--){.  
1a6a0 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20      int iEq;.   
1a6b0 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
1a6c0 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
1a6d0 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72  pare(pNew, iIter
1a6e0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74  )) ){.        Ft
1a6f0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
1a700 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45  = &pNew->aSeg[iE
1a710 71 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  q];.        if( 
1a720 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a730 20 29 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70   ) pSeg->xNext(p
1a740 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20  , pSeg, 0);.    
1a750 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1a760 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65  rAdvanced(p, pNe
1a770 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a  w, iEq, iIter);.
1a780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a790 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53    fts5MultiIterS
1a7a0 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20  etEof(pNew);.   
1a7b0 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
1a7c0 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65  IterSetup(p, pNe
1a7d0 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  w);..    if( pNe
1a7e0 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26  w->bSkipEmpty &&
1a7f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
1a800 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29  Empty(p, pNew) )
1a810 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  {.      fts5Mult
1a820 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65  iIterNext(p, pNe
1a830 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  w, 0, 0);.    }e
1a840 6c 73 65 20 69 66 28 20 70 4e 65 77 2d 3e 62 61  lse if( pNew->ba
1a850 73 65 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  se.bEof==0 ){.  
1a860 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1a870 2a 70 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61  *pSeg = &pNew->a
1a880 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69 72 73 74  Seg[pNew->aFirst
1a890 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20  [1].iFirst];.   
1a8a0 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74     pNew->xSetOut
1a8b0 70 75 74 73 28 70 4e 65 77 2c 20 70 53 65 67 29  puts(pNew, pSeg)
1a8c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
1a8d0 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  {.    fts5MultiI
1a8e0 74 65 72 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  terFree(pNew);. 
1a8f0 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20     *ppOut = 0;. 
1a900 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
1a910 74 65 20 61 6e 20 46 74 73 35 49 74 65 72 20 74  te an Fts5Iter t
1a920 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68 72  hat iterates thr
1a930 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74  ough the doclist
1a940 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20   provided.** as 
1a950 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1a960 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
1a970 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
1a980 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64  rNew2(.  Fts5Ind
1a990 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1a9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1a9b0 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
1a9c0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
1a9d0 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c  Fts5Data *pData,
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74  /* Doclist to it
1aa00 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
1aa10 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20  .  int bDesc,   
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64     /* True for d
1aa40 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
1aa50 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49  order */.  Fts5I
1aa60 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
1aa70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1aa80 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  w object */.){. 
1aa90 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b   Fts5Iter *pNew;
1aaa0 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75  .  pNew = fts5Mu
1aab0 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20  ltiIterAlloc(p, 
1aac0 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  2);.  if( pNew )
1aad0 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1aae0 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77  r *pIter = &pNew
1aaf0 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20  ->aSeg[1];..    
1ab00 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46  pIter->flags = F
1ab10 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
1ab20 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61  ERM;.    if( pDa
1ab30 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a  ta->szLeaf>0 ){.
1ab40 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
1ab50 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  af = pData;.    
1ab60 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
1ab70 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
1ab80 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28  rint(pData->p, (
1ab90 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
1aba0 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65  wid);.      pIte
1abb0 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
1abc0 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20   = pData->nn;.  
1abd0 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
1abe0 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a  [1].iFirst = 1;.
1abf0 20 20 20 20 20 20 69 66 28 20 62 44 65 73 63 20        if( bDesc 
1ac00 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
1ac10 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20  >bRev = 1;.     
1ac20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
1ac30 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
1ac40 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20  REVERSE;.       
1ac50 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
1ac60 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
1ac70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
1ac80 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
1ac90 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
1aca0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
1acb0 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d   }.      pData =
1acc0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1acd0 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e       pNew->base.
1ace0 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
1acf0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53      fts5SegIterS
1ad00 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
1ad10 3b 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  ;..    *ppOut = 
1ad20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  pNew;.  }..  fts
1ad30 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
1ad40 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ta);.}../*.** Re
1ad50 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1ad60 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20   iterator is at 
1ad70 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72  EOF or if an err
1ad80 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
1ad90 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72   .** False other
1ada0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1adb0 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
1adc0 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
1add0 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  p, Fts5Iter *pIt
1ade0 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
1adf0 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28  ->rc .      || (
1ae00 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
1ae10 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
1ae20 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29  irst ].pLeaf==0)
1ae30 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45  ==pIter->base.bE
1ae40 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  of .  );.  retur
1ae50 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65  n (p->rc || pIte
1ae60 72 2d 3e 62 61 73 65 2e 62 45 6f 66 29 3b 0a 7d  r->base.bEof);.}
1ae70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ae80 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
1ae90 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69  entry that the i
1aea0 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c  terator currentl
1aeb0 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20  y points.** to. 
1aec0 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
1aed0 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68  points to EOF wh
1aee0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1aef0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a   is called the.*
1af00 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  * results are un
1af10 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
1af20 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69  ic i64 fts5Multi
1af30 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 74  IterRowid(Fts5It
1af40 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
1af50 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65  sert( pIter->aSe
1af60 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1af70 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65  [1].iFirst ].pLe
1af80 61 66 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  af );.  return p
1af90 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1afa0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1afb0 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a  rst ].iRowid;.}.
1afc0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1afd0 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
1afe0 6e 65 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72  next entry at or
1aff0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63   following iMatc
1b000 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
1b010 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
1b020 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49  extFrom(.  Fts5I
1b030 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1b040 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
1b050 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20  i64 iMatch.){.  
1b060 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
1b070 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
1b080 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
1b090 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69  t(p, pIter, 1, i
1b0a0 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20  Match);.    if( 
1b0b0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1b0c0 28 70 2c 20 70 49 74 65 72 29 20 29 20 62 72 65  (p, pIter) ) bre
1b0d0 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d  ak;.    iRowid =
1b0e0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
1b0f0 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20  wid(pIter);.    
1b100 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d  if( pIter->bRev=
1b110 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d  =0 && iRowid>=iM
1b120 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
1b130 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65    if( pIter->bRe
1b140 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d  v!=0 && iRowid<=
1b150 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
1b160 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1b170 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1b180 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1b190 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73  ning the term as
1b1a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1b1b0 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74  e .** entry that
1b1c0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75   the iterator cu
1b1d0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1b1e0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  o..*/.static con
1b1f0 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69  st u8 *fts5Multi
1b200 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 74 65  IterTerm(Fts5Ite
1b210 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70  r *pIter, int *p
1b220 6e 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  n){.  Fts5SegIte
1b230 72 20 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61  r *p = &pIter->a
1b240 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1b250 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
1b260 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e    *pn = p->term.
1b270 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74  n;.  return p->t
1b280 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erm.p;.}../*.** 
1b290 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
1b2a0 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68  egment-id for th
1b2b0 65 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  e structure pStr
1b2c0 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67  uct. The new seg
1b2d0 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20  ment.** id must 
1b2e0 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
1b2f0 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69 76 65   65335 inclusive
1b300 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62  , and must not b
1b310 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e  e used by .** an
1b320 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  y currently exis
1b330 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49 66  ting segment. If
1b340 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e 74 20   a free segment 
1b350 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  id cannot be fou
1b360 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  nd,.** SQLITE_FU
1b370 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1b380 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1b390 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
1b3a0 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
1b3b0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1b3c0 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  . 0 is .** retur
1b3d0 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
1b3e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b3f0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
1b400 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
1b410 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1b420 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69  Struct){.  int i
1b430 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66  Segid = 0;..  if
1b440 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b450 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  OK ){.    if( pS
1b460 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e  truct->nSegment>
1b470 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e  =FTS5_MAX_SEGMEN
1b480 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  T ){.      p->rc
1b490 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
1b4a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b4b0 20 2f 2a 20 46 54 53 35 5f 4d 41 58 5f 53 45 47   /* FTS5_MAX_SEG
1b4c0 4d 45 4e 54 20 69 73 20 63 75 72 72 65 6e 74 6c  MENT is currentl
1b4d0 79 20 64 65 66 69 6e 65 64 20 61 73 20 32 30 30  y defined as 200
1b4e0 30 2e 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  0. So the follow
1b4f0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 72 72  ing.      ** arr
1b500 61 79 20 69 73 20 36 33 20 65 6c 65 6d 65 6e 74  ay is 63 element
1b510 73 2c 20 6f 72 20 32 35 32 20 62 79 74 65 73 2c  s, or 252 bytes,
1b520 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20   in size.  */.  
1b530 20 20 20 20 75 33 32 20 61 55 73 65 64 5b 28 46      u32 aUsed[(F
1b540 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 2b  TS5_MAX_SEGMENT+
1b550 33 31 29 20 2f 20 33 32 5d 3b 0a 20 20 20 20 20  31) / 32];.     
1b560 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
1b570 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1b580 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20      u32 mask;.  
1b590 20 20 20 20 6d 65 6d 73 65 74 28 61 55 73 65 64      memset(aUsed
1b5a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 55 73 65  , 0, sizeof(aUse
1b5b0 64 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  d));.      for(i
1b5c0 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
1b5d0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
1b5e0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l++){.        fo
1b5f0 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
1b600 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1b610 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
1b620 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  +){.          in
1b630 74 20 69 49 64 20 3d 20 70 53 74 72 75 63 74 2d  t iId = pStruct-
1b640 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
1b650 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 3b  eg[iSeg].iSegid;
1b660 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1b670 49 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47  Id<=FTS5_MAX_SEG
1b680 4d 45 4e 54 20 26 26 20 69 49 64 3e 30 20 29 7b  MENT && iId>0 ){
1b690 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 55 73  .            aUs
1b6a0 65 64 5b 28 69 49 64 2d 31 29 20 2f 20 33 32 5d  ed[(iId-1) / 32]
1b6b0 20 7c 3d 20 28 75 33 32 29 31 20 3c 3c 20 28 28   |= (u32)1 << ((
1b6c0 69 49 64 2d 31 29 20 25 20 33 32 29 3b 0a 20 20  iId-1) % 32);.  
1b6d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b6e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b6f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 55 73 65     for(i=0; aUse
1b700 64 5b 69 5d 3d 3d 30 78 46 46 46 46 46 46 46 46  d[i]==0xFFFFFFFF
1b710 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 6d 61  ; i++);.      ma
1b720 73 6b 20 3d 20 61 55 73 65 64 5b 69 5d 3b 0a 20  sk = aUsed[i];. 
1b730 20 20 20 20 20 66 6f 72 28 69 53 65 67 69 64 3d       for(iSegid=
1b740 30 3b 20 6d 61 73 6b 20 26 20 28 28 75 33 32 29  0; mask & ((u32)
1b750 31 20 3c 3c 20 69 53 65 67 69 64 29 3b 20 69 53  1 << iSegid); iS
1b760 65 67 69 64 2b 2b 29 3b 0a 20 20 20 20 20 20 69  egid++);.      i
1b770 53 65 67 69 64 20 2b 3d 20 31 20 2b 20 69 2a 33  Segid += 1 + i*3
1b780 32 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  2;..#ifdef SQLIT
1b790 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 6f  E_DEBUG.      fo
1b7a0 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1b7b0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1b7c0 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1b7d0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
1b7e0 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
1b7f0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
1b800 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
1b810 20 61 73 73 65 72 74 5f 6e 63 28 20 69 53 65 67   assert_nc( iSeg
1b820 69 64 21 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65  id!=pStruct->aLe
1b830 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
1b840 53 65 67 5d 2e 69 53 65 67 69 64 20 29 3b 0a 20  Seg].iSegid );. 
1b850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b860 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
1b870 28 20 69 53 65 67 69 64 3e 30 20 26 26 20 69 53  ( iSegid>0 && iS
1b880 65 67 69 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53  egid<=FTS5_MAX_S
1b890 45 47 4d 45 4e 54 20 29 3b 0a 0a 20 20 20 20 20  EGMENT );..     
1b8a0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1b8b0 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 53 65 6c  e3_stmt *pIdxSel
1b8c0 65 63 74 20 3d 20 66 74 73 35 49 64 78 53 65 6c  ect = fts5IdxSel
1b8d0 65 63 74 53 74 6d 74 28 70 29 3b 0a 20 20 20 20  ectStmt(p);.    
1b8e0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1b8f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b900 20 20 20 20 20 20 75 38 20 61 42 6c 6f 62 5b 32        u8 aBlob[2
1b910 5d 20 3d 20 7b 30 78 66 66 2c 20 30 78 66 66 7d  ] = {0xff, 0xff}
1b920 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1b930 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64  te3_bind_int(pId
1b940 78 53 65 6c 65 63 74 2c 20 31 2c 20 69 53 65 67  xSelect, 1, iSeg
1b950 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  id);.          s
1b960 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
1b970 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20  (pIdxSelect, 2, 
1b980 61 42 6c 6f 62 2c 20 32 2c 20 53 51 4c 49 54 45  aBlob, 2, SQLITE
1b990 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1b9a0 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 73      assert_nc( s
1b9b0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 64 78  qlite3_step(pIdx
1b9c0 53 65 6c 65 63 74 29 21 3d 53 51 4c 49 54 45 5f  Select)!=SQLITE_
1b9d0 52 4f 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ROW );.         
1b9e0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1b9f0 5f 72 65 73 65 74 28 70 49 64 78 53 65 6c 65 63  _reset(pIdxSelec
1ba00 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
1ba10 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
1ba20 70 49 64 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a  pIdxSelect, 2);.
1ba30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ba40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1ba50 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 53 65   }..  return iSe
1ba60 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  gid;.}../*.** Di
1ba70 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63  scard all data c
1ba80 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
1ba90 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c  in the hash-tabl
1baa0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1bab0 69 64 20 66 74 73 35 49 6e 64 65 78 44 69 73 63  id fts5IndexDisc
1bac0 61 72 64 44 61 74 61 28 46 74 73 35 49 6e 64 65  ardData(Fts5Inde
1bad0 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  x *p){.  assert(
1bae0 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e   p->pHash || p->
1baf0 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
1bb00 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73  );.  if( p->pHas
1bb10 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
1bb20 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d  Fts5HashClear(p-
1bb30 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e  >pHash);.    p->
1bb40 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30  nPendingData = 0
1bb50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1bb60 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1bb70 66 20 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e  f the prefix, in
1bb80 20 62 79 74 65 73 2c 20 74 68 61 74 20 62 75 66   bytes, that buf
1bb90 66 65 72 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c  fer .** (pNew/<l
1bba0 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20  ength-unknown>) 
1bbb0 73 68 61 72 65 73 20 77 69 74 68 20 62 75 66 66  shares with buff
1bbc0 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a  er (pOld/nOld)..
1bbd0 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 4e  **.** Buffer (pN
1bbe0 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f  ew/<length-unkno
1bbf0 77 6e 3e 29 20 69 73 20 67 75 61 72 61 6e 74 65  wn>) is guarante
1bc00 65 64 20 74 6f 20 62 65 20 67 72 65 61 74 65 72  ed to be greater
1bc10 20 0a 2a 2a 20 74 68 61 6e 20 62 75 66 66 65 72   .** than buffer
1bc20 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f   (pOld/nOld)..*/
1bc30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1bc40 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 69  PrefixCompress(i
1bc50 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75  nt nOld, const u
1bc60 38 20 2a 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75  8 *pOld, const u
1bc70 38 20 2a 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20  8 *pNew){.  int 
1bc80 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1bc90 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
1bca0 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65  if( pOld[i]!=pNe
1bcb0 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  w[i] ) break;.  
1bcc0 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
1bcd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1bce0 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
1bcf0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1bd00 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
1bd10 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
1bd20 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20 20 20  nt bFlush       
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bd40 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69 74 65  * If true, write
1bd50 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b 20 2a   dlidx to disk *
1bd60 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1bd70 61 73 73 65 72 74 28 20 62 46 6c 75 73 68 3d 3d  assert( bFlush==
1bd80 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e  0 || (pWriter->n
1bd90 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74  Dlidx>0 && pWrit
1bda0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
1bdb0 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28  f.n>0) );.  for(
1bdc0 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
1bdd0 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20  nDlidx; i++){.  
1bde0 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
1bdf0 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72  r *pDlidx = &pWr
1be00 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
1be10 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
1be20 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61  >buf.n==0 ) brea
1be30 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c 75 73  k;.    if( bFlus
1be40 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
1be50 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21  t( pDlidx->pgno!
1be60 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  =0 );.      fts5
1be70 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20  DataWrite(p, .  
1be80 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
1be90 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  DX_ROWID(pWriter
1bea0 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c  ->iSegid, i, pDl
1beb0 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20  idx->pgno),.    
1bec0 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75        pDlidx->bu
1bed0 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66  f.p, pDlidx->buf
1bee0 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .n.      );.    
1bef0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
1bf00 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c  5BufferZero(&pDl
1bf10 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70  idx->buf);.    p
1bf20 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1bf30 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 0;.  }.}../*
1bf40 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70 57 72  .** Grow the pWr
1bf50 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61  iter->aDlidx[] a
1bf60 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61 73 74  rray to at least
1bf70 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69   nLvl elements i
1bf80 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e  n size..** Any n
1bf90 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74  ew array element
1bfa0 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62 65 66  s are zeroed bef
1bfb0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1bfc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1bfd0 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
1bfe0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1bff0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1c000 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74   *pWriter,.  int
1c010 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70   nLvl.){.  if( p
1c020 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1c030 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72  && nLvl>=pWriter
1c040 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ->nDlidx ){.    
1c050 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
1c060 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73 35 44  *aDlidx = (Fts5D
1c070 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71 6c 69  lidxWriter*)sqli
1c080 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 0a 20  te3_realloc64(. 
1c090 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
1c0a0 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46  aDlidx, sizeof(F
1c0b0 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20  ts5DlidxWriter) 
1c0c0 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20  * nLvl.    );.  
1c0d0 20 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20    if( aDlidx==0 
1c0e0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1c0f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1c100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c110 73 69 7a 65 5f 74 20 6e 42 79 74 65 20 3d 20 73  size_t nByte = s
1c120 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57  izeof(Fts5DlidxW
1c130 72 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d  riter) * (nLvl -
1c140 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
1c150 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
1c160 26 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72 2d  &aDlidx[pWriter-
1c170 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79  >nDlidx], 0, nBy
1c180 74 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74  te);.      pWrit
1c190 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c  er->aDlidx = aDl
1c1a0 69 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69 74  idx;.      pWrit
1c1b0 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76  er->nDlidx = nLv
1c1c0 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  l;.    }.  }.  r
1c1d0 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
1c1e0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  /*.** If the cur
1c1f0 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64  rent doclist-ind
1c200 65 78 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  ex accumulating 
1c210 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  in pWriter->aDli
1c220 64 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a  dx[] is large.**
1c230 20 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20 69   enough, flush i
1c240 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 72 65  t to disk and re
1c250 74 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73  turn 1. Otherwis
1c260 65 20 64 69 73 63 61 72 64 20 69 74 20 61 6e 64  e discard it and
1c270 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e   return.** zero.
1c280 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1c290 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69  ts5WriteFlushDli
1c2a0 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  dx(Fts5Index *p,
1c2b0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1c2c0 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20  pWriter){.  int 
1c2d0 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  bFlag = 0;..  /*
1c2e0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 46   If there were F
1c2f0 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
1c300 5a 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79  ZE or more empty
1c310 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74   leaf pages writ
1c320 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
1c330 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77  database, also w
1c340 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74  rite the doclist
1c350 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20  -index to disk. 
1c360 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65   */.  if( pWrite
1c370 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
1c380 2e 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  .n>0 && pWriter-
1c390 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49  >nEmpty>=FTS5_MI
1c3a0 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a  N_DLIDX_SIZE ){.
1c3b0 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20      bFlag = 1;. 
1c3c0 20 7d 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c   }.  fts5WriteDl
1c3d0 69 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69  idxClear(p, pWri
1c3e0 74 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70  ter, bFlag);.  p
1c3f0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d  Writer->nEmpty =
1c400 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6c   0;.  return bFl
1c410 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ag;.}../*.** Thi
1c420 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c430 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 70 72  lled whenever pr
1c440 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20  ocessing of the 
1c450 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20  doclist for the 
1c460 0a 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e  .** last term on
1c470 20 6c 65 61 66 20 70 61 67 65 20 28 70 57 72 69   leaf page (pWri
1c480 74 65 72 2d 3e 69 42 74 50 61 67 65 29 20 69 73  ter->iBtPage) is
1c490 20 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a   completed. .**.
1c4a0 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 2d 69  ** The doclist-i
1c4b0 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20 74 65  ndex for that te
1c4c0 72 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  rm is currently 
1c4d0 73 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  stored in-memory
1c4e0 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46   within the.** F
1c4f0 74 73 35 53 65 67 57 72 69 74 65 72 2e 61 44 6c  ts5SegWriter.aDl
1c500 69 64 78 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  idx[] array. If 
1c510 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  it is large enou
1c520 67 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  gh, this functio
1c530 6e 0a 2a 2a 20 77 72 69 74 65 73 20 69 74 20 6f  n.** writes it o
1c540 75 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20  ut to disk. Or, 
1c550 69 66 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61  if it is too sma
1c560 6c 6c 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74  ll to bother wit
1c570 68 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a 20 69  h, discards.** i
1c580 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67  t..**.** Fts5Seg
1c590 57 72 69 74 65 72 2e 62 74 74 65 72 6d 20 63 75  Writer.btterm cu
1c5a0 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
1c5b0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
1c5c0 6f 6e 20 70 61 67 65 20 69 42 74 50 61 67 65 2e  on page iBtPage.
1c5d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c5e0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74  fts5WriteFlushBt
1c5f0 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ree(Fts5Index *p
1c600 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
1c610 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74  *pWriter){.  int
1c620 20 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72   bFlag;..  asser
1c630 74 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  t( pWriter->iBtP
1c640 61 67 65 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  age || pWriter->
1c650 6e 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69  nEmpty==0 );.  i
1c660 66 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  f( pWriter->iBtP
1c670 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  age==0 ) return;
1c680 0a 20 20 62 46 6c 61 67 20 3d 20 66 74 73 35 57  .  bFlag = fts5W
1c690 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 70  riteFlushDlidx(p
1c6a0 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 69  , pWriter);..  i
1c6b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c6c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
1c6d0 20 63 68 61 72 20 2a 7a 20 3d 20 28 70 57 72 69   char *z = (pWri
1c6e0 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f  ter->btterm.n>0?
1c6f0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 57 72  (const char*)pWr
1c700 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22  iter->btterm.p:"
1c710 22 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  ");.    /* The f
1c720 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c 72  ollowing was alr
1c730 65 61 64 79 20 64 6f 6e 65 20 69 6e 20 66 74 73  eady done in fts
1c740 35 57 72 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f  5WriteInit(): */
1c750 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1c760 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78  bind_int(p->pIdx
1c770 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74  Writer, 1, pWrit
1c780 65 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a  er->iSegid); */.
1c790 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1c7a0 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72 69  _blob(p->pIdxWri
1c7b0 74 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74  ter, 2, z, pWrit
1c7c0 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51  er->btterm.n, SQ
1c7d0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1c7e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1c7f0 6e 74 36 34 28 70 2d 3e 70 49 64 78 57 72 69 74  nt64(p->pIdxWrit
1c800 65 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20 28  er, 3, bFlag + (
1c810 28 69 36 34 29 70 57 72 69 74 65 72 2d 3e 69 42  (i64)pWriter->iB
1c820 74 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20  tPage<<1));.    
1c830 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
1c840 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
1c850 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1c860 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78 57 72  _reset(p->pIdxWr
1c870 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
1c880 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d 3e  e3_bind_null(p->
1c890 70 49 64 78 57 72 69 74 65 72 2c 20 32 29 3b 0a  pIdxWriter, 2);.
1c8a0 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69    }.  pWriter->i
1c8b0 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  BtPage = 0;.}../
1c8c0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
1c8d0 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
1c8e0 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65  h leaf page exce
1c8f0 70 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61  pt the first tha
1c900 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74  t contains.** at
1c910 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
1c920 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d   Argument (nTerm
1c930 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73  /pTerm) is the s
1c940 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72  plit-key - a ter
1c950 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  m that.** is lar
1c960 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72  ger than all ter
1c970 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61  ms written to ea
1c980 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e  rlier leaves, an
1c990 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a  d equal to or.**
1c9a0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1c9b0 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
1c9c0 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a  the new leaf..**
1c9d0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1c9e0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1c9f0 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
1ca00 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
1ca10 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61  f an error.** ha
1ca20 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
1ca30 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
1ca40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1ca50 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1ca60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1ca70 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72  ts5WriteBtreeTer
1ca80 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
1ca90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1caa0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1cab0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1cac0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1cad0 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
1cae0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1caf0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  t */.  int nTerm
1cb00 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
1cb10 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  m      /* First 
1cb20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65  term on new page
1cb30 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69   */.){.  fts5Wri
1cb40 74 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20  teFlushBtree(p, 
1cb50 70 57 72 69 74 65 72 29 3b 0a 20 20 69 66 28 20  pWriter);.  if( 
1cb60 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1cb70 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
1cb80 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1cb90 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20  Writer->btterm, 
1cba0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1cbb0 20 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50     pWriter->iBtP
1cbc0 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77  age = pWriter->w
1cbd0 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 20 20 7d 0a  riter.pgno;.  }.
1cbe0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1cbf0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1cc00 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 61   when flushing a
1cc10 20 6c 65 61 66 20 70 61 67 65 20 74 68 61 74 20   leaf page that 
1cc20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74  contains no.** t
1cc30 65 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20 64  erms at all to d
1cc40 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  isk..*/.static v
1cc50 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
1cc60 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35  eeNoTerm(.  Fts5
1cc70 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1cc90 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1cca0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ct */.  Fts5SegW
1ccb0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20  riter *pWriter  
1ccc0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1ccd0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
1cce0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72   /* If there wer
1ccf0 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74  e no rowids on t
1cd00 68 65 20 6c 65 61 66 20 70 61 67 65 20 65 69 74  he leaf page eit
1cd10 68 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63 6c  her and the docl
1cd20 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68  ist-index.  ** h
1cd30 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1cd40 73 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64 20  started, append 
1cd50 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20  an 0x00 byte to 
1cd60 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  it.  */.  if( pW
1cd70 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1cd80 69 64 49 6e 50 61 67 65 20 26 26 20 70 57 72 69  idInPage && pWri
1cd90 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
1cda0 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74  uf.n>0 ){.    Ft
1cdb0 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
1cdc0 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1cdd0 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20  ->aDlidx[0];.   
1cde0 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
1cdf0 3e 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20  >bPrevValid );. 
1ce00 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1ce10 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1ce20 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1ce30 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ->buf, 0);.  }..
1ce40 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1ce50 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65  he "number of se
1ce60 71 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73 20  quential leaves 
1ce70 77 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22 20  without a term" 
1ce80 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57  counter. */.  pW
1ce90 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b  riter->nEmpty++;
1cea0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66  .}..static i64 f
1ceb0 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46  ts5DlidxExtractF
1cec0 69 72 73 74 52 6f 77 69 64 28 46 74 73 35 42 75  irstRowid(Fts5Bu
1ced0 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 69  ffer *pBuf){.  i
1cee0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74  64 iRowid;.  int
1cef0 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d   iOff;..  iOff =
1cf00 20 31 20 2b 20 66 74 73 35 47 65 74 56 61 72 69   1 + fts5GetVari
1cf10 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20  nt(&pBuf->p[1], 
1cf20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
1cf30 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
1cf40 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  &pBuf->p[iOff], 
1cf50 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
1cf60 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64 3b    return iRowid;
1cf70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20  .}../*.** Rowid 
1cf80 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20  iRowid has just 
1cf90 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f  been appended to
1cfa0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1cfb0 66 20 70 61 67 65 2e 20 49 74 20 69 73 20 74 68  f page. It is th
1cfc0 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74 68  e.** first on th
1cfd0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
1cfe0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e  ction appends an
1cff0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
1d000 72 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ry to the curren
1d010 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64  t.** doclist-ind
1d020 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
1d030 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  id fts5WriteDlid
1d040 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49  xAppend(.  Fts5I
1d050 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1d060 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1d070 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  er, .  i64 iRowi
1d080 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  d.){.  int i;.  
1d090 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a  int bDone = 0;..
1d0a0 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
1d0b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
1d0c0 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  Done==0; i++){. 
1d0d0 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
1d0e0 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
1d0f0 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69   *pDlidx = &pWri
1d100 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
1d110 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
1d120 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
1d130 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
1d140 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
1d150 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70   doclist-index p
1d160 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69  age is full. Wri
1d170 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e  te it to disk an
1d180 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a 20  d push.      ** 
1d190 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69 64  a copy of iRowid
1d1a0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63   (which will bec
1d1b0 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20 72 6f  ome the first ro
1d1c0 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a  wid on the next.
1d1d0 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74        ** doclist
1d1e0 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67 65  -index leaf page
1d1f0 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e 65  ) up into the ne
1d200 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  xt level of the 
1d210 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a  b-tree .      **
1d220 20 68 69 65 72 61 72 63 68 79 2e 20 49 66 20 74   hierarchy. If t
1d230 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c  he node being fl
1d240 75 73 68 65 64 20 69 73 20 63 75 72 72 65 6e 74  ushed is current
1d250 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ly the root node
1d260 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ,.      ** also 
1d270 70 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72  push its first r
1d280 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a 2f  owid upwards. */
1d290 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  .      pDlidx->b
1d2a0 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20  uf.p[0] = 0x01; 
1d2b0 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f     /* Not the ro
1d2c0 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20  ot node */.     
1d2d0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
1d2e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53  , .          FTS
1d2f0 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57  5_DLIDX_ROWID(pW
1d300 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
1d310 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c  , pDlidx->pgno),
1d320 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64  .          pDlid
1d330 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78  x->buf.p, pDlidx
1d340 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b  ->buf.n.      );
1d350 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1d360 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72  DlidxGrow(p, pWr
1d370 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20  iter, i+2);.    
1d380 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69    pDlidx = &pWri
1d390 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
1d3a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1d3b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
1d3c0 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30  lidx[1].buf.n==0
1d3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
1d3e0 69 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c 69  iFirst = fts5Dli
1d3f0 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
1d400 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75 66  wid(&pDlidx->buf
1d410 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
1d420 68 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f 74  his was the root
1d430 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73 20   node. Push its 
1d440 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 20 74  first rowid up t
1d450 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20  o the new root. 
1d460 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  */.        pDlid
1d470 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69  x[1].pgno = pDli
1d480 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  dx->pgno;.      
1d490 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d4a0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d4b0 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
1d4c0 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20  1].buf, 0);.    
1d4d0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1d4e0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1d4f0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1d500 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78  x[1].buf, pDlidx
1d510 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1d520 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d530 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d540 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
1d550 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b 0a  ].buf, iFirst);.
1d560 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
1d570 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31  ].bPrevValid = 1
1d580 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  ;.        pDlidx
1d590 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69 72  [1].iPrev = iFir
1d5a0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  st;.      }..   
1d5b0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d5c0 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
1d5d0 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70 44  ->buf);.      pD
1d5e0 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
1d5f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c 69   = 0;.      pDli
1d600 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20  dx->pgno++;.    
1d610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44 6f  }else{.      bDo
1d620 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ne = 1;.    }.. 
1d630 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62     if( pDlidx->b
1d640 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20  PrevValid ){.   
1d650 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
1d660 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76   - pDlidx->iPrev
1d670 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d680 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20 28     i64 iPgno = (
1d690 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e  i==0 ? pWriter->
1d6a0 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44  writer.pgno : pD
1d6b0 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a  lidx[-1].pgno);.
1d6c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
1d6d0 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29  lidx->buf.n==0 )
1d6e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
1d6f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d700 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d710 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f  Dlidx->buf, !bDo
1d720 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ne);.      sqlit
1d730 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1d740 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1d750 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69   &pDlidx->buf, i
1d760 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56 61  Pgno);.      iVa
1d770 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  l = iRowid;.    
1d780 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  }..    sqlite3Ft
1d790 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1d7a0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1d7b0 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29  lidx->buf, iVal)
1d7c0 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50  ;.    pDlidx->bP
1d7d0 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  revValid = 1;.  
1d7e0 20 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 20    pDlidx->iPrev 
1d7f0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a  = iRowid;.  }.}.
1d800 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1d810 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1d820 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1d830 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1d840 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  iter){.  static 
1d850 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20  const u8 zero[] 
1d860 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20  = { 0x00, 0x00, 
1d870 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x00, 0x00 };.  
1d880 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1d890 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1d8a0 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34 20  ->writer;.  i64 
1d8b0 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72  iRowid;..  asser
1d8c0 74 28 20 28 70 50 61 67 65 2d 3e 70 67 69 64 78  t( (pPage->pgidx
1d8d0 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65 72  .n==0)==(pWriter
1d8e0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1d8f0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  ge) );..  /* Set
1d900 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64   the szLeaf head
1d910 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61  er field. */.  a
1d920 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65  ssert( 0==fts5Ge
1d930 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
1d940 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73 35  .p[2]) );.  fts5
1d950 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  PutU16(&pPage->b
1d960 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 70 50  uf.p[2], (u16)pP
1d970 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20  age->buf.n);..  
1d980 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1d990 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
1d9a0 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20  .    /* No term 
1d9b0 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  was written to t
1d9c0 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  his page. */.   
1d9d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1d9e0 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20  pgidx.n==0 );.  
1d9f0 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
1da00 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65  NoTerm(p, pWrite
1da10 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1da20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70   /* Append the p
1da30 67 69 64 78 20 74 6f 20 74 68 65 20 70 61 67 65  gidx to the page
1da40 20 62 75 66 66 65 72 2e 20 53 65 74 20 74 68 65   buffer. Set the
1da50 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66   szLeaf header f
1da60 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73  ield. */.    fts
1da70 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1da80 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1da90 2d 3e 62 75 66 2c 20 70 50 61 67 65 2d 3e 70 67  ->buf, pPage->pg
1daa0 69 64 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67  idx.n, pPage->pg
1dab0 69 64 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  idx.p);.  }..  /
1dac0 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
1dad0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a   out to disk */.
1dae0 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
1daf0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
1db00 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70  riter->iSegid, p
1db10 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66  Page->pgno);.  f
1db20 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
1db30 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62  iRowid, pPage->b
1db40 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66  uf.p, pPage->buf
1db50 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .n);..  /* Initi
1db60 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70  alize the next p
1db70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
1db80 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d  fferZero(&pPage-
1db90 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66  >buf);.  fts5Buf
1dba0 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e  ferZero(&pPage->
1dbb0 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75  pgidx);.  fts5Bu
1dbc0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1dbd0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1dbe0 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20  uf, 4, zero);.  
1dbf0 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
1dc00 78 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  x = 0;.  pPage->
1dc10 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e  pgno++;..  /* In
1dc20 63 72 65 61 73 65 20 74 68 65 20 6c 65 61 76 65  crease the leave
1dc30 73 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65  s written counte
1dc40 72 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  r */.  pWriter->
1dc50 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a  nLeafWritten++;.
1dc60 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65  .  /* The new le
1dc70 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d  af holds no term
1dc80 73 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20  s or rowids */. 
1dc90 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1dca0 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a  TermInPage = 1;.
1dcb0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1dcc0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31  tRowidInPage = 1
1dcd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1dce0 64 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65  d term pTerm/nTe
1dcf0 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e  rm to the segmen
1dd00 74 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  t being written 
1dd10 62 79 20 74 68 65 20 77 72 69 74 65 72 20 70 61  by the writer pa
1dd20 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73  ssed.** as the s
1dd30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
1dd40 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1dd50 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68  r occurs, set th
1dd60 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
1dd70 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e  rror code. If an
1dd80 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
1dd90 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1dda0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1ddb0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1ddc0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1ddd0 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  iteAppendTerm(. 
1dde0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1ddf0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1de00 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
1de10 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20  nTerm, const u8 
1de20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74  *pTerm .){.  int
1de30 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de50 42 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20  Bytes of prefix 
1de60 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20  compression for 
1de70 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61  term */.  Fts5Pa
1de80 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1de90 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1dea0 65 72 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  er;.  Fts5Buffer
1deb0 20 2a 70 50 67 69 64 78 20 3d 20 26 70 57 72 69   *pPgidx = &pWri
1dec0 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64  ter->writer.pgid
1ded0 78 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  x;.  int nMin = 
1dee0 4d 49 4e 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e  MIN(pPage->term.
1def0 6e 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 61 73  n, nTerm);..  as
1df00 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
1df10 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
1df20 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  rt( pPage->buf.n
1df30 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=4 );.  assert(
1df40 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20   pPage->buf.n>4 
1df50 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  || pWriter->bFir
1df60 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a  stTermInPage );.
1df70 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1df80 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69  rent leaf page i
1df90 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74  s full, flush it
1dfa0 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69   to disk. */.  i
1dfb0 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e  f( (pPage->buf.n
1dfc0 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e   + pPgidx->n + n
1dfd0 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43  Term + 2)>=p->pC
1dfe0 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
1dff0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75     if( pPage->bu
1e000 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66  f.n>4 ){.      f
1e010 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1e020 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
1e030 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
1e040 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1e050 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  rn;.    }.    ft
1e060 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1e070 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1e080 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54  , nTerm+FTS5_DAT
1e090 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a  A_PADDING);.  }.
1e0a0 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55    .  /* TODO1: U
1e0b0 70 64 61 74 69 6e 67 20 70 67 69 64 78 20 68 65  pdating pgidx he
1e0c0 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d  re. */.  pPgidx-
1e0d0 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
1e0e0 35 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20  5PutVarint(.    
1e0f0 20 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67    &pPgidx->p[pPg
1e100 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e  idx->n], pPage->
1e110 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69  buf.n - pPage->i
1e120 50 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20  PrevPgidx.  );. 
1e130 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69   pPage->iPrevPgi
1e140 64 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e  dx = pPage->buf.
1e150 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50  n;.#if 0.  fts5P
1e160 75 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70  utU16(&pPgidx->p
1e170 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61  [pPgidx->n], pPa
1e180 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50  ge->buf.n);.  pP
1e190 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65  gidx->n += 2;.#e
1e1a0 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69  ndif..  if( pWri
1e1b0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1e1c0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72  nPage ){.    nPr
1e1d0 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66  efix = 0;.    if
1e1e0 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31  ( pPage->pgno!=1
1e1f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1e200 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1e210 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68  erm on a leaf th
1e220 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65  at is not the le
1e230 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20  ftmost leaf in. 
1e240 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d       ** the segm
1e250 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74  ent b-tree. In t
1e260 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
1e270 65 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20  ecessary to add 
1e280 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20  a term to.      
1e290 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  ** the b-tree hi
1e2a0 65 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20  erarchy that is 
1e2b0 28 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20  (a) larger than 
1e2c0 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d  the largest term
1e2d0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61   .      ** alrea
1e2e0 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
1e2f0 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62  e segment and (b
1e300 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  ) smaller than o
1e310 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20  r equal to.     
1e320 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49   ** this term. I
1e330 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
1e340 20 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72   prefix of (pTer
1e350 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73  m/nTerm) that is
1e360 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79   one.      ** by
1e370 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74  te longer than t
1e380 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69  he longest prefi
1e390 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  x (pTerm/nTerm) 
1e3a0 73 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a  shares with the.
1e3b0 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
1e3c0 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a  s term. .      *
1e3d0 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c  *.      ** Usual
1e3e0 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73  ly, the previous
1e3f0 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62   term is availab
1e400 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72  le in pPage->ter
1e410 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  m. The exception
1e420 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20  .      ** is if 
1e430 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1e440 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69  t term written i
1e450 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n an incremental
1e460 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20  -merge step..   
1e470 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
1e480 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
1e490 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69  term is not avai
1e4a0 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77  lable, so just w
1e4b0 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  rite a.      ** 
1e4c0 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e  copy of (pTerm/n
1e4d0 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70  Term) into the p
1e4e0 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73  arent node. This
1e4f0 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   is slightly.   
1e500 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e     ** inefficien
1e510 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72  t, but still cor
1e520 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rect.  */.      
1e530 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20  int n = nTerm;. 
1e540 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1e550 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20  term.n ){.      
1e560 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72    n = 1 + fts5Pr
1e570 65 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 4d 69  efixCompress(nMi
1e580 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70  n, pPage->term.p
1e590 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1e5a0 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  }.      fts5Writ
1e5b0 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57  eBtreeTerm(p, pW
1e5c0 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29  riter, n, pTerm)
1e5d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
1e5e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1e5f0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 50 61  eturn;.      pPa
1e600 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1e610 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  riter;.    }.  }
1e620 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69  else{.    nPrefi
1e630 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  x = fts5PrefixCo
1e640 6d 70 72 65 73 73 28 6e 4d 69 6e 2c 20 70 50 61  mpress(nMin, pPa
1e650 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72  ge->term.p, pTer
1e660 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  m);.    fts5Buff
1e670 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1e680 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1e690 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  uf, nPrefix);.  
1e6a0 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
1e6b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1e6c0 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20  es of new data, 
1e6d0 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61  then the term da
1e6e0 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74  ta itself.  ** t
1e6f0 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  o the page. */. 
1e700 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1e710 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1e720 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
1e730 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20  rm - nPrefix);. 
1e740 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1e750 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1e760 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
1e770 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65   - nPrefix, &pTe
1e780 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20  rm[nPrefix]);.. 
1e790 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46   /* Update the F
1e7a0 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65  ts5PageWriter.te
1e7b0 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66  rm field. */.  f
1e7c0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
1e7d0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72  >rc, &pPage->ter
1e7e0 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
1e7f0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
1e800 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1e810 30 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62  0;..  pWriter->b
1e820 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1e830 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 0;.  pWriter-
1e840 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
1e850 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73  clist = 1;..  as
1e860 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28  sert( p->rc || (
1e870 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e  pWriter->nDlidx>
1e880 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44  0 && pWriter->aD
1e890 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30  lidx[0].buf.n==0
1e8a0 29 20 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ) );.  pWriter->
1e8b0 61 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d  aDlidx[0].pgno =
1e8c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a   pPage->pgno;.}.
1e8d0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1e8e0 72 6f 77 69 64 20 61 6e 64 20 70 6f 73 69 74 69  rowid and positi
1e8f0 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
1e900 6c 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 72  ld to the writer
1e910 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74  s output. .*/.st
1e920 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1e930 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a  iteAppendRowid(.
1e940 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1e950 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1e960 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34   *pWriter,.  i64
1e970 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28   iRowid.){.  if(
1e980 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e990 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  K ){.    Fts5Pag
1e9a0 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
1e9b0 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1e9c0 72 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50 61  r;..    if( (pPa
1e9d0 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67  ge->buf.n + pPag
1e9e0 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e  e->pgidx.n)>=p->
1e9f0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
1ea00 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1ea10 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1ea20 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  iter);.    }..  
1ea30 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1ea40 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
1ea50 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f  rowid written to
1ea60 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
1ea70 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  he .    ** rowid
1ea80 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
1ea90 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
1eaa0 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
1eab0 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
1eac0 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20    ** buffer, in 
1ead0 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  case a doclist-i
1eae0 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64  ndex is required
1eaf0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  .  */.    if( pW
1eb00 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1eb10 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
1eb20 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61    fts5PutU16(pPa
1eb30 67 65 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36 29  ge->buf.p, (u16)
1eb40 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
1eb50 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
1eb60 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72  idxAppend(p, pWr
1eb70 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
1eb80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69     }..    /* Wri
1eb90 74 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f  te the rowid. */
1eba0 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
1ebb0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
1ebc0 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65  oclist || pWrite
1ebd0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1ebe0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
1ebf0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1ec00 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1ec10 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  age->buf, iRowid
1ec20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ec30 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
1ec40 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70  ->rc || iRowid>p
1ec50 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
1ec60 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  id );.      fts5
1ec70 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1ec80 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1ec90 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d  e->buf, iRowid -
1eca0 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
1ecb0 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
1ecc0 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
1ecd0 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1ece0 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
1ecf0 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
1ed00 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65   = 0;.    pWrite
1ed10 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1ed20 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Page = 0;.  }.}.
1ed30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1ed40 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
1ed50 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35 49  istData(.  Fts5I
1ed60 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1ed70 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1ed80 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  er, .  const u8 
1ed90 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e  *aData, .  int n
1eda0 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50 61  Data.){.  Fts5Pa
1edb0 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1edc0 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1edd0 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  er;.  const u8 *
1ede0 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e 74  a = aData;.  int
1edf0 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20   n = nData;.  . 
1ee00 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e   assert( p->pCon
1ee10 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20  fig->pgsz>0 );. 
1ee20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1ee30 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26  QLITE_OK .     &
1ee40 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  & (pPage->buf.n 
1ee50 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  + pPage->pgidx.n
1ee60 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69   + n)>=p->pConfi
1ee70 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20  g->pgsz .  ){.  
1ee80 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e    int nReq = p->
1ee90 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20  pConfig->pgsz - 
1eea0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70  pPage->buf.n - p
1eeb0 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20  Page->pgidx.n;. 
1eec0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30     int nCopy = 0
1eed0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f  ;.    while( nCo
1eee0 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20  py<nReq ){.     
1eef0 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20   i64 dummy;.    
1ef00 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35 47    nCopy += fts5G
1ef10 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70  etVarint(&a[nCop
1ef20 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d 79  y], (u64*)&dummy
1ef30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
1ef40 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1ef50 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1ef60 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29  ->buf, nCopy, a)
1ef70 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79  ;.    a += nCopy
1ef80 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79  ;.    n -= nCopy
1ef90 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46  ;.    fts5WriteF
1efa0 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
1efb0 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ter);.  }.  if( 
1efc0 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  n>0 ){.    fts5B
1efd0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1efe0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1eff0 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a  buf, n, a);.  }.
1f000 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
1f010 6e 79 20 64 61 74 61 20 63 61 63 68 65 64 20 62  ny data cached b
1f020 79 20 74 68 65 20 77 72 69 74 65 72 20 6f 62 6a  y the writer obj
1f030 65 63 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ect to the datab
1f040 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a  ase. Free any.**
1f050 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73   allocations ass
1f060 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1f070 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   writer..*/.stat
1f080 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1f090 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35 49  eFinish(.  Fts5I
1f0a0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1f0b0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1f0c0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er,         /* W
1f0d0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1f0e0 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20    int *pnLeaf   
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
1f110 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69   of leaf pages i
1f120 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20  n b-tree */.){. 
1f130 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50 61   int i;.  Fts5Pa
1f140 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20  geWriter *pLeaf 
1f150 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1f160 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  er;.  if( p->rc=
1f170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f180 20 20 61 73 73 65 72 74 28 20 70 4c 65 61 66 2d    assert( pLeaf-
1f190 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20  >pgno>=1 );.    
1f1a0 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e  if( pLeaf->buf.n
1f1b0 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  >4 ){.      fts5
1f1c0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1f1d0 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
1f1e0 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20  }.    *pnLeaf = 
1f1f0 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20  pLeaf->pgno-1;. 
1f200 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67     if( pLeaf->pg
1f210 6e 6f 3e 31 20 29 7b 0a 20 20 20 20 20 20 66 74  no>1 ){.      ft
1f220 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65  s5WriteFlushBtre
1f230 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  e(p, pWriter);. 
1f240 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42     }.  }.  fts5B
1f250 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
1f260 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  ->term);.  fts5B
1f270 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
1f280 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75  ->buf);.  fts5Bu
1f290 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d  fferFree(&pLeaf-
1f2a0 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42  >pgidx);.  fts5B
1f2b0 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69 74  ufferFree(&pWrit
1f2c0 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20 20  er->btterm);..  
1f2d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74  for(i=0; i<pWrit
1f2e0 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29  er->nDlidx; i++)
1f2f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1f300 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72  5BufferFree(&pWr
1f310 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e  iter->aDlidx[i].
1f320 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  buf);.  }.  sqli
1f330 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
1f340 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74  ->aDlidx);.}..st
1f350 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1f360 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35 49  iteInit(.  Fts5I
1f370 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1f380 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1f390 65 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69  er, .  int iSegi
1f3a0 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  d.){.  const int
1f3b0 20 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70 43   nBuffer = p->pC
1f3c0 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46 54  onfig->pgsz + FT
1f3d0 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b  S5_DATA_PADDING;
1f3e0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74  ..  memset(pWrit
1f3f0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
1f400 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
1f410 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1f420 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66 74   = iSegid;..  ft
1f430 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
1f440 28 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29 3b  (p, pWriter, 1);
1f450 0a 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74  .  pWriter->writ
1f460 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 70  er.pgno = 1;.  p
1f470 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1f480 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  rmInPage = 1;.  
1f490 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1f4a0 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
1f4b0 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1f4c0 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61  .buf.n==0 );.  a
1f4d0 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
1f4e0 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d  writer.pgidx.n==
1f4f0 30 20 29 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77 20  0 );..  /* Grow 
1f500 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73 20  the two buffers 
1f510 74 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69 6e  to pgsz + paddin
1f520 67 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  g bytes in size.
1f530 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73   */.  sqlite3Fts
1f540 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e  5BufferSize(&p->
1f550 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72  rc, &pWriter->wr
1f560 69 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75 66  iter.pgidx, nBuf
1f570 66 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  fer);.  sqlite3F
1f580 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
1f590 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e  ->rc, &pWriter->
1f5a0 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 42 75 66  writer.buf, nBuf
1f5b0 66 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  fer);..  if( p->
1f5c0 70 49 64 78 57 72 69 74 65 72 3d 3d 30 20 29 7b  pIdxWriter==0 ){
1f5d0 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
1f5e0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
1f5f0 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
1f600 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
1f610 70 2c 20 26 70 2d 3e 70 49 64 78 57 72 69 74 65  p, &p->pIdxWrite
1f620 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  r, sqlite3_mprin
1f630 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49  tf(.          "I
1f640 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27 2e  NSERT INTO '%q'.
1f650 27 25 71 5f 69 64 78 27 28 73 65 67 69 64 2c 74  '%q_idx'(segid,t
1f660 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55 45 53  erm,pgno) VALUES
1f670 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20  (?,?,?)", .     
1f680 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
1f690 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
1f6a0 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 0a 20  e.    ));.  }.. 
1f6b0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1f6c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
1f6d0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 34  Initialize the 4
1f6e0 2d 62 79 74 65 20 6c 65 61 66 2d 70 61 67 65 20  -byte leaf-page 
1f6f0 68 65 61 64 65 72 20 74 6f 20 30 78 30 30 2e 20  header to 0x00. 
1f700 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57  */.    memset(pW
1f710 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75  riter->writer.bu
1f720 66 2e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  f.p, 0, 4);.    
1f730 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1f740 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20 20  buf.n = 4;..    
1f750 2f 2a 20 42 69 6e 64 20 74 68 65 20 63 75 72 72  /* Bind the curr
1f760 65 6e 74 20 6f 75 74 70 75 74 20 73 65 67 6d 65  ent output segme
1f770 6e 74 20 69 64 20 74 6f 20 74 68 65 20 69 6e 64  nt id to the ind
1f780 65 78 2d 77 72 69 74 65 72 2e 20 54 68 69 73 20  ex-writer. This 
1f790 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 6f 70 74  is an.    ** opt
1f7a0 69 6d 69 7a 61 74 69 6f 6e 20 6f 76 65 72 20 62  imization over b
1f7b0 69 6e 64 69 6e 67 20 74 68 65 20 73 61 6d 65 20  inding the same 
1f7c0 76 61 6c 75 65 20 6f 76 65 72 20 61 6e 64 20 6f  value over and o
1f7d0 76 65 72 20 61 73 20 72 6f 77 73 20 61 72 65 0a  ver as rows are.
1f7e0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 65 64 20      ** inserted 
1f7f0 69 6e 74 6f 20 25 5f 69 64 78 20 62 79 20 74 68  into %_idx by th
1f800 65 20 63 75 72 72 65 6e 74 20 77 72 69 74 65 72  e current writer
1f810 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
1f820 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49  3_bind_int(p->pI
1f830 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72  dxWriter, 1, pWr
1f840 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 0a 20  iter->iSegid);. 
1f850 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72   }.}../*.** Iter
1f860 61 74 6f 72 20 70 49 74 65 72 20 77 61 73 20 75  ator pIter was u
1f870 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1f880 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74  hrough the input
1f890 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20   segments of on 
1f8a0 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61  an.** incrementa
1f8b0 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f  l merge operatio
1f8c0 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
1f8d0 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68   is called if th
1f8e0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a  e incremental.**
1f8f0 20 6d 65 72 67 65 20 73 74 65 70 20 68 61 73 20   merge step has 
1f900 66 69 6e 69 73 68 65 64 20 62 75 74 20 74 68 65  finished but the
1f910 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62   input has not b
1f920 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65  een completely e
1f930 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61  xhausted..*/.sta
1f940 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69  tic void fts5Tri
1f950 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e  mSegments(Fts5In
1f960 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72  dex *p, Fts5Iter
1f970 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
1f980 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i;.  Fts5Buffer 
1f990 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
1f9a0 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
1f9b0 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f  s5Buffer));.  fo
1f9c0 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
1f9d0 6e 53 65 67 20 26 26 20 70 2d 3e 72 63 3d 3d 53  nSeg && p->rc==S
1f9e0 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
1f9f0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1fa00 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
1fa10 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28  aSeg[i];.    if(
1fa20 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29   pSeg->pSeg==0 )
1fa30 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  {.      /* no-op
1fa40 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
1fa50 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
1fa60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
1fa70 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 69 73 20   keys from this 
1fa80 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 68 61  input segment ha
1fa90 76 65 20 62 65 65 6e 20 74 72 61 6e 73 66 65 72  ve been transfer
1faa0 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
1fab0 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65 74 20 62  ..      ** Set b
1fac0 6f 74 68 20 74 68 65 20 66 69 72 73 74 20 61 6e  oth the first an
1fad0 64 20 6c 61 73 74 20 70 61 67 65 2d 6e 75 6d 62  d last page-numb
1fae0 65 72 73 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ers to 0 to indi
1faf0 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20  cate that the.  
1fb00 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
1fb10 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a  s now empty. */.
1fb20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
1fb30 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a  ->pgnoLast = 0;.
1fb40 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
1fb50 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b  ->pgnoFirst = 0;
1fb60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fb70 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65    int iOff = pSe
1fb80 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  g->iTermLeafOffs
1fb90 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  et;     /* Offse
1fba0 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c  t on new first l
1fbb0 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
1fbc0 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64    i64 iLeafRowid
1fbd0 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61  ;.      Fts5Data
1fbe0 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69   *pData;.      i
1fbf0 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70  nt iId = pSeg->p
1fc00 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
1fc10 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20     u8 aHdr[4] = 
1fc20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30  {0x00, 0x00, 0x0
1fc30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20  0, 0x00};..     
1fc40 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54   iLeafRowid = FT
1fc50 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
1fc60 28 69 49 64 2c 20 70 53 65 67 2d 3e 69 54 65 72  (iId, pSeg->iTer
1fc70 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20  mLeafPgno);.    
1fc80 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 4c 65    pData = fts5Le
1fc90 61 66 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52  afRead(p, iLeafR
1fca0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
1fcb0 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
1fcc0 20 20 69 66 28 20 69 4f 66 66 3e 70 44 61 74 61    if( iOff>pData
1fcd0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
1fce0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1fcf0 6e 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70  n occur if the p
1fd00 61 67 65 73 20 74 68 61 74 20 74 68 65 20 73 65  ages that the se
1fd10 67 6d 65 6e 74 73 20 6f 63 63 75 70 79 20 6f 76  gments occupy ov
1fd20 65 72 6c 61 70 20 2d 20 69 66 0a 20 20 20 20 20  erlap - if.     
1fd30 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
1fd40 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61   page has been a
1fd50 73 73 69 67 6e 65 64 20 74 6f 20 6d 6f 72 65 20  ssigned to more 
1fd60 74 68 61 6e 20 6f 6e 65 20 73 65 67 6d 65 6e 74  than one segment
1fd70 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
1fd80 2a 20 74 68 69 73 20 63 61 73 65 20 61 20 70 72  * this case a pr
1fd90 69 6f 72 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ior iteration of
1fda0 20 74 68 69 73 20 6c 6f 6f 70 20 6d 61 79 20 68   this loop may h
1fdb0 61 76 65 20 63 6f 72 72 75 70 74 65 64 20 74 68  ave corrupted th
1fdc0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1fdd0 65 67 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  egment currently
1fde0 20 62 65 69 6e 67 20 74 72 69 6d 6d 65 64 2e 20   being trimmed. 
1fdf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 2d   */.          p-
1fe00 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1fe10 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
1fe20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  e{.          fts
1fe30 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66  5BufferZero(&buf
1fe40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
1fe50 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1fe60 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
1fe70 3e 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >nn);.          
1fe80 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fe90 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1fea0 66 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c  f, sizeof(aHdr),
1feb0 20 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20   aHdr);.        
1fec0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fed0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1fee0 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
1fef0 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  m.n);.          
1ff00 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1ff10 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1ff20 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c  f, pSeg->term.n,
1ff30 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a   pSeg->term.p);.
1ff40 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1ff50 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1ff60 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61  p->rc, &buf, pDa
1ff70 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c  ta->szLeaf-iOff,
1ff80 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29  &pData->p[iOff])
1ff90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ffa0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ffb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ffc0 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  /* Set the szLea
1ffd0 66 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20  f field */.     
1ffe0 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31         fts5PutU1
1fff0 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31  6(&buf.p[2], (u1
20000 36 29 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  6)buf.n);.      
20010 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
20020 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6e   /* Set up the n
20030 65 77 20 70 61 67 65 2d 69 6e 64 65 78 20 61 72  ew page-index ar
20040 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ray */.         
20050 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
20060 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
20070 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20  &buf, 4);.      
20080 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c      if( pSeg->iL
20090 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69  eafPgno==pSeg->i
200a0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20  TermLeafPgno .  
200b0 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67           && pSeg
200c0 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c  ->iEndofDoclist<
200d0 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 0a 20 20  pData->szLeaf.  
200e0 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67           && pSeg
200f0 2d 3e 69 50 67 69 64 78 4f 66 66 3c 3d 70 44 61  ->iPgidxOff<=pDa
20100 74 61 2d 3e 6e 6e 0a 20 20 20 20 20 20 20 20 20  ta->nn.         
20110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20120 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61 74  int nDiff = pDat
20130 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67  a->szLeaf - pSeg
20140 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b  ->iEndofDoclist;
20150 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
20160 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
20170 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
20180 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44  , buf.n - 1 - nD
20190 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  iff - 4);.      
201a0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
201b0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
201c0 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20  c, &buf, .      
201d0 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d            pData-
201e0 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69  >nn - pSeg->iPgi
201f0 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70  dxOff, &pData->p
20200 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66  [pSeg->iPgidxOff
20210 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  ].            );
20220 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
20230 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53          pSeg->pS
20240 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
20250 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50  pSeg->iTermLeafP
20260 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 66  gno;.          f
20270 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c  ts5DataDelete(p,
20280 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
20290 57 49 44 28 69 49 64 2c 20 31 29 2c 20 69 4c 65  WID(iId, 1), iLe
202a0 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  afRowid);.      
202b0 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
202c0 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c  e(p, iLeafRowid,
202d0 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a   buf.p, buf.n);.
202e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
202f0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
20300 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  e(pData);.      
20310 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74  }.    }.  }.  ft
20320 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
20330 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  f);.}..static vo
20340 69 64 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e  id fts5MergeChun
20350 6b 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  kCallback(.  Fts
20360 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f  5Index *p, .  vo
20370 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e  id *pCtx, .  con
20380 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
20390 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46  nt nChunk.){.  F
203a0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
203b0 72 69 74 65 72 20 3d 20 28 46 74 73 35 53 65 67  riter = (Fts5Seg
203c0 57 72 69 74 65 72 2a 29 70 43 74 78 3b 0a 20 20  Writer*)pCtx;.  
203d0 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50  fts5WriteAppendP
203e0 6f 73 6c 69 73 74 44 61 74 61 28 70 2c 20 70 57  oslistData(p, pW
203f0 72 69 74 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e  riter, pChunk, n
20400 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Chunk);.}../*.**
20410 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20420 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
20430 76 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78  vel(.  Fts5Index
20440 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
20450 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
20460 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
20470 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
20480 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20   **ppStruct,    
20490 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74     /* IN/OUT: St
204a0 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
204b0 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20  */.  int iLvl,  
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
204e0 20 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   read input from
204f0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d   */.  int *pnRem
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20510 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 75        /* Write u
20520 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f  p to this many o
20530 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a  utput leaves */.
20540 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
20550 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
20560 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53  pStruct;.  Fts5S
20570 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
20580 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
20590 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
205a0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
205b0 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46  el *pLvlOut;.  F
205c0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ts5Iter *pIter =
205d0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 74 65   0;       /* Ite
205e0 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e  rator to read in
205f0 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  put data */.  in
20600 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f  t nRem = pnRem ?
20610 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a   *pnRem : 0;  /*
20620 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61 67   Output leaf pag
20630 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
20640 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74   */.  int nInput
20650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20660 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20670 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
20680 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  s */.  Fts5SegWr
20690 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
206a0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
206b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
206c0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
206d0 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
206e0 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a  Output segment *
206f0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
20700 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65  erm;.  int bOlde
20710 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
20720 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20730 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  f the output seg
20740 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65  ment is the olde
20750 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 74  st */.  int eDet
20760 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
20770 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 63 6f 6e  ->eDetail;.  con
20780 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46  st int flags = F
20790 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e  TS5INDEX_QUERY_N
207a0 4f 4f 55 54 50 55 54 3b 0a 20 20 69 6e 74 20 62  OOUTPUT;.  int b
207b0 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 20 30 3b  TermWritten = 0;
207c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
207d0 75 65 20 69 66 20 63 75 72 72 65 6e 74 20 74 65  ue if current te
207e0 72 6d 20 61 6c 72 65 61 64 79 20 6f 75 74 70 75  rm already outpu
207f0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
20800 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
20810 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  evel );.  assert
20820 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d  ( pLvl->nMerge<=
20830 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20  pLvl->nSeg );.. 
20840 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c   memset(&writer,
20850 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
20860 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65  egWriter));.  me
20870 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
20880 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
20890 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e  ));.  if( pLvl->
208a0 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c  nMerge ){.    pL
208b0 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  vlOut = &pStruct
208c0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d  ->aLevel[iLvl+1]
208d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
208e0 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b  vlOut->nSeg>0 );
208f0 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c  .    nInput = pL
20900 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20  vl->nMerge;.    
20910 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d  pSeg = &pLvlOut-
20920 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
20930 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73  Seg-1];..    fts
20940 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
20950 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65  riter, pSeg->iSe
20960 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72  gid);.    writer
20970 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70  .writer.pgno = p
20980 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b  Seg->pgnoLast+1;
20990 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42 74 50  .    writer.iBtP
209a0 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  age = 0;.  }else
209b0 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64  {.    int iSegid
209c0 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53   = fts5AllocateS
209d0 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29  egid(p, pStruct)
209e0 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64  ;..    /* Extend
209f0 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75   the Fts5Structu
20a00 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71  re object as req
20a10 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20  uired to ensure 
20a20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a  the output.    *
20a30 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73  * segment exists
20a40 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76  . */.    if( iLv
20a50 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  l==pStruct->nLev
20a60 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74  el-1 ){.      ft
20a70 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
20a80 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74  vel(&p->rc, ppSt
20a90 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74  ruct);.      pSt
20aa0 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
20ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
20ac0 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
20ad0 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
20ae0 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c  ruct, iLvl+1, 1,
20af0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
20b00 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rc ) return;.   
20b10 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74   pLvl = &pStruct
20b20 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
20b30 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70      pLvlOut = &p
20b40 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
20b50 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73  Lvl+1];..    fts
20b60 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
20b70 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a  riter, iSegid);.
20b80 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
20b90 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74  new segment to t
20ba0 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20  he output level 
20bb0 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  */.    pSeg = &p
20bc0 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76  LvlOut->aSeg[pLv
20bd0 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20  lOut->nSeg];.   
20be0 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b   pLvlOut->nSeg++
20bf0 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f  ;.    pSeg->pgno
20c00 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70  First = 1;.    p
20c10 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
20c20 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63  egid;.    pStruc
20c30 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a  t->nSegment++;..
20c40 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75      /* Read inpu
20c50 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65  t from all segme
20c60 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  nts in the input
20c70 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49   level */.    nI
20c80 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  nput = pLvl->nSe
20c90 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74  g;.  }.  bOldest
20ca0 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65   = (pLvlOut->nSe
20cb0 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d  g==1 && pStruct-
20cc0 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29  >nLevel==iLvl+2)
20cd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
20ce0 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74  l>=0 );.  for(ft
20cf0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
20d00 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
20d10 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c  , 0, 0, 0, iLvl,
20d20 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29   nInput, &pIter)
20d30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
20d40 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
20d50 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  r)==0;.      fts
20d60 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
20d70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20  , pIter, 0, 0). 
20d80 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
20d90 74 65 72 20 2a 70 53 65 67 49 74 65 72 20 3d 20  ter *pSegIter = 
20da0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
20db0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
20dc0 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74  First ];.    int
20dd0 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20   nPos;          
20de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f             /* po
20df0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
20e00 20 66 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a   field value */.
20e10 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20      int nTerm;. 
20e20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65     const u8 *pTe
20e30 72 6d 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm;..    pTerm =
20e40 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65   fts5MultiIterTe
20e50 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72 6d  rm(pIter, &nTerm
20e60 29 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72 6d  );.    if( nTerm
20e70 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 66 74 73 35  !=term.n || fts5
20e80 4d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65  Memcmp(pTerm, te
20e90 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a  rm.p, nTerm) ){.
20ea0 20 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d 20        if( pnRem 
20eb0 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57  && writer.nLeafW
20ec0 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20  ritten>nRem ){. 
20ed0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
20ef0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
20f00 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , &term, nTerm, 
20f10 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62 54  pTerm);.      bT
20f20 65 72 6d 57 72 69 74 74 65 6e 20 3d 30 3b 0a 20  ermWritten =0;. 
20f30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
20f40 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68  ck for key annih
20f50 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ilation. */.    
20f60 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50  if( pSegIter->nP
20f70 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73  os==0 && (bOldes
20f80 74 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e 62  t || pSegIter->b
20f90 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Del==0) ) contin
20fa0 75 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ue;..    if( p->
20fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20fc0 20 62 54 65 72 6d 57 72 69 74 74 65 6e 3d 3d 30   bTermWritten==0
20fd0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
20fe0 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e  s is a new term.
20ff0 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74   Append a term t
21000 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  o the output seg
21010 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66  ment. */.      f
21020 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65  ts5WriteAppendTe
21030 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e  rm(p, &writer, n
21040 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
21050 20 20 20 20 62 54 65 72 6d 57 72 69 74 74 65 6e      bTermWritten
21060 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
21070 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72   /* Append the r
21080 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70  owid to the outp
21090 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49  ut */.    /* WRI
210a0 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
210b0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70  .    fts5WriteAp
210c0 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72  pendRowid(p, &wr
210d0 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49  iter, fts5MultiI
210e0 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 29  terRowid(pIter))
210f0 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61  ;..    if( eDeta
21100 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
21110 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66  NONE ){.      if
21120 28 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c  ( pSegIter->bDel
21130 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
21140 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
21150 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74  nt(&p->rc, &writ
21160 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30  er.writer.buf, 0
21170 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
21180 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3e 30 20  SegIter->nPos>0 
21190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
211a0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
211b0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69  int(&p->rc, &wri
211c0 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20  ter.writer.buf, 
211d0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
211e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
211f0 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  .      /* Append
21200 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
21210 73 74 20 64 61 74 61 20 74 6f 20 74 68 65 20 6f  st data to the o
21220 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 6e  utput */.      n
21230 50 6f 73 20 3d 20 70 53 65 67 49 74 65 72 2d 3e  Pos = pSegIter->
21240 6e 50 6f 73 2a 32 20 2b 20 70 53 65 67 49 74 65  nPos*2 + pSegIte
21250 72 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 66  r->bDel;.      f
21260 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
21270 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77  arint(&p->rc, &w
21280 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
21290 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 66  , nPos);.      f
212a0 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
212b0 70 2c 20 70 53 65 67 49 74 65 72 2c 20 28 76 6f  p, pSegIter, (vo
212c0 69 64 2a 29 26 77 72 69 74 65 72 2c 20 66 74 73  id*)&writer, fts
212d0 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62  5MergeChunkCallb
212e0 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ack);.    }.  }.
212f0 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20  .  /* Flush the 
21300 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 74  last leaf page t
21310 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20  o disk. Set the 
21320 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62  output segment b
21330 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a  -tree height.  *
21340 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20  * and last leaf 
21350 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74  page number at t
21360 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a  he same time.  *
21370 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69 6e  /.  fts5WriteFin
21380 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20  ish(p, &writer, 
21390 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29  &pSeg->pgnoLast)
213a0 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c  ;..  if( fts5Mul
213b0 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
213c0 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  er) ){.    int i
213d0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  ;..    /* Remove
213e0 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73   the redundant s
213f0 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
21400 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
21410 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21420 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20  nInput; i++){.  
21430 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f      fts5DataRemo
21440 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76  veSegment(p, pLv
21450 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69  l->aSeg[i].iSegi
21460 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
21470 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64  * Remove the red
21480 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20  undant segments 
21490 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c  from the input l
214a0 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20  evel */.    if( 
214b0 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70  pLvl->nSeg!=nInp
214c0 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
214d0 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nMove = (pLvl->n
214e0 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20  Seg - nInput) * 
214f0 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
21500 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
21510 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c      memmove(pLvl
21520 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61  ->aSeg, &pLvl->a
21530 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f  Seg[nInput], nMo
21540 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ve);.    }.    p
21550 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
21560 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20   -= nInput;.    
21570 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49  pLvl->nSeg -= nI
21580 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  nput;.    pLvl->
21590 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20  nMerge = 0;.    
215a0 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  if( pSeg->pgnoLa
215b0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  st==0 ){.      p
215c0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a  LvlOut->nSeg--;.
215d0 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e        pStruct->n
215e0 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d  Segment--;.    }
215f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
21600 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f  sert( pSeg->pgno
21610 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74  Last>0 );.    ft
21620 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70  s5TrimSegments(p
21630 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c  , pIter);.    pL
21640 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e  vl->nMerge = nIn
21650 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  put;.  }..  fts5
21660 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
21670 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66  ter);.  fts5Buff
21680 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
21690 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e   if( pnRem ) *pn
216a0 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c  Rem -= writer.nL
216b0 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f  eafWritten;.}../
216c0 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50  *.** Do up to nP
216d0 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d  g pages of autom
216e0 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65  erge work on the
216f0 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 65   index..**.** Re
21700 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
21710 20 63 68 61 6e 67 65 73 20 77 65 72 65 20 61 63   changes were ac
21720 74 75 61 6c 6c 79 20 6d 61 64 65 2c 20 6f 72 20  tually made, or 
21730 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
21740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
21750 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20  ts5IndexMerge(. 
21760 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21780 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
21790 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
217a0 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
217b0 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
217c0 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
217d0 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
217e0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 2c  ex */.  int nPg,
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21800 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
21810 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a   of work to do *
21820 2f 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 20 20 20  /.  int nMin    
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e      /* Minimum n
21850 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
21860 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b  s to merge */.){
21870 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50  .  int nRem = nP
21880 67 3b 0a 20 20 69 6e 74 20 62 52 65 74 20 3d 20  g;.  int bRet = 
21890 30 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  0;.  Fts5Structu
218a0 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
218b0 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c 65  pStruct;.  while
218c0 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72  ( nRem>0 && p->r
218d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
218e0 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68  /* To iterate th
21910 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
21920 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c      int iBestLvl
21930 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21940 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e  /* Level offerin
21950 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74  g the most input
21960 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
21970 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20   int nBest = 0; 
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21990 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  Number of input 
219a0 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74  segments on best
219b0 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f   level */..    /
219c0 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74  * Set iBestLvl t
219d0 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72  o the level to r
219e0 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  ead input segmen
219f0 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20  ts from. */.    
21a00 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
21a10 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20  >nLevel>0 );.   
21a20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
21a30 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
21a40 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
21a50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
21a60 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
21a70 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
21a80 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  vl];.      if( p
21a90 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
21aa0 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
21ab0 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b  >nMerge>nBest ){
21ac0 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74  .          iBest
21ad0 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
21ae0 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c        nBest = pL
21af0 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20  vl->nMerge;.    
21b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
21b10 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
21b20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65     if( pLvl->nSe
21b30 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20  g>nBest ){.     
21b40 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
21b50 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69  >nSeg;.        i
21b60 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a  BestLvl = iLvl;.
21b70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21b80 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20 69     /* If nBest i
21b90 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20  s still 0, then 
21ba0 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  the index must b
21bb0 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64  e empty. */.#ifd
21bc0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21bd0 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
21be0 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c  nBest==0 && iLvl
21bf0 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
21c00 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
21c10 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
21c20 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
21c30 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Seg==0 );.    }.
21c40 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
21c50 6e 42 65 73 74 3c 6e 4d 69 6e 20 26 26 20 70 53  nBest<nMin && pS
21c60 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42  truct->aLevel[iB
21c70 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d  estLvl].nMerge==
21c80 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
21c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 52 65 74  ;.    }.    bRet
21ca0 20 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 49 6e   = 1;.    fts5In
21cb0 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
21cc0 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74   &pStruct, iBest
21cd0 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
21ce0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
21cf0 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74  TE_OK && pStruct
21d00 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76  ->aLevel[iBestLv
21d10 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  l].nMerge==0 ){.
21d20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
21d30 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42  urePromote(p, iB
21d40 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  estLvl+1, pStruc
21d50 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
21d60 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
21d70 75 63 74 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  uct;.  return bR
21d80 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74  et;.}../*.** A t
21d90 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65  otal of nLeaf le
21da0 61 66 20 70 61 67 65 73 20 6f 66 20 64 61 74 61  af pages of data
21db0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66   has just been f
21dc0 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65  lushed to a leve
21dd0 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20  l-0.** segment. 
21de0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70  This function up
21df0 64 61 74 65 73 20 74 68 65 20 77 72 69 74 65 2d  dates the write-
21e00 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e  counter accordin
21e10 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e  gly and, if.** n
21e20 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72  ecessary, perfor
21e30 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  ms incremental m
21e40 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a  erge work..**.**
21e50 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
21e60 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
21e70 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
21e80 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
21e90 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
21ea0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
21eb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
21ec0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
21ed0 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41 75  void fts5IndexAu
21ee0 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49  tomerge(.  Fts5I
21ef0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
21f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
21f10 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
21f20 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
21f30 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c  ture **ppStruct,
21f40 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
21f50 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74  : Current struct
21f60 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
21f70 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20    int nLeaf     
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
21fa0 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73  utput leaves jus
21fb0 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a  t written */.){.
21fc0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
21fd0 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f  ITE_OK && p->pCo
21fe0 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
21ff0 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  >0 ){.    Fts5St
22000 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
22010 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
22020 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20 20    u64 nWrite;   
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22040 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
22050 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65   of write-counte
22060 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f  r */.    int nWo
22070 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
22080 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22090 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20   of work-quanta 
220a0 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20  to perform */.  
220b0 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20    int nRem;     
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
220e0 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20  f pages left to 
220f0 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  write */..    /*
22100 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69 74   Update the writ
22110 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65  e-counter. While
22120 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e   doing so, set n
22130 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72  Work. */.    nWr
22140 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  ite = pStruct->n
22150 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20  WriteCounter;.  
22160 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29 28    nWork = (int)(
22170 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66  ((nWrite + nLeaf
22180 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  ) / p->nWorkUnit
22190 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d  ) - (nWrite / p-
221a0 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20 20  >nWorkUnit));.  
221b0 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74    pStruct->nWrit
221c0 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61  eCounter += nLea
221d0 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28 69  f;.    nRem = (i
221e0 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  nt)(p->nWorkUnit
221f0 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75   * nWork * pStru
22200 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20 20  ct->nLevel);..  
22210 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
22220 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e 52  (p, ppStruct, nR
22230 65 6d 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  em, p->pConfig->
22240 6e 41 75 74 6f 6d 65 72 67 65 29 3b 0a 20 20 7d  nAutomerge);.  }
22250 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
22260 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d  fts5IndexCrisism
22270 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erge(.  Fts5Inde
22280 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
22290 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
222a0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
222b0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
222c0 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20  e **ppStruct    
222d0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
222e0 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65  urrent structure
222f0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a   of index */.){.
22300 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69    const int nCri
22310 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  sis = p->pConfig
22320 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a  ->nCrisisMerge;.
22330 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
22340 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
22350 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c  ruct;.  int iLvl
22360 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
22370 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
22380 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  K || pStruct->nL
22390 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  evel>0 );.  whil
223a0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
223b0 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e  _OK && pStruct->
223c0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
223d0 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20  g>=nCrisis ){.  
223e0 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
223f0 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63  Level(p, &pStruc
22400 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20  t, iLvl, 0);.   
22410 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
22420 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
22430 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c  ruct->nLevel>(iL
22440 76 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73  vl+1) );.    fts
22450 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
22460 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74  e(p, iLvl+1, pSt
22470 72 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b  ruct);.    iLvl+
22480 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75  +;.  }.  *ppStru
22490 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a  ct = pStruct;.}.
224a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
224b0 49 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73 35  IndexReturn(Fts5
224c0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74  Index *p){.  int
224d0 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70   rc = p->rc;.  p
224e0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
224f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22500 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
22510 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 46 74   Fts5FlushCtx Ft
22520 73 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75  s5FlushCtx;.stru
22530 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20  ct Fts5FlushCtx 
22540 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
22550 49 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72  Idx;.  Fts5SegWr
22560 69 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b  iter writer; .};
22570 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61  ../*.** Buffer a
22580 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61  Buf[] contains a
22590 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73   list of varints
225a0 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75  , all small enou
225b0 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20  gh to fit.** in 
225c0 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
225d0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  . Return the siz
225e0 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  e of the largest
225f0 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20   prefix of this 
22600 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79  .** list nMax by
22610 74 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73  tes or less in s
22620 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
22630 6e 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72  nt fts5PoslistPr
22640 65 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61  efix(const u8 *a
22650 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a  Buf, int nMax){.
22660 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32    int ret;.  u32
22670 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20   dummy;.  ret = 
22680 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
22690 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20  aBuf, dummy);.  
226a0 69 66 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a  if( ret<nMax ){.
226b0 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
226c0 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74        int i = ft
226d0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
226e0 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29  Buf[ret], dummy)
226f0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 72 65 74  ;.      if( (ret
22700 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62   + i) > nMax ) b
22710 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20  reak;.      ret 
22720 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += i;.    }.  }.
22730 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
22740 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65  ./*.** Flush the
22750 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d   contents of in-
22760 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
22770 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77  e iHash to a new
22780 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67   level-0 .** seg
22790 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c  ment on disk. Al
227a0 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f  so update the co
227b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75  rresponding stru
227c0 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a  cture record..**
227d0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
227e0 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
227f0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
22800 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
22810 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
22820 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
22830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22840 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
22850 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73  ic void fts5Flus
22860 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64  hOneHash(Fts5Ind
22870 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61  ex *p){.  Fts5Ha
22880 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70  sh *pHash = p->p
22890 48 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75  Hash;.  Fts5Stru
228a0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
228b0 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
228c0 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
228d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
228e0 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70    /* Last leaf p
228f0 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
22900 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  gment */..  /* O
22910 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
22920 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73  e to the index s
22930 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
22940 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d  ocate a new segm
22950 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20  ent-id.  ** for 
22960 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20  the new level-0 
22970 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70  segment.  */.  p
22980 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
22990 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
229a0 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c   iSegid = fts5Al
229b0 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70  locateSegid(p, p
229c0 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53  Struct);.  fts5S
229d0 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
229e0 74 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 69 53  te(p);..  if( iS
229f0 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73  egid ){.    cons
22a00 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e  t int pgsz = p->
22a10 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 20  pConfig->pgsz;. 
22a20 20 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d     int eDetail =
22a30 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
22a40 74 61 69 6c 3b 0a 20 20 20 20 46 74 73 35 53 74  tail;.    Fts5St
22a50 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
22a60 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73  pSeg;   /* New s
22a70 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53  egment within pS
22a80 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74 73  truct */.    Fts
22a90 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20  5Buffer *pBuf;  
22aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
22ab0 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
22ac0 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70   assemble leaf p
22ad0 61 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42  age */.    Fts5B
22ae0 75 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20 20  uffer *pPgidx;  
22af0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
22b00 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61  er in which to a
22b10 73 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f  ssemble pgidx */
22b20 0a 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69  ..    Fts5SegWri
22b30 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20  ter writer;.    
22b40 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c  fts5WriteInit(p,
22b50 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64   &writer, iSegid
22b60 29 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20 26  );..    pBuf = &
22b70 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75  writer.writer.bu
22b80 66 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d 20  f;.    pPgidx = 
22b90 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70  &writer.writer.p
22ba0 67 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74  gidx;..    /* ft
22bb0 73 35 57 72 69 74 65 49 6e 69 74 28 29 20 73 68  s5WriteInit() sh
22bc0 6f 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69 61  ould have initia
22bd0 6c 69 7a 65 64 20 74 68 65 20 62 75 66 66 65 72  lized the buffer
22be0 73 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c  s to (most likel
22bf0 79 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61  y).    ** the ma
22c00 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
22c10 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ired. */.    ass
22c20 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42  ert( p->rc || pB
22c30 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73  uf->nSpace>=(pgs
22c40 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  z + FTS5_DATA_PA
22c50 44 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61 73  DDING) );.    as
22c60 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70  sert( p->rc || p
22c70 50 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28  Pgidx->nSpace>=(
22c80 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41  pgsz + FTS5_DATA
22c90 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20  _PADDING) );..  
22ca0 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e    /* Begin scann
22cb0 69 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68  ing through hash
22cc0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20   table entries. 
22cd0 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  This loop runs o
22ce0 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20  nce for each.   
22cf0 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74   ** term/doclist
22d00 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
22d10 64 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73  d within the has
22d20 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
22d30 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
22d40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
22d50 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
22d60 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48  5HashScanInit(pH
22d70 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ash, 0, 0);.    
22d80 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  }.    while( p->
22d90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22da0 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48   0==sqlite3Fts5H
22db0 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68  ashScanEof(pHash
22dc0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
22dd0 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20   char *zTerm;   
22de0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
22df0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d   containing term
22e00 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
22e10 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20  u8 *pDoclist;   
22e20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
22e30 20 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20   to doclist for 
22e40 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20  this term */.   
22e50 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b     int nDoclist;
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e70 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
22e80 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  t in bytes */.. 
22e90 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
22ea0 65 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73 20  e term for this 
22eb0 65 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a  entry to disk. *
22ec0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  /.      sqlite3F
22ed0 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79  ts5HashScanEntry
22ee0 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20  (pHash, &zTerm, 
22ef0 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63  &pDoclist, &nDoc
22f00 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73  list);.      fts
22f10 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
22f20 28 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69 6e  (p, &writer, (in
22f30 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c  t)strlen(zTerm),
22f40 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72   (const u8*)zTer
22f50 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  m);.      if( p-
22f60 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
22f70 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 61   break;..      a
22f80 73 73 65 72 74 28 20 77 72 69 74 65 72 2e 62 46  ssert( writer.bF
22f90 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3d  irstRowidInPage=
22fa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
22fb0 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b  pgsz>=(pBuf->n +
22fc0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f   pPgidx->n + nDo
22fd0 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20 20  clist + 1) ){.  
22fe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
22ff0 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c  ire doclist will
23000 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72   fit on the curr
23010 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20  ent leaf. */.   
23020 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
23030 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
23040 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44  uf, pDoclist, nD
23050 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  oclist);.      }
23060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
23070 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  4 iRowid = 0;.  
23080 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
23090 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
230a0 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20  t iOff = 0;..   
230b0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
230c0 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20  re doclist will 
230d0 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20  not fit on this 
230e0 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  leaf. The follow
230f0 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
23100 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74 68  loop iterates th
23110 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73  rough the poslis
23120 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
23130 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20  the current .   
23140 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e       ** doclist.
23150 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69    */.        whi
23160 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
23170 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f  E_OK && iOff<nDo
23180 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  clist ){.       
23190 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
231a0 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c 69  etVarint(&pDocli
231b0 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  st[iOff], (u64*)
231c0 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
231d0 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 44      iRowid += iD
231e0 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20  elta;.          
231f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77  .          if( w
23200 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
23210 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
23220 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31         fts5PutU1
23230 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 28  6(&pBuf->p[0], (
23240 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20 20 20  u16)pBuf->n);   
23250 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  /* first rowid o
23260 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  n page */.      
23270 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
23280 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
23290 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
232a0 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29  Buf->n], iRowid)
232b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72  ;.            wr
232c0 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
232d0 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  InPage = 0;.    
232e0 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
232f0 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
23300 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  &writer, iRowid)
23310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23320 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
23330 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OK ) break;.    
23340 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23350 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e           pBuf->n
23360 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50   += sqlite3Fts5P
23370 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  utVarint(&pBuf->
23380 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c  p[pBuf->n], iDel
23390 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ta);.          }
233a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
233b0 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66  t( pBuf->n<=pBuf
233c0 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20 20  ->nSpace );..   
233d0 20 20 20 20 20 20 20 69 66 28 20 65 44 65 74 61         if( eDeta
233e0 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
233f0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
23400 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f      if( iOff<nDo
23410 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73  clist && pDoclis
23420 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20  t[iOff]==0 ){.  
23430 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
23440 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
23450 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
23460 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20    iOff++;.      
23470 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
23480 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44 6f  <nDoclist && pDo
23490 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29  clist[iOff]==0 )
234a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
234b0 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e    pBuf->p[pBuf->
234c0 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  n++] = 0;.      
234d0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b            iOff++
234e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
234f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
23500 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23510 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64  (pBuf->n + pPgid
23520 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20  x->n)>=pgsz ){. 
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
23540 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
23550 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
23560 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23570 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23580 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d          int bDum
23590 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  my;.            
235a0 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
235b0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
235c0 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
235d0 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69  Size(&pDoclist[i
235e0 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
235f0 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20  ummy);.         
23600 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73     nCopy += nPos
23610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23620 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67  ( (pBuf->n + pPg
23630 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20  idx->n + nCopy) 
23640 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  <= pgsz ){.     
23650 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23660 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77  entire poslist w
23670 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63  ill fit on the c
23680 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20  urrent leaf. So 
23690 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20 20  copy.           
236a0 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20     ** it in one 
236b0 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  go. */.         
236c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
236d0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
236e0 75 66 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f  uf, &pDoclist[iO
236f0 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  ff], nCopy);.   
23700 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23720 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c   The entire posl
23730 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  ist will not fit
23740 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53   on this leaf. S
23750 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20  o it needs.     
23760 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62           ** to b
23770 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65  e broken into se
23780 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  ctions. The only
23790 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62   qualification b
237a0 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  eing.           
237b0 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20     ** that each 
237c0 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73  varint must be s
237d0 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73  tored contiguous
237e0 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ly.  */.        
237f0 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
23800 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63  pPoslist = &pDoc
23810 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  list[iOff];.    
23820 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
23830 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  os = 0;.        
23840 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
23850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23870 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 70 67   int nSpace = pg
23880 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70  sz - pBuf->n - p
23890 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20  Pgidx->n;.      
238a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
238b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
238c0 20 20 20 20 20 69 66 28 20 28 6e 43 6f 70 79 20       if( (nCopy 
238d0 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20  - iPos)<=nSpace 
238e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
238f0 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d       n = nCopy -
23900 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20   iPos;.         
23910 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50  n = fts5PoslistP
23940 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b  refix(&pPoslist[
23950 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a  iPos], nSpace);.
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
23980 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
23990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
239a0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
239b0 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
239c0 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c  &pPoslist[iPos],
239d0 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   n);.           
239e0 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a       iPos += n;.
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a00 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70  if( (pBuf->n + p
23a10 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20  Pgidx->n)>=pgsz 
23a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23a30 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
23a40 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74  ushLeaf(p, &writ
23a50 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
23a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23a70 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e         if( iPos>
23a80 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a  =nCopy ) break;.
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23ab0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
23ac0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = nCopy;.       
23ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23ae0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
23af0 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74 20   TODO2: Doclist 
23b00 74 65 72 6d 69 6e 61 74 6f 72 20 77 72 69 74 74  terminator writt
23b10 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  en here. */.    
23b20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42 75    /* pBuf->p[pBu
23b30 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20  f->n++] = '\0'; 
23b40 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
23b50 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e   pBuf->n<=pBuf->
23b60 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20  nSpace );.      
23b70 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
23b80 45 5f 4f 4b 20 29 20 73 71 6c 69 74 65 33 46 74  E_OK ) sqlite3Ft
23b90 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
23ba0 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Hash);.    }.   
23bb0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
23bc0 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
23bd0 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
23be0 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70  h(p, &writer, &p
23bf0 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f  gnoLast);..    /
23c00 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73  * Update the Fts
23c10 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20 69  5Structure. It i
23c20 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74  s written back t
23c30 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
23c40 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74 73  y the.    ** fts
23c50 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
23c60 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20  e() call below. 
23c70 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72   */.    if( pStr
23c80 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29  uct->nLevel==0 )
23c90 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
23ca0 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70  ctureAddLevel(&p
23cb0 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b  ->rc, &pStruct);
23cc0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
23cd0 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
23ce0 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
23cf0 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  uct, 0, 1, 0);. 
23d00 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
23d10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23d20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74   pSeg = &pStruct
23d30 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67  ->aLevel[0].aSeg
23d40 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  [ pStruct->aLeve
23d50 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20  l[0].nSeg++ ];. 
23d60 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69       pSeg->iSegi
23d70 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
23d80 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
23d90 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65  t = 1;.      pSe
23da0 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67  g->pgnoLast = pg
23db0 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 53  noLast;.      pS
23dc0 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b  truct->nSegment+
23dd0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  +;.    }.    fts
23de0 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
23df0 65 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29  e(p, 0, pStruct)
23e00 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64  ;.  }..  fts5Ind
23e10 65 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20 26  exAutomerge(p, &
23e20 70 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73  pStruct, pgnoLas
23e30 74 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 43  t);.  fts5IndexC
23e40 72 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26 70  risismerge(p, &p
23e50 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53  Struct);.  fts5S
23e60 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
23e70 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73   pStruct);.  fts
23e80 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
23e90 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f  e(pStruct);.}../
23ea0 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64  *.** Flush any d
23eb0 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
23ec0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
23ed0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64   tables to the d
23ee0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
23ef0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
23f00 78 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65 78  xFlush(Fts5Index
23f10 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73   *p){.  /* Unles
23f20 73 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20 66  s it is empty, f
23f30 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61  lush the hash ta
23f40 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ble to disk */. 
23f50 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   if( p->nPending
23f60 44 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65  Data ){.    asse
23f70 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a  rt( p->pHash );.
23f80 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
23f90 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73  ata = 0;.    fts
23fa0 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29  5FlushOneHash(p)
23fb0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
23fc0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66  Fts5Structure *f
23fd0 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
23fe0 53 74 72 75 63 74 28 0a 20 20 46 74 73 35 49 6e  Struct(.  Fts5In
23ff0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
24000 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
24010 74 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  t.){.  Fts5Struc
24020 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  ture *pNew = 0;.
24030 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
24040 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
24050 74 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20  ts5Structure);. 
24060 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72   int nSeg = pStr
24070 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  uct->nSegment;. 
24080 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 69   int i;..  /* Fi
24090 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73  gure out if this
240a0 20 73 74 72 75 63 74 75 72 65 20 72 65 71 75 69   structure requi
240b0 72 65 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  res optimization
240c0 2e 20 41 20 73 74 72 75 63 74 75 72 65 20 64 6f  . A structure do
240d0 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 71 75  es.  ** not requ
240e0 69 72 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ire optimization
240f0 20 69 66 20 65 69 74 68 65 72 3a 0a 20 20 2a 2a   if either:.  **
24100 0a 20 20 2a 2a 20 20 2b 20 69 74 20 63 6f 6e 73  .  **  + it cons
24110 69 73 74 73 20 6f 66 20 66 65 77 65 72 20 74 68  ists of fewer th
24120 61 6e 20 74 77 6f 20 73 65 67 6d 65 6e 74 73 2c  an two segments,
24130 20 6f 72 20 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c   or .  **  + all
24140 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6f 6e   segments are on
24150 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 2c   the same level,
24160 20 6f 72 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20   or.  **  + all 
24170 73 65 67 6d 65 6e 74 73 20 65 78 63 65 70 74 20  segments except 
24180 6f 6e 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  one are currentl
24190 79 20 69 6e 70 75 74 73 20 74 6f 20 61 20 6d 65  y inputs to a me
241a0 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  rge operation.. 
241b0 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20   **.  ** In the 
241c0 66 69 72 73 74 20 63 61 73 65 2c 20 72 65 74 75  first case, retu
241d0 72 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74 68 65 20  rn NULL. In the 
241e0 73 65 63 6f 6e 64 2c 20 69 6e 63 72 65 6d 65 6e  second, incremen
241f0 74 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 0a  t the ref-count.
24200 20 20 2a 2a 20 6f 6e 20 2a 70 53 74 72 75 63 74    ** on *pStruct
24210 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 6f   and return a co
24220 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  py of the pointe
24230 72 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  r to it..  */.  
24240 69 66 28 20 6e 53 65 67 3c 32 20 29 20 72 65 74  if( nSeg<2 ) ret
24250 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
24260 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  ; i<pStruct->nLe
24270 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  vel; i++){.    i
24280 6e 74 20 6e 54 68 69 73 20 3d 20 70 53 74 72 75  nt nThis = pStru
24290 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53  ct->aLevel[i].nS
242a0 65 67 3b 0a 20 20 20 20 69 66 28 20 6e 54 68 69  eg;.    if( nThi
242b0 73 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e 54 68 69  s==nSeg || (nThi
242c0 73 3d 3d 6e 53 65 67 2d 31 20 26 26 20 70 53 74  s==nSeg-1 && pSt
242d0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
242e0 6e 4d 65 72 67 65 3d 3d 6e 54 68 69 73 29 20 29  nMerge==nThis) )
242f0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
24300 63 74 75 72 65 52 65 66 28 70 53 74 72 75 63 74  ctureRef(pStruct
24310 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24320 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20  pStruct;.    }. 
24330 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
24340 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d  ct->aLevel[i].nM
24350 65 72 67 65 3c 3d 6e 54 68 69 73 20 29 3b 0a 20  erge<=nThis );. 
24360 20 7d 0a 0a 20 20 6e 42 79 74 65 20 2b 3d 20 28   }..  nByte += (
24370 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
24380 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  1) * sizeof(Fts5
24390 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 3b  StructureLevel);
243a0 0a 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53  .  pNew = (Fts5S
243b0 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65  tructure*)sqlite
243c0 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
243d0 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
243e0 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
243f0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
24400 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20  Level *pLvl;.   
24410 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20   nByte = nSeg * 
24420 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
24430 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
24440 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d    pNew->nLevel =
24450 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
24460 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52  +1;.    pNew->nR
24470 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77  ef = 1;.    pNew
24480 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20  ->nWriteCounter 
24490 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  = pStruct->nWrit
244a0 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c  eCounter;.    pL
244b0 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76  vl = &pNew->aLev
244c0 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  el[pStruct->nLev
244d0 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61  el];.    pLvl->a
244e0 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
244f0 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
24500 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
24510 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65  ro(&p->rc, nByte
24520 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  );.    if( pLvl-
24530 3e 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69  >aSeg ){.      i
24540 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
24550 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74       int iSegOut
24560 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49   = 0;.      /* I
24570 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
24580 6c 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66 72 6f  ll segments, fro
24590 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65  m oldest to newe
245a0 73 74 2e 20 41 64 64 20 74 68 65 6d 20 74 6f 0a  st. Add them to.
245b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77        ** the new
245c0 20 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a 65 63   Fts5Level objec
245d0 74 20 73 6f 20 74 68 61 74 20 70 4c 76 6c 2d 3e  t so that pLvl->
245e0 61 53 65 67 5b 30 5d 20 69 73 20 74 68 65 20 6f  aSeg[0] is the o
245f0 6c 64 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 73  ldest.      ** s
24600 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61  egment in the da
24610 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  ta structure.  *
24620 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c  /.      for(iLvl
24630 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
24640 2d 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69 4c 76  -1; iLvl>=0; iLv
24650 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l--){.        fo
24660 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
24670 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
24680 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
24690 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  +){.          pL
246a0 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74  vl->aSeg[iSegOut
246b0 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  ] = pStruct->aLe
246c0 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
246d0 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Seg];.          
246e0 69 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20  iSegOut++;.     
246f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24700 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e     pNew->nSegmen
24710 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d  t = pLvl->nSeg =
24720 20 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65   nSeg;.    }else
24730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24740 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
24750 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
24760 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
24770 70 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  pNew;.}..int sql
24780 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74  ite3Fts5IndexOpt
24790 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20  imize(Fts5Index 
247a0 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  *p){.  Fts5Struc
247b0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
247c0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
247d0 70 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61 73 73  pNew = 0;..  ass
247e0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
247f0 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49  TE_OK );.  fts5I
24800 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20  ndexFlush(p);.  
24810 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
24820 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
24830 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
24840 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20  nvalidate(p);.. 
24850 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
24860 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49      pNew = fts5I
24870 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75  ndexOptimizeStru
24880 63 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  ct(p, pStruct);.
24890 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74    }.  fts5Struct
248a0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
248b0 63 74 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ct);..  assert( 
248c0 70 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65 77 2d  pNew==0 || pNew-
248d0 3e 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20  >nSegment>0 );. 
248e0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
248f0 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20 20 66   int iLvl;.    f
24900 6f 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65 77 2d  or(iLvl=0; pNew-
24910 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
24920 65 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29 7b 7d  eg==0; iLvl++){}
24930 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
24940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24950 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  pNew->aLevel[iLv
24960 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20  l].nSeg>0 ){.   
24970 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54     int nRem = FT
24980 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54  S5_OPT_WORK_UNIT
24990 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65  ;.      fts5Inde
249a0 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
249b0 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65  pNew, iLvl, &nRe
249c0 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  m);.    }..    f
249d0 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
249e0 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  e(p, pNew);.    
249f0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
24a00 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  ease(pNew);.  }.
24a10 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
24a20 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d  dexReturn(p); .}
24a30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
24a40 63 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c 65 6d  called to implem
24a50 65 6e 74 20 74 68 65 20 73 70 65 63 69 61 6c 20  ent the special 
24a60 22 56 41 4c 55 45 53 28 27 6d 65 72 67 65 27 2c  "VALUES('merge',
24a70 20 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20 49 4e   $nMerge)".** IN
24a80 53 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  SERT command..*/
24a90 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24aa0 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49  IndexMerge(Fts5I
24ab0 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65  ndex *p, int nMe
24ac0 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75  rge){.  Fts5Stru
24ad0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
24ae0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24af0 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74  ad(p);.  if( pSt
24b00 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
24b10 6e 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nMin = p->pConfi
24b20 67 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b 0a 20  g->nUsermerge;. 
24b30 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24b40 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20  Invalidate(p);. 
24b50 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3c 30 20     if( nMerge<0 
24b60 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
24b70 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 66  ucture *pNew = f
24b80 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
24b90 53 74 72 75 63 74 28 70 2c 20 70 53 74 72 75 63  Struct(p, pStruc
24ba0 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74  t);.      fts5St
24bb0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
24bc0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
24bd0 53 74 72 75 63 74 20 3d 20 70 4e 65 77 3b 0a 20  Struct = pNew;. 
24be0 20 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b 0a 20       nMin = 2;. 
24bf0 20 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 6e 4d       nMerge = nM
24c00 65 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d 0a 20  erge*-1;.    }. 
24c10 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26     if( pStruct &
24c20 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  & pStruct->nLeve
24c30 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  l ){.      if( f
24c40 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c  ts5IndexMerge(p,
24c50 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67   &pStruct, nMerg
24c60 65 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20 20 20  e, nMin) ){.    
24c70 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
24c80 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63  eWrite(p, pStruc
24c90 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
24ca0 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
24cb0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
24cc0 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ct);.  }.  retur
24cd0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
24ce0 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(p);.}..static 
24cf0 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64 52  void fts5AppendR
24d00 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
24d10 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c  x *p,.  i64 iDel
24d20 74 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a  ta,.  Fts5Iter *
24d30 70 55 6e 75 73 65 64 2c 0a 20 20 46 74 73 35 42  pUnused,.  Fts5B
24d40 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
24d50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
24d60 6e 75 73 65 64 29 3b 0a 20 20 66 74 73 35 42 75  nused);.  fts5Bu
24d70 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
24d80 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69  (&p->rc, pBuf, i
24d90 44 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69  Delta);.}..stati
24da0 63 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e  c void fts5Appen
24db0 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  dPoslist(.  Fts5
24dc0 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20  Index *p,.  i64 
24dd0 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74  iDelta,.  Fts5It
24de0 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74  er *pMulti,.  Ft
24df0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29  s5Buffer *pBuf.)
24e00 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20  {.  int nData = 
24e10 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e 44 61  pMulti->base.nDa
24e20 74 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  ta;.  int nByte 
24e30 3d 20 6e 44 61 74 61 20 2b 20 39 20 2b 20 39 20  = nData + 9 + 9 
24e40 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  + FTS5_DATA_ZERO
24e50 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 73 73 65  _PADDING;.  asse
24e60 72 74 28 20 6e 44 61 74 61 3e 30 20 29 3b 0a 20  rt( nData>0 );. 
24e70 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
24e80 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74 73 35  TE_OK && 0==fts5
24e90 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
24ea0 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 20  c, pBuf, nByte) 
24eb0 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
24ec0 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
24ed0 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  t(pBuf, iDelta);
24ee0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
24ef0 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
24f00 70 42 75 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a  pBuf, nData*2);.
24f10 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24f20 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
24f30 66 2c 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e  f, pMulti->base.
24f40 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
24f50 20 20 20 6d 65 6d 73 65 74 28 26 70 42 75 66 2d     memset(&pBuf-
24f60 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 30 2c 20  >p[pBuf->n], 0, 
24f70 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
24f80 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 7d 0a 0a  ADDING);.  }.}..
24f90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
24fa0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
24fb0 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72  (Fts5DoclistIter
24fc0 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a   *pIter){.  u8 *
24fd0 70 20 3d 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  p = pIter->aPosl
24fe0 69 73 74 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69  ist + pIter->nSi
24ff0 7a 65 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73  ze + pIter->nPos
25000 6c 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  list;..  assert(
25010 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
25020 20 29 3b 0a 20 20 69 66 28 20 70 3e 3d 70 49 74   );.  if( p>=pIt
25030 65 72 2d 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20  er->aEof ){.    
25040 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
25050 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
25060 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20    i64 iDelta;.. 
25070 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56     p += fts5GetV
25080 61 72 69 6e 74 28 70 2c 20 28 75 36 34 2a 29 26  arint(p, (u64*)&
25090 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74  iDelta);.    pIt
250a0 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
250b0 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  elta;..    /* Re
250c0 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ad position list
250d0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28   size */.    if(
250e0 20 70 5b 30 5d 20 26 20 30 78 38 30 20 29 7b 0a   p[0] & 0x80 ){.
250f0 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
25100 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69        pIter->nSi
25110 7a 65 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  ze = fts5GetVari
25120 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20  nt32(p, nPos);. 
25130 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
25140 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29  list = (nPos>>1)
25150 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25160 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69     pIter->nPosli
25170 73 74 20 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d  st = ((int)(p[0]
25180 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70  )) >> 1;.      p
25190 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b  Iter->nSize = 1;
251a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65  .    }..    pIte
251b0 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b  r->aPoslist = p;
251c0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
251d0 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49  oid fts5DoclistI
251e0 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42  terInit(.  Fts5B
251f0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20  uffer *pBuf, .  
25200 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
25210 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73  *pIter.){.  mems
25220 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
25230 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
25240 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
25250 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74  = pBuf->p;.  pIt
25260 65 72 2d 3e 61 45 6f 66 20 3d 20 26 70 42 75 66  er->aEof = &pBuf
25270 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20  ->p[pBuf->n];.  
25280 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
25290 65 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23  ext(pIter);.}..#
252a0 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  if 0./*.** Appen
252b0 64 20 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62  d a doclist to b
252c0 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
252d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
252e0 61 73 73 75 6d 65 73 20 74 68 61 74 20 73 70 61  assumes that spa
252f0 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 62 75  ce within the bu
25300 66 66 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ffer has already
25310 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74   been.** allocat
25320 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
25330 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70 65  id fts5MergeAppe
25340 6e 64 44 6f 63 69 64 28 0a 20 20 46 74 73 35 42  ndDocid(.  Fts5B
25350 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20  uffer *pBuf,    
25360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
25370 66 66 65 72 20 74 6f 20 77 72 69 74 65 20 74 6f  ffer to write to
25380 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73   */.  i64 *piLas
25390 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  tRowid,         
253a0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
253b0 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64 20   Previous rowid 
253c0 77 72 69 74 74 65 6e 20 28 69 66 20 61 6e 79 29  written (if any)
253d0 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64   */.  i64 iRowid
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253f0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74        /* Rowid t
25400 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  o append */.){. 
25410 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
25420 21 3d 30 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52  !=0 || (*piLastR
25430 6f 77 69 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74  owid)==0 );.  ft
25440 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
25450 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
25460 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52  Rowid - *piLastR
25470 6f 77 69 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74  owid);.  *piLast
25480 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
25490 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  }.#endif..#defin
254a0 65 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e  e fts5MergeAppen
254b0 64 44 6f 63 69 64 28 70 42 75 66 2c 20 69 4c 61  dDocid(pBuf, iLa
254c0 73 74 52 6f 77 69 64 2c 20 69 52 6f 77 69 64 29  stRowid, iRowid)
254d0 20 7b 20 20 20 20 20 20 20 5c 0a 20 20 61 73 73   {       \.  ass
254e0 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d  ert( (pBuf)->n!=
254f0 30 20 7c 7c 20 28 69 4c 61 73 74 52 6f 77 69 64  0 || (iLastRowid
25500 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  )==0 );         
25510 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 66 74            \.  ft
25520 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
25530 6e 64 56 61 72 69 6e 74 28 28 70 42 75 66 29 2c  ndVarint((pBuf),
25540 20 28 69 52 6f 77 69 64 29 20 2d 20 28 69 4c 61   (iRowid) - (iLa
25550 73 74 52 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28  stRowid)); \.  (
25560 69 4c 61 73 74 52 6f 77 69 64 29 20 3d 20 28 69  iLastRowid) = (i
25570 52 6f 77 69 64 29 3b 20 20 20 20 20 20 20 20 20  Rowid);         
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25590 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
255a0 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65 20  ./*.** Swap the 
255b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 62 75 66 66  contents of buff
255c0 65 72 20 2a 70 31 20 77 69 74 68 20 74 68 61 74  er *p1 with that
255d0 20 6f 66 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74   of *p2..*/.stat
255e0 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66  ic void fts5Buff
255f0 65 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65  erSwap(Fts5Buffe
25600 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65  r *p1, Fts5Buffe
25610 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75  r *p2){.  Fts5Bu
25620 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a  ffer tmp = *p1;.
25630 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a    *p1 = *p2;.  *
25640 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61  p2 = tmp;.}..sta
25650 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 65 78  tic void fts5Nex
25660 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65  tRowid(Fts5Buffe
25670 72 20 2a 70 42 75 66 2c 20 69 6e 74 20 2a 70 69  r *pBuf, int *pi
25680 4f 66 66 2c 20 69 36 34 20 2a 70 69 52 6f 77 69  Off, i64 *piRowi
25690 64 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70  d){.  int i = *p
256a0 69 4f 66 66 3b 0a 20 20 69 66 28 20 69 3e 3d 70  iOff;.  if( i>=p
256b0 42 75 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a 70  Buf->n ){.    *p
256c0 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  iOff = -1;.  }el
256d0 73 65 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c  se{.    u64 iVal
256e0 3b 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 69  ;.    *piOff = i
256f0 20 2b 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   + sqlite3Fts5Ge
25700 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
25710 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  [i], &iVal);.   
25720 20 2a 70 69 52 6f 77 69 64 20 2b 3d 20 69 56 61   *piRowid += iVa
25730 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
25740 54 68 69 73 20 69 73 20 74 68 65 20 65 71 75 69  This is the equi
25750 76 61 6c 65 6e 74 20 6f 66 20 66 74 73 35 4d 65  valent of fts5Me
25760 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 29  rgePrefixLists()
25770 20 66 6f 72 20 64 65 74 61 69 6c 3d 6e 6f 6e 65   for detail=none
25780 20 6d 6f 64 65 2e 0a 2a 2a 20 49 6e 20 74 68 69   mode..** In thi
25790 73 20 63 61 73 65 20 74 68 65 20 62 75 66 66 65  s case the buffe
257a0 72 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 61 20  rs consist of a 
257b0 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 6c 69  delta-encoded li
257c0 73 74 20 6f 66 20 72 6f 77 69 64 73 20 6f 6e 6c  st of rowids onl
257d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
257e0 64 20 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64  d fts5MergeRowid
257f0 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64  Lists(.  Fts5Ind
25800 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
25810 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
25820 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
25830 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
25840 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  *p1,            
25850 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69       /* First li
25860 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20  st to merge */. 
25870 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 20   Fts5Buffer *p2 
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25890 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20   /* Second list 
258a0 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20  to merge */.){. 
258b0 20 69 6e 74 20 69 31 20 3d 20 30 3b 0a 20 20 69   int i1 = 0;.  i
258c0 6e 74 20 69 32 20 3d 20 30 3b 0a 20 20 69 36 34  nt i2 = 0;.  i64
258d0 20 69 52 6f 77 69 64 31 20 3d 20 30 3b 0a 20 20   iRowid1 = 0;.  
258e0 69 36 34 20 69 52 6f 77 69 64 32 20 3d 20 30 3b  i64 iRowid2 = 0;
258f0 0a 20 20 69 36 34 20 69 4f 75 74 20 3d 20 30 3b  .  i64 iOut = 0;
25900 0a 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 6f  ..  Fts5Buffer o
25910 75 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6f 75  ut;.  memset(&ou
25920 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74  t, 0, sizeof(out
25930 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  ));.  sqlite3Fts
25940 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e  5BufferSize(&p->
25950 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20  rc, &out, p1->n 
25960 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 69 66 28 20  + p2->n);.  if( 
25970 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
25980 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64  .  fts5NextRowid
25990 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69  (p1, &i1, &iRowi
259a0 64 31 29 3b 0a 20 20 66 74 73 35 4e 65 78 74 52  d1);.  fts5NextR
259b0 6f 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69  owid(p2, &i2, &i
259c0 52 6f 77 69 64 32 29 3b 0a 20 20 77 68 69 6c 65  Rowid2);.  while
259d0 28 20 69 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30  ( i1>=0 || i2>=0
259e0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 31 3e 3d   ){.    if( i1>=
259f0 30 20 26 26 20 28 69 32 3c 30 20 7c 7c 20 69 52  0 && (i2<0 || iR
25a00 6f 77 69 64 31 3c 69 52 6f 77 69 64 32 29 20 29  owid1<iRowid2) )
25a10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25a20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69  iOut==0 || iRowi
25a30 64 31 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20  d1>iOut );.     
25a40 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
25a50 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74  ppendVarint(&out
25a60 2c 20 69 52 6f 77 69 64 31 20 2d 20 69 4f 75 74  , iRowid1 - iOut
25a70 29 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20  );.      iOut = 
25a80 69 52 6f 77 69 64 31 3b 0a 20 20 20 20 20 20 66  iRowid1;.      f
25a90 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c  ts5NextRowid(p1,
25aa0 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b   &i1, &iRowid1);
25ab0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25ac0 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d 3d    assert( iOut==
25ad0 30 20 7c 7c 20 69 52 6f 77 69 64 32 3e 69 4f 75  0 || iRowid2>iOu
25ae0 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  t );.      fts5B
25af0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
25b00 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77  arint(&out, iRow
25b10 69 64 32 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20  id2 - iOut);.   
25b20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69 64     iOut = iRowid
25b30 32 3b 0a 20 20 20 20 20 20 69 66 28 20 69 31 3e  2;.      if( i1>
25b40 3d 30 20 26 26 20 69 52 6f 77 69 64 31 3d 3d 69  =0 && iRowid1==i
25b50 52 6f 77 69 64 32 20 29 7b 0a 20 20 20 20 20 20  Rowid2 ){.      
25b60 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
25b70 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64  p1, &i1, &iRowid
25b80 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
25b90 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
25ba0 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64  p2, &i2, &iRowid
25bb0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  2);.    }.  }.. 
25bc0 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
25bd0 26 6f 75 74 2c 20 70 31 29 3b 0a 20 20 66 74 73  &out, p1);.  fts
25be0 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75 74  5BufferFree(&out
25bf0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66  );.}../*.** Buff
25c00 65 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f  ers p1 and p2 co
25c10 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20  ntain doclists. 
25c20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65  This function me
25c30 72 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  rges the content
25c40 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64  .** of the two d
25c50 6f 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72  oclists together
25c60 20 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72   and sets buffer
25c70 20 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c   p1 to the resul
25c80 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  t before.** retu
25c90 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
25ca0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
25cb0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
25cc0 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e  s left in p->rc.
25cd0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
25ce0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
25cf0 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
25d00 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
25d10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
25d20 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
25d30 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sts(.  Fts5Index
25d40 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
25d50 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
25d60 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
25d70 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
25d80 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
25d90 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74     /* First list
25da0 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46   to merge */.  F
25db0 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20  ts5Buffer *p2   
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25dd0 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f  * Second list to
25de0 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
25df0 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20  f( p2->n ){.    
25e00 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d  i64 iLastRowid =
25e10 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c   0;.    Fts5Docl
25e20 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20  istIter i1;.    
25e30 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
25e40 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  i2;.    Fts5Buff
25e50 65 72 20 6f 75 74 20 3d 20 7b 30 2c 20 30 2c 20  er out = {0, 0, 
25e60 30 7d 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  0};.    Fts5Buff
25e70 65 72 20 74 6d 70 20 3d 20 7b 30 2c 20 30 2c 20  er tmp = {0, 0, 
25e80 30 7d 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0};..    /* The 
25e90 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
25ea0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 65 71  the output is eq
25eb0 75 61 6c 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  ual to the sum o
25ec0 66 20 74 68 65 20 74 77 6f 20 0a 20 20 20 20 2a  f the two .    *
25ed0 2a 20 69 6e 70 75 74 20 73 69 7a 65 73 20 2b 20  * input sizes + 
25ee0 31 20 76 61 72 69 6e 74 20 28 39 20 62 79 74 65  1 varint (9 byte
25ef0 73 29 2e 20 54 68 65 20 65 78 74 72 61 20 76 61  s). The extra va
25f00 72 69 6e 74 20 69 73 20 62 65 63 61 75 73 65 20  rint is because 
25f10 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  if the.    ** fi
25f20 72 73 74 20 72 6f 77 69 64 20 69 6e 20 6f 6e 65  rst rowid in one
25f30 20 69 6e 70 75 74 20 69 73 20 61 20 6c 61 72 67   input is a larg
25f40 65 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  e negative numbe
25f50 72 2c 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  r, and the first
25f60 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f   in.    ** the o
25f70 74 68 65 72 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  ther a non-negat
25f80 69 76 65 20 6e 75 6d 62 65 72 2c 20 74 68 65 20  ive number, the 
25f90 64 65 6c 74 61 20 66 6f 72 20 74 68 65 20 6e 6f  delta for the no
25fa0 6e 2d 6e 65 67 61 74 69 76 65 0a 20 20 20 20 2a  n-negative.    *
25fb0 2a 20 6e 75 6d 62 65 72 20 77 69 6c 6c 20 62 65  * number will be
25fc0 20 6c 61 72 67 65 72 20 6f 6e 20 64 69 73 6b 20   larger on disk 
25fd0 74 68 61 6e 20 74 68 65 20 6c 69 74 65 72 61 6c  than the literal
25fe0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 20   integer value. 
25ff0 20 20 20 2a 2a 20 77 61 73 2e 20 20 0a 20 20 20     ** was.  .   
26000 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 72 2c 20 69   **.    ** Or, i
26010 66 20 74 68 65 20 69 6e 70 75 74 20 70 6f 73 69  f the input posi
26020 74 69 6f 6e 2d 6c 69 73 74 73 20 61 72 65 20 63  tion-lists are c
26030 6f 72 72 75 70 74 2c 20 74 68 65 6e 20 74 68 65  orrupt, then the
26040 20 6f 75 74 70 75 74 20 6d 69 67 68 74 0a 20 20   output might.  
26050 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 75 70 20    ** include up 
26060 74 6f 20 32 20 65 78 74 72 61 20 31 30 2d 62 79  to 2 extra 10-by
26070 74 65 20 70 6f 73 69 74 69 6f 6e 73 20 63 72 65  te positions cre
26080 61 74 65 64 20 62 79 20 69 6e 74 65 72 70 72 65  ated by interpre
26090 74 69 6e 67 20 2d 31 0a 20 20 20 20 2a 2a 20 28  ting -1.    ** (
260a0 74 68 65 20 76 61 6c 75 65 20 50 6f 73 6c 69 73  the value Poslis
260b0 74 4e 65 78 74 36 34 28 29 20 75 73 65 73 20 66  tNext64() uses f
260c0 6f 72 20 45 4f 46 29 20 61 73 20 61 20 70 6f 73  or EOF) as a pos
260d0 69 74 69 6f 6e 20 61 6e 64 20 61 70 70 65 6e 64  ition and append
260e0 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f  ing.    ** it to
260f0 20 74 68 65 20 6f 75 74 70 75 74 2e 20 54 68 69   the output. Thi
26100 73 20 63 61 6e 20 68 61 70 70 65 6e 20 61 74 20  s can happen at 
26110 6d 6f 73 74 20 6f 6e 63 65 20 66 6f 72 20 65 61  most once for ea
26120 63 68 20 69 6e 70 75 74 20 0a 20 20 20 20 2a 2a  ch input .    **
26130 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2c 20   position-list, 
26140 68 65 6e 63 65 20 74 77 6f 20 31 30 20 62 79 74  hence two 10 byt
26150 65 20 70 61 64 64 69 6e 67 73 2e 20 20 2a 2f 0a  e paddings.  */.
26160 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
26170 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
26180 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e  ->rc, &out, p1->
26190 6e 20 2b 20 70 32 2d 3e 6e 20 2b 20 39 2b 31 30  n + p2->n + 9+10
261a0 2b 31 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  +10) ) return;. 
261b0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
261c0 65 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b  erInit(p1, &i1);
261d0 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74  .    fts5Doclist
261e0 49 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32  IterInit(p2, &i2
261f0 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31  );..    while( 1
26200 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 31   ){.      if( i1
26210 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69  .iRowid<i2.iRowi
26220 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
26230 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
26240 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i1 */.        ft
26250 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
26260 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
26270 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
26280 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
26290 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
262a0 62 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c  b(&out, i1.aPosl
262b0 69 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  ist, i1.nPoslist
262c0 2b 69 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20  +i1.nSize);.    
262d0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
262e0 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
262f0 20 20 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f        if( i1.aPo
26300 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  slist==0 ) break
26310 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26320 28 20 6f 75 74 2e 6e 3c 3d 28 28 69 31 2e 61 50  ( out.n<=((i1.aP
26330 6f 73 6c 69 73 74 2d 70 31 2d 3e 70 29 20 2b 20  oslist-p1->p) + 
26340 28 69 32 2e 61 50 6f 73 6c 69 73 74 2d 70 32 2d  (i2.aPoslist-p2-
26350 3e 70 29 2b 39 2b 31 30 2b 31 30 29 20 29 3b 0a  >p)+9+10+10) );.
26360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
26370 73 65 20 69 66 28 20 69 32 2e 69 52 6f 77 69 64  se if( i2.iRowid
26380 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20  !=i1.iRowid ){. 
26390 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
263a0 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a  ntry from i2 */.
263b0 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
263c0 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75  eAppendDocid(&ou
263d0 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  t, iLastRowid, i
263e0 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
263f0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
26400 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
26410 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i2.aPoslist, i
26420 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53  2.nPoslist+i2.nS
26430 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ize);.        ft
26440 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
26450 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20  t(&i2);.        
26460 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d  if( i2.aPoslist=
26470 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
26480 20 20 20 20 61 73 73 65 72 74 28 20 6f 75 74 2e      assert( out.
26490 6e 3c 3d 28 28 69 31 2e 61 50 6f 73 6c 69 73 74  n<=((i1.aPoslist
264a0 2d 70 31 2d 3e 70 29 20 2b 20 28 69 32 2e 61 50  -p1->p) + (i2.aP
264b0 6f 73 6c 69 73 74 2d 70 32 2d 3e 70 29 2b 39 2b  oslist-p2->p)+9+
264c0 31 30 2b 31 30 29 20 29 3b 0a 20 20 20 20 20 20  10+10) );.      
264d0 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20  }.      else{.  
264e0 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74        /* Merge t
264f0 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20  he two position 
26500 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20  lists. */ .     
26510 20 20 20 69 36 34 20 69 50 6f 73 31 20 3d 20 30     i64 iPos1 = 0
26520 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 50  ;.        i64 iP
26530 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  os2 = 0;.       
26540 20 69 6e 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a   int iOff1 = 0;.
26550 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
26560 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  2 = 0;.        u
26570 38 20 2a 61 31 20 3d 20 26 69 31 2e 61 50 6f 73  8 *a1 = &i1.aPos
26580 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a  list[i1.nSize];.
26590 20 20 20 20 20 20 20 20 75 38 20 2a 61 32 20 3d          u8 *a2 =
265a0 20 26 69 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32   &i2.aPoslist[i2
265b0 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  .nSize];.       
265c0 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20   int nCopy;.    
265d0 20 20 20 20 75 38 20 2a 61 43 6f 70 79 3b 0a 0a      u8 *aCopy;..
265e0 20 20 20 20 20 20 20 20 69 36 34 20 69 50 72 65          i64 iPre
265f0 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 46  v = 0;.        F
26600 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72  ts5PoslistWriter
26610 20 77 72 69 74 65 72 3b 0a 20 20 20 20 20 20 20   writer;.       
26620 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c   memset(&writer,
26630 20 30 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65   0, sizeof(write
26640 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  r));..        /*
26650 20 53 65 65 20 74 68 65 20 65 61 72 6c 69 65 72   See the earlier
26660 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 74 68 69 73   comment in this
26670 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e   function for an
26680 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
26690 77 68 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  why.        ** c
266a0 6f 72 72 75 70 74 20 69 6e 70 75 74 20 70 6f 73  orrupt input pos
266b0 69 74 69 6f 6e 20 6c 69 73 74 73 20 6d 69 67 68  ition lists migh
266c0 74 20 63 61 75 73 65 20 74 68 65 20 6f 75 74 70  t cause the outp
266d0 75 74 20 74 6f 20 63 6f 6e 73 75 6d 65 0a 20 20  ut to consume.  
266e0 20 20 20 20 20 20 2a 2a 20 61 74 20 6d 6f 73 74        ** at most
266f0 20 32 30 20 62 79 74 65 73 20 6f 66 20 75 6e 65   20 bytes of une
26700 78 70 65 63 74 65 64 20 73 70 61 63 65 2e 20 2a  xpected space. *
26710 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  /.        fts5Me
26720 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
26730 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
26740 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i2.iRowid);.   
26750 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
26760 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20  ero(&tmp);.     
26770 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
26780 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
26790 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c 69   &tmp, i1.nPosli
267a0 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69 73 74  st + i2.nPoslist
267b0 20 2b 20 31 30 20 2b 20 31 30 29 3b 0a 20 20 20   + 10 + 10);.   
267c0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
267d0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
267e0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
267f0 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31  istNext64(a1, i1
26800 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
26810 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20  1, &iPos1);.    
26820 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26830 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c  oslistNext64(a2,
26840 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i2.nPoslist, &i
26850 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20  Off2, &iPos2);. 
26860 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
26870 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50  ( iPos1>=0 && iP
26880 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20 20 20 20 20  os2>=0 );..     
26890 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50 6f     if( iPos1<iPo
268a0 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s2 ){.          
268b0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
268c0 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d  stSafeAppend(&tm
268d0 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31  p, &iPrev, iPos1
268e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
268f0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
26900 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f  ext64(a1, i1.nPo
26910 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26  slist, &iOff1, &
26920 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
26930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26940 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
26950 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74  istSafeAppend(&t
26960 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73  mp, &iPrev, iPos
26970 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  2);.          sq
26980 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26990 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50  Next64(a2, i2.nP
269a0 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20  oslist, &iOff2, 
269b0 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20  &iPos2);.       
269c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
269d0 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32  Pos1>=0 && iPos2
269e0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
269f0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
26a00 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
26a10 73 31 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20  s1<iPos2 ){.    
26a20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
26a30 6f 73 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20  os1!=iPrev ){.  
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26a50 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26a60 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
26a70 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b   &iPrev, iPos1);
26a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
26aa0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
26ab0 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e  tNext64(a1, i1.n
26ac0 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c  Poslist, &iOff1,
26ad0 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20   &iPos1);.      
26ae0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
26af0 31 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  1<0 ) break;.   
26b00 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
26b20 73 65 72 74 5f 6e 63 28 20 69 50 6f 73 32 21 3d  sert_nc( iPos2!=
26b30 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20 20  iPrev );.       
26b40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
26b50 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70  s5PoslistSafeApp
26b60 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76  end(&tmp, &iPrev
26b70 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20  , iPos2);.      
26b80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
26b90 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
26ba0 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  (a2, i2.nPoslist
26bb0 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32  , &iOff2, &iPos2
26bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26bd0 20 69 66 28 20 69 50 6f 73 32 3c 30 20 29 20 62   if( iPos2<0 ) b
26be0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
26bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
26c00 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
26c10 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d 30 20     if( iPos1>=0 
26c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
26c30 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29 7b   iPos1!=iPrev ){
26c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26c50 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
26c60 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
26c70 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a  &iPrev, iPos1);.
26c80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26c90 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20 26 61        aCopy = &a
26ca0 31 5b 69 4f 66 66 31 5d 3b 0a 20 20 20 20 20 20  1[iOff1];.      
26cb0 20 20 20 20 6e 43 6f 70 79 20 3d 20 69 31 2e 6e      nCopy = i1.n
26cc0 50 6f 73 6c 69 73 74 20 2d 20 69 4f 66 66 31 3b  Poslist - iOff1;
26cd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26ce0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26cf0 5f 6e 63 28 20 69 50 6f 73 32 3e 3d 30 20 26 26  _nc( iPos2>=0 &&
26d00 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29 3b   iPos2!=iPrev );
26d10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26d20 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66  e3Fts5PoslistSaf
26d30 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69  eAppend(&tmp, &i
26d40 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20  Prev, iPos2);.  
26d50 20 20 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20          aCopy = 
26d60 26 61 32 5b 69 4f 66 66 32 5d 3b 0a 20 20 20 20  &a2[iOff2];.    
26d70 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 69 32        nCopy = i2
26d80 2e 6e 50 6f 73 6c 69 73 74 20 2d 20 69 4f 66 66  .nPoslist - iOff
26d90 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
26da0 20 20 20 20 20 69 66 28 20 6e 43 6f 70 79 3e 30       if( nCopy>0
26db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
26dc0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
26dd0 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20 61 43 6f  ndBlob(&tmp, aCo
26de0 70 79 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  py, nCopy);.    
26df0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
26e00 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
26e10 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ZE */.        as
26e20 73 65 72 74 5f 6e 63 28 20 74 6d 70 2e 6e 3c 3d  sert_nc( tmp.n<=
26e30 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e  i1.nPoslist+i2.n
26e40 50 6f 73 6c 69 73 74 20 29 3b 0a 20 20 20 20 20  Poslist );.     
26e50 20 20 20 61 73 73 65 72 74 28 20 74 6d 70 2e 6e     assert( tmp.n
26e60 3c 3d 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69 32  <=i1.nPoslist+i2
26e70 2e 6e 50 6f 73 6c 69 73 74 2b 31 30 2b 31 30 20  .nPoslist+10+10 
26e80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  );.        if( t
26e90 6d 70 2e 6e 3e 69 31 2e 6e 50 6f 73 6c 69 73 74  mp.n>i1.nPoslist
26ea0 2b 69 32 2e 6e 50 6f 73 6c 69 73 74 20 29 7b 0a  +i2.nPoslist ){.
26eb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
26ec0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
26ed0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
26ee0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
26ef0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26f00 7d 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  }.        fts5Bu
26f10 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
26f20 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e  rint(&out, tmp.n
26f30 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66   * 2);.        f
26f40 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
26f50 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d  endBlob(&out, tm
26f60 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20  p.p, tmp.n);.   
26f70 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
26f80 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20  IterNext(&i1);. 
26f90 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69         fts5Docli
26fa0 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b  stIterNext(&i2);
26fb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f  .        assert_
26fc0 6e 63 28 20 6f 75 74 2e 6e 3c 3d 28 70 31 2d 3e  nc( out.n<=(p1->
26fd0 6e 2b 70 32 2d 3e 6e 2b 39 29 20 29 3b 0a 20 20  n+p2->n+9) );.  
26fe0 20 20 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f        if( i1.aPo
26ff0 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 61  slist==0 || i2.a
27000 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65  Poslist==0 ) bre
27010 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
27020 72 74 28 20 6f 75 74 2e 6e 3c 3d 28 28 69 31 2e  rt( out.n<=((i1.
27030 61 50 6f 73 6c 69 73 74 2d 70 31 2d 3e 70 29 20  aPoslist-p1->p) 
27040 2b 20 28 69 32 2e 61 50 6f 73 6c 69 73 74 2d 70  + (i2.aPoslist-p
27050 32 2d 3e 70 29 2b 39 2b 31 30 2b 31 30 29 20 29  2->p)+9+10+10) )
27060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27070 0a 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73  .    if( i1.aPos
27080 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74  list ){.      ft
27090 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
270a0 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
270b0 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
270c0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
270d0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
270e0 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73  &out, i1.aPoslis
270f0 74 2c 20 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e  t, i1.aEof - i1.
27100 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d  aPoslist);.    }
27110 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32  .    else if( i2
27120 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20  .aPoslist ){.   
27130 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
27140 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
27150 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
27160 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35  wid);.      fts5
27170 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
27180 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50  Blob(&out, i2.aP
27190 6f 73 6c 69 73 74 2c 20 69 32 2e 61 45 6f 66 20  oslist, i2.aEof 
271a0 2d 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a  - i2.aPoslist);.
271b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
271c0 5f 6e 63 28 20 6f 75 74 2e 6e 3c 3d 28 70 31 2d  _nc( out.n<=(p1-
271d0 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20 29 3b 0a 0a  >n+p2->n+9) );..
271e0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
271f0 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75  t(&p->rc, p1, ou
27200 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20  t.n, out.p);.   
27210 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
27220 26 74 6d 70 29 3b 0a 20 20 20 20 66 74 73 35 42  &tmp);.    fts5B
27230 75 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b  ufferFree(&out);
27240 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
27250 6f 69 64 20 66 74 73 35 53 65 74 75 70 50 72 65  oid fts5SetupPre
27260 66 69 78 49 74 65 72 28 0a 20 20 46 74 73 35 49  fixIter(.  Fts5I
27270 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
27280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27290 64 65 78 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  dex to read from
272a0 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c   */.  int bDesc,
272b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
272d0 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69  r "ORDER BY rowi
272e0 64 20 44 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e  d DESC" */.  con
272f0 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20  st u8 *pToken,  
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27310 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
27320 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61 74 63  g prefix to matc
27330 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65  h */.  int nToke
27340 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
27350 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
27360 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65 6e 20  f buffer pToken 
27370 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46 74  in bytes */.  Ft
27380 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
27390 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
273a0 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68 65   Restrict matche
273b0 73 20 74 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d  s to these colum
273c0 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72  ns */.  Fts5Iter
273d0 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20   **ppIter       
273e0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69     /* OUT: New i
273f0 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20  terator */.){.  
27400 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
27410 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 42 75  Struct;.  Fts5Bu
27420 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f  ffer *aBuf;.  co
27430 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d 20 33  nst int nBuf = 3
27440 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 4d 65  2;..  void (*xMe
27450 72 67 65 29 28 46 74 73 35 49 6e 64 65 78 2a 2c  rge)(Fts5Index*,
27460 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 46 74   Fts5Buffer*, Ft
27470 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 76 6f  s5Buffer*);.  vo
27480 69 64 20 28 2a 78 41 70 70 65 6e 64 29 28 46 74  id (*xAppend)(Ft
27490 73 35 49 6e 64 65 78 2a 2c 20 69 36 34 2c 20 46  s5Index*, i64, F
274a0 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 42 75  ts5Iter*, Fts5Bu
274b0 66 66 65 72 2a 29 3b 0a 20 20 69 66 28 20 70 2d  ffer*);.  if( p-
274c0 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
274d0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
274e0 4f 4e 45 20 29 7b 0a 20 20 20 20 78 4d 65 72 67  ONE ){.    xMerg
274f0 65 20 3d 20 66 74 73 35 4d 65 72 67 65 52 6f 77  e = fts5MergeRow
27500 69 64 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70  idLists;.    xAp
27510 70 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e  pend = fts5Appen
27520 64 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b  dRowid;.  }else{
27530 0a 20 20 20 20 78 4d 65 72 67 65 20 3d 20 66 74  .    xMerge = ft
27540 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
27550 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e 64 20  ts;.    xAppend 
27560 3d 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c  = fts5AppendPosl
27570 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 42 75 66  ist;.  }..  aBuf
27580 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29   = (Fts5Buffer*)
27590 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
275a0 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
275b0 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74  er)*nBuf);.  pSt
275c0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
275d0 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20  tureRead(p);..  
275e0 69 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72  if( aBuf && pStr
275f0 75 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  uct ){.    const
27600 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
27610 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
27620 4e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N .             
27630 20 20 20 20 20 20 20 7c 20 46 54 53 35 49 4e 44         | FTS5IND
27640 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50  EX_QUERY_SKIPEMP
27650 54 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  TY .            
27660 20 20 20 20 20 20 20 20 7c 20 46 54 53 35 49 4e          | FTS5IN
27670 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50  DEX_QUERY_NOOUTP
27680 55 54 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  UT;.    int i;. 
27690 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69     i64 iLastRowi
276a0 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 49  d = 0;.    Fts5I
276b0 74 65 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20  ter *p1 = 0;    
276c0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65   /* Iterator use
276d0 64 20 74 6f 20 67 61 74 68 65 72 20 64 61 74 61  d to gather data
276e0 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20   from index */. 
276f0 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61     Fts5Data *pDa
27700 74 61 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  ta;.    Fts5Buff
27710 65 72 20 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20  er doclist;.    
27720 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 31  int bNewTerm = 1
27730 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ;..    memset(&d
27740 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f  oclist, 0, sizeo
27750 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20  f(doclist));.   
27760 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
27770 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c  w(p, pStruct, fl
27780 61 67 73 2c 20 70 43 6f 6c 73 65 74 2c 20 70 54  ags, pColset, pT
27790 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31  oken, nToken, -1
277a0 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 66  , 0, &p1);.    f
277b0 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
277c0 43 62 28 26 70 2d 3e 72 63 2c 20 70 31 29 3b 0a  Cb(&p->rc, p1);.
277d0 20 20 20 20 66 6f 72 28 20 2f 2a 20 6e 6f 2d 6f      for( /* no-o
277e0 70 20 2a 2f 20 3b 0a 20 20 20 20 20 20 20 20 66  p */ ;.        f
277f0 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
27800 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20  p, p1)==0;.     
27810 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
27820 4e 65 78 74 32 28 70 2c 20 70 31 2c 20 26 62 4e  Next2(p, p1, &bN
27830 65 77 54 65 72 6d 29 0a 20 20 20 20 29 7b 0a 20  ewTerm).    ){. 
27840 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
27850 20 2a 70 53 65 67 20 3d 20 26 70 31 2d 3e 61 53   *pSeg = &p1->aS
27860 65 67 5b 20 70 31 2d 3e 61 46 69 72 73 74 5b 31  eg[ p1->aFirst[1
27870 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
27880 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 53    int nTerm = pS
27890 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20  eg->term.n;.    
278a0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
278b0 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70  m = pSeg->term.p
278c0 3b 0a 20 20 20 20 20 20 70 31 2d 3e 78 53 65 74  ;.      p1->xSet
278d0 4f 75 74 70 75 74 73 28 70 31 2c 20 70 53 65 67  Outputs(p1, pSeg
278e0 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
278f0 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b  _nc( memcmp(pTok
27900 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e  en, pTerm, MIN(n
27910 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d  Token, nTerm))<=
27920 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  0 );.      if( b
27930 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  NewTerm ){.     
27940 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f     if( nTerm<nTo
27950 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54  ken || memcmp(pT
27960 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f  oken, pTerm, nTo
27970 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ken) ) break;.  
27980 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
27990 20 70 31 2d 3e 62 61 73 65 2e 6e 44 61 74 61 3d   p1->base.nData=
279a0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
279b0 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 62 61        if( p1->ba
279c0 73 65 2e 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74  se.iRowid<=iLast
279d0 52 6f 77 69 64 20 26 26 20 64 6f 63 6c 69 73 74  Rowid && doclist
279e0 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  .n>0 ){.        
279f0 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
27a00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63  SQLITE_OK && doc
27a10 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  list.n; i++){.  
27a20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27a30 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  i<nBuf );.      
27a40 20 20 20 20 69 66 28 20 61 42 75 66 5b 69 5d 2e      if( aBuf[i].
27a50 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
27a60 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 77      fts5BufferSw
27a70 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26 61 42  ap(&doclist, &aB
27a80 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
27a90 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
27aa0 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  ro(&doclist);.  
27ab0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27ac0 20 20 20 20 20 20 20 20 20 20 20 78 4d 65 72 67             xMerg
27ad0 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26  e(p, &doclist, &
27ae0 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
27af0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
27b00 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a  Zero(&aBuf[i]);.
27b10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27b20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4c      }.        iL
27b30 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
27b40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 78 41 70      }..      xAp
27b50 70 65 6e 64 28 70 2c 20 70 31 2d 3e 62 61 73 65  pend(p, p1->base
27b60 2e 69 52 6f 77 69 64 2d 69 4c 61 73 74 52 6f 77  .iRowid-iLastRow
27b70 69 64 2c 20 70 31 2c 20 26 64 6f 63 6c 69 73 74  id, p1, &doclist
27b80 29 3b 0a 20 20 20 20 20 20 69 4c 61 73 74 52 6f  );.      iLastRo
27b90 77 69 64 20 3d 20 70 31 2d 3e 62 61 73 65 2e 69  wid = p1->base.i
27ba0 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  Rowid;.    }..  
27bb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75    for(i=0; i<nBu
27bc0 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  f; i++){.      i
27bd0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
27be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 78  _OK ){.        x
27bf0 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73  Merge(p, &doclis
27c00 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
27c10 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
27c20 42 75 66 66 65 72 46 72 65 65 28 26 61 42 75 66  BufferFree(&aBuf
27c30 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
27c40 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
27c50 65 28 70 31 29 3b 0a 0a 20 20 20 20 70 44 61 74  e(p1);..    pDat
27c60 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f  a = fts5IdxMallo
27c70 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
27c80 44 61 74 61 29 2b 64 6f 63 6c 69 73 74 2e 6e 2b  Data)+doclist.n+
27c90 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
27ca0 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 69 66 28  ADDING);.    if(
27cb0 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
27cc0 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29  pData->p = (u8*)
27cd0 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20  &pData[1];.     
27ce0 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61   pData->nn = pDa
27cf0 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63  ta->szLeaf = doc
27d00 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 69 66  list.n;.      if
27d10 28 20 64 6f 63 6c 69 73 74 2e 6e 20 29 20 6d 65  ( doclist.n ) me
27d20 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64  mcpy(pData->p, d
27d30 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73  oclist.p, doclis
27d40 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35  t.n);.      fts5
27d50 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c  MultiIterNew2(p,
27d60 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70   pData, bDesc, p
27d70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
27d80 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
27d90 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a  (&doclist);.  }.
27da0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
27db0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
27dc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
27dd0 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  (aBuf);.}.../*.*
27de0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
27df0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63  all subsequent c
27e00 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46  alls to sqlite3F
27e10 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20  ts5IndexWrite() 
27e20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68  pertain.** to th
27e30 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
27e40 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f  rowid iRowid..*/
27e50 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
27e60 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28  IndexBeginWrite(
27e70 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
27e80 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69  t bDelete, i64 i
27e90 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74  Rowid){.  assert
27ea0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
27eb0 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  OK );..  /* Allo
27ec0 63 61 74 65 20 74 68 65 20 68 61 73 68 20 74 61  cate the hash ta
27ed0 62 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ble if it has no
27ee0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  t already been a
27ef0 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66  llocated */.  if
27f00 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b  ( p->pHash==0 ){
27f10 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
27f20 69 74 65 33 46 74 73 35 48 61 73 68 4e 65 77 28  ite3Fts5HashNew(
27f30 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e  p->pConfig, &p->
27f40 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64  pHash, &p->nPend
27f50 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  ingData);.  }.. 
27f60 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61   /* Flush the ha
27f70 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
27f80 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
27f90 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e    if( iRowid<p->
27fa0 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20  iWriteRowid .   
27fb0 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69  || (iRowid==p->i
27fc0 57 72 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d  WriteRowid && p-
27fd0 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20  >bDelete==0).   
27fe0 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  || (p->nPendingD
27ff0 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67  ata > p->pConfig
28000 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20 20  ->nHashSize) .  
28010 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
28020 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20  Flush(p);.  }.. 
28030 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20   p->iWriteRowid 
28040 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62  = iRowid;.  p->b
28050 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65  Delete = bDelete
28060 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
28070 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
28080 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64  ../*.** Commit d
28090 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ata to disk..*/.
280a0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
280b0 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64  ndexSync(Fts5Ind
280c0 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ex *p){.  assert
280d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
280e0 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  OK );.  fts5Inde
280f0 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 66 74 73  xFlush(p);.  fts
28100 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
28110 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
28120 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
28130 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61  ./*.** Discard a
28140 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  ny data stored i
28150 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
28160 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20  hash tables. Do 
28170 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20  not write it.** 
28180 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
28190 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61   Additionally, a
281a0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63  ssume that the c
281b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25  ontents of the %
281c0 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d  _data.** table m
281d0 61 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  ay have changed 
281e0 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20  on disk. So any 
281f0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73  in-memory caches
28200 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72   of %_data .** r
28210 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69  ecords must be i
28220 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69  nvalidated..*/.i
28230 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
28240 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35  dexRollback(Fts5
28250 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73  Index *p){.  fts
28260 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
28270 0a 20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63  .  fts5IndexDisc
28280 61 72 64 44 61 74 61 28 70 29 3b 0a 20 20 66 74  ardData(p);.  ft
28290 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
282a0 69 64 61 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61  idate(p);.  /* a
282b0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
282c0 4c 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20  LITE_OK ); */.  
282d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
282e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25  ;.}../*.** The %
282f0 5f 64 61 74 61 20 74 61 62 6c 65 20 69 73 20 63  _data table is c
28300 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20  ompletely empty 
28310 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
28320 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  on is called. Th
28330 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  is.** function p
28340 6f 70 75 6c 61 74 65 73 20 69 74 20 77 69 74 68  opulates it with
28350 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72   the initial str
28360 75 63 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66  ucture objects f
28370 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a  or each index,.*
28380 2a 20 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61  * and the initia
28390 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  l version of the
283a0 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
283b0 72 64 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20  rd (a zero-byte 
283c0 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  blob)..*/.int sq
283d0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
283e0 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a  init(Fts5Index *
283f0 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
28400 75 72 65 20 73 3b 0a 20 20 66 74 73 35 53 74 72  ure s;.  fts5Str
28410 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
28420 28 70 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  (p);.  memset(&s
28430 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
28440 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20 20 66  Structure));.  f
28450 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
28460 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
28470 57 49 44 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  WID, (const u8*)
28480 22 22 2c 20 30 29 3b 0a 20 20 66 74 73 35 53 74  "", 0);.  fts5St
28490 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
284a0 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  &s);.  return ft
284b0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
284c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
284d0 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20  a new Fts5Index 
284e0 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62  handle. If the b
284f0 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20  Create argument 
28500 69 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a  is true, create.
28510 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
28520 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
28530 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
28540 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
28550 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ul, set *pp to p
28560 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
28570 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
28580 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
28590 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a  Otherwise, set *
285a0 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72  pp to NULL and r
285b0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
285c0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
285d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
285e0 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43  dexOpen(.  Fts5C
285f0 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20  onfig *pConfig, 
28600 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20  .  int bCreate, 
28610 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70  .  Fts5Index **p
28620 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  p,.  char **pzEr
28630 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
28640 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
28650 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20  5Index *p;      
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28670 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  New object */.. 
28680 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35   *pp = p = (Fts5
28690 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 46 74  Index*)sqlite3Ft
286a0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
286b0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  , sizeof(Fts5Ind
286c0 65 78 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex));.  if( rc==
286d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
286e0 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43   p->pConfig = pC
286f0 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57  onfig;.    p->nW
28700 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53 35 5f 57  orkUnit = FTS5_W
28710 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d  ORK_UNIT;.    p-
28720 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73 71 6c 69  >zDataTbl = sqli
28730 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26  te3Fts5Mprintf(&
28740 72 63 2c 20 22 25 73 5f 64 61 74 61 22 2c 20 70  rc, "%s_data", p
28750 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a  Config->zName);.
28760 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61      if( p->zData
28770 54 62 6c 20 26 26 20 62 43 72 65 61 74 65 20 29  Tbl && bCreate )
28780 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
28790 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
287a0 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  ble(.          p
287b0 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20  Config, "data", 
287c0 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  "id INTEGER PRIM
287d0 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
287e0 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20  LOB", 0, pzErr. 
287f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
28800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28810 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28820 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
28830 65 54 61 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20  eTable(pConfig, 
28840 22 69 64 78 22 2c 20 0a 20 20 20 20 20 20 20 20  "idx", .        
28850 20 20 20 20 22 73 65 67 69 64 2c 20 74 65 72 6d      "segid, term
28860 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20  , pgno, PRIMARY 
28870 4b 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29  KEY(segid, term)
28880 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
28890 31 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 20  1, pzErr.       
288a0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
288b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
288c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
288d0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
288e0 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a 20  ndexReinit(p);. 
288f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28900 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ..  assert( rc!=
28910 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
28920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
28930 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
28940 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28950 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a  xClose(p);.    *
28960 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  pp = 0;.  }.  re
28970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28980 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  * Close a handle
28990 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61   opened by an ea
289a0 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71  rlier call to sq
289b0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
289c0 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
289d0 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f  ite3Fts5IndexClo
289e0 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  se(Fts5Index *p)
289f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
28a00 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
28a10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
28a20 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a  ->pReader==0 );.
28a30 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
28a40 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
28a50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
28a60 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29  lize(p->pWriter)
28a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
28a80 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74  nalize(p->pDelet
28a90 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
28aa0 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64  _finalize(p->pId
28ab0 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71  xWriter);.    sq
28ac0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
28ad0 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a  ->pIdxDeleter);.
28ae0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
28af0 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53 65 6c 65  lize(p->pIdxSele
28b00 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
28b10 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61  _finalize(p->pDa
28b20 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20  taVersion);.    
28b30 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 46  sqlite3Fts5HashF
28b40 72 65 65 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20  ree(p->pHash);. 
28b50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28b60 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20  p->zDataTbl);.  
28b70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28b80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
28b90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  rc;.}../*.** Arg
28ba0 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74  ument p points t
28bb0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
28bc0 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74  ining utf-8 text
28bd0 20 74 68 61 74 20 69 73 20 6e 20 62 79 74 65 73   that is n bytes
28be0 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65   in .** size. Re
28bf0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
28c00 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
28c10 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 20  nChar character 
28c20 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a  prefix of the.**
28c30 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66   buffer, or 0 if
28c40 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20   there are less 
28c50 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61  than nChar chara
28c60 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a  cters in total..
28c70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
28c80 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
28c90 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74  Bytelen(.  const
28ca0 20 63 68 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74   char *p, .  int
28cb0 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e   nByte, .  int n
28cc0 43 68 61 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20  Char.){.  int n 
28cd0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
28ce0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72  for(i=0; i<nChar
28cf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
28d00 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72  n>=nByte ) retur
28d10 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70  n 0;      /* Inp
28d20 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ut contains fewe
28d30 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61  r than nChar cha
28d40 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75  rs */.    if( (u
28d50 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e  nsigned char)p[n
28d60 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ++]>=0xc0 ){.   
28d70 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20     while( (p[n] 
28d80 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b  & 0xc0)==0x80 ){
28d90 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
28da0 20 20 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79        if( n>=nBy
28db0 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  te ) break;.    
28dc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
28dd0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
28de0 2a 2a 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d  ** pIn is a UTF-
28df0 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  8 encoded string
28e00 2c 20 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73  , nIn bytes in s
28e10 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ize. Return the 
28e20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69  number of.** uni
28e30 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73 20  code characters 
28e40 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a  in the string..*
28e50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
28e60 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f  5IndexCharlen(co
28e70 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69  nst char *pIn, i
28e80 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  nt nIn){.  int n
28e90 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Char = 0;       
28ea0 20 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20       .  int i = 
28eb0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49  0;.  while( i<nI
28ec0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e  n ){.    if( (un
28ed0 73 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b  signed char)pIn[
28ee0 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20  i++]>=0xc0 ){.  
28ef0 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e      while( i<nIn
28f00 20 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78   && (pIn[i] & 0x
28f10 63 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b  c0)==0x80 ) i++;
28f20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72  .    }.    nChar
28f30 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
28f40 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nChar;.}../*.**
28f50 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76   Insert or remov
28f60 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f  e data to or fro
28f70 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63  m the index. Eac
28f80 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e  h time a documen
28f90 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74  t is .** added t
28fa0 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f  o or removed fro
28fb0 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69  m the index, thi
28fc0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
28fd0 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  lled one or more
28fe0 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a  .** times..**.**
28ff0 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20   For an insert, 
29000 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
29010 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
29020 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77  token in the new
29030 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66   document..** If
29040 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
29050 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d  s a delete, it m
29060 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61  ust be called (a
29070 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f  t least) once fo
29080 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65  r each.** unique
29090 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f   token in the do
290a0 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69  cument with an i
290b0 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74  Col value less t
290c0 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50  han zero. The iP
290d0 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  os.** argument i
290e0 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20  s ignored for a 
290f0 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73  delete..*/.int s
29100 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57  qlite3Fts5IndexW
29110 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rite(.  Fts5Inde
29120 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
29130 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
29140 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
29150 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65    /* Column toke
29180 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76  n appears in (-v
29190 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a  e -> delete) */.
291a0 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20    int iPos,     
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291c0 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66    /* Position of
291d0 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f   token within co
291e0 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
291f0 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
29200 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b  t nToken  /* Tok
29210 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d  en to add or rem
29220 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69  ove to or from i
29230 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ndex */.){.  int
29240 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29260 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
29270 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20  through indexes 
29280 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
29290 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
292a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
292b0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e  ode */.  Fts5Con
292c0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
292d0 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73  ->pConfig;..  as
292e0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
292f0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
29300 72 74 28 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d  rt( (iCol<0)==p-
29310 3e 62 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f  >bDelete );..  /
29320 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20  * Add the entry 
29330 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d  to the main term
29340 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63  s index. */.  rc
29350 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
29360 73 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70  shWrite(.      p
29370 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69  ->pHash, p->iWri
29380 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
29390 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50  Pos, FTS5_MAIN_P
293a0 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e  REFIX, pToken, n
293b0 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f  Token.  );..  fo
293c0 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67  r(i=0; i<pConfig
293d0 2d 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d  ->nPrefix && rc=
293e0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
293f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
29400 6e 43 68 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d  nChar = pConfig-
29410 3e 61 50 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20  >aPrefix[i];.   
29420 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
29430 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 68 61  ite3Fts5IndexCha
29440 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54  rlenToBytelen(pT
29450 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43  oken, nToken, nC
29460 68 61 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  har);.    if( nB
29470 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  yte ){.      rc 
29480 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
29490 68 57 72 69 74 65 28 70 2d 3e 70 48 61 73 68 2c  hWrite(p->pHash,
294a0 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69   .          p->i
294b0 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c  WriteRowid, iCol
294c0 2c 20 69 50 6f 73 2c 20 28 63 68 61 72 29 28 46  , iPos, (char)(F
294d0 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b  TS5_MAIN_PREFIX+
294e0 69 2b 31 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20  i+1), pToken,.  
294f0 20 20 20 20 20 20 20 20 6e 42 79 74 65 0a 20 20          nByte.  
29500 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
29510 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
29520 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
29530 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69  ew iterator to i
29540 74 65 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c  terate though al
29550 6c 20 72 6f 77 69 64 20 74 68 61 74 20 6d 61 74  l rowid that mat
29560 63 68 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69  ch the .** speci
29570 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f  fied token or to
29580 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69  ken prefix..*/.i
29590 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
295a0 64 65 78 51 75 65 72 79 28 0a 20 20 46 74 73 35  dexQuery(.  Fts5
295b0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
295c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
295d0 54 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72  TS index to quer
295e0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
295f0 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
29600 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20  Token, /* Token 
29610 28 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20 71  (or prefix) to q
29620 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  uery for */.  in
29630 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
29640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29650 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44   Mask of FTS5IND
29660 45 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73  EX_QUERY_X flags
29670 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
29680 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20   *pColset,      
29690 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74        /* Match t
296a0 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c  hese columns onl
296b0 79 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  y */.  Fts5Index
296c0 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
296d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
296e0 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  ew iterator obje
296f0 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43  ct */.){.  Fts5C
29700 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
29710 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46   p->pConfig;.  F
29720 74 73 35 49 74 65 72 20 2a 70 52 65 74 20 3d 20  ts5Iter *pRet = 
29730 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  0;.  Fts5Buffer 
29740 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  buf = {0, 0, 0};
29750 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55  ..  /* If the QU
29760 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73  ERY_SCAN flag is
29770 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20   set, all other 
29780 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c  flags must be cl
29790 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ear. */.  assert
297a0 28 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  ( (flags & FTS5I
297b0 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
297c0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54  ==0 || flags==FT
297d0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
297e0 41 4e 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  AN );..  if( sql
297f0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
29800 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ze(&p->rc, &buf,
29810 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b   nToken+1)==0 ){
29820 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20  .    int iIdx = 
29830 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
29840 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73     /* Index to s
29850 65 61 72 63 68 20 2a 2f 0a 20 20 20 20 69 66 28  earch */.    if(
29860 20 6e 54 6f 6b 65 6e 20 29 20 6d 65 6d 63 70 79   nToken ) memcpy
29870 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b  (&buf.p[1], pTok
29880 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20  en, nToken);..  
29890 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
298a0 77 68 69 63 68 20 69 6e 64 65 78 20 74 6f 20 73  which index to s
298b0 65 61 72 63 68 20 61 6e 64 20 73 65 74 20 69 49  earch and set iI
298c0 64 78 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  dx accordingly. 
298d0 49 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  If this.    ** i
298e0 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79  s a prefix query
298f0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65   for which there
29900 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20 69 6e   is no prefix in
29910 64 65 78 2c 20 73 65 74 20 69 49 64 78 20 74 6f  dex, set iIdx to
29920 0a 20 20 20 20 2a 2a 20 67 72 65 61 74 65 72 20  .    ** greater 
29930 74 68 61 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50  than pConfig->nP
29940 72 65 66 69 78 20 74 6f 20 69 6e 64 69 63 61 74  refix to indicat
29950 65 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79  e that the query
29960 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20   will be.    ** 
29970 73 61 74 69 73 66 69 65 64 20 62 79 20 73 63 61  satisfied by sca
29980 6e 6e 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74  nning multiple t
29990 65 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  erms in the main
299a0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   index..    **. 
299b0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 51 55 45     ** If the QUE
299c0 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c  RY_TEST_NOIDX fl
299d0 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64  ag was specified
299e0 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74  , then this must
299f0 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65   be a.    ** pre
29a00 66 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65  fix-query. Inste
29a10 61 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72  ad of using a pr
29a20 65 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f  efix-index (if o
29a30 6e 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20  ne exists), .   
29a40 20 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65   ** evaluate the
29a50 20 70 72 65 66 69 78 20 71 75 65 72 79 20 75 73   prefix query us
29a60 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53  ing the main FTS
29a70 20 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20   index. This is 
29a80 75 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20  used.    ** for 
29a90 69 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20  internal sanity 
29aa0 63 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20  checking by the 
29ab0 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
29ac0 69 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a  in debug .    **
29ad0 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a   mode only.  */.
29ae0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
29af0 42 55 47 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  BUG.    if( pCon
29b00 66 69 67 2d 3e 62 50 72 65 66 69 78 49 6e 64 65  fig->bPrefixInde
29b10 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  x==0 || (flags &
29b20 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
29b30 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a  _TEST_NOIDX) ){.
29b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
29b50 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
29b60 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 3b 0a  QUERY_PREFIX );.
29b70 20 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b 70        iIdx = 1+p
29b80 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
29b90 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
29ba0 66 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  f.    if( flags 
29bb0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
29bc0 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20  Y_PREFIX ){.    
29bd0 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74    int nChar = ft
29be0 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70  s5IndexCharlen(p
29bf0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
29c00 20 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31        for(iIdx=1
29c10 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ; iIdx<=pConfig-
29c20 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b  >nPrefix; iIdx++
29c30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29c40 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
29c50 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29  iIdx-1]==nChar )
29c60 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
29c70 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
29c80 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
29c90 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 2f  refix ){.      /
29ca0 2a 20 53 74 72 61 69 67 68 74 20 69 6e 64 65 78  * Straight index
29cb0 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20   lookup */.     
29cc0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
29cd0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
29ce0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
29cf0 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d        buf.p[0] =
29d00 20 28 75 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f   (u8)(FTS5_MAIN_
29d10 50 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a  PREFIX + iIdx);.
29d20 20 20 20 20 20 20 69 66 28 20 70 53 74 72 75 63        if( pStruc
29d30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  t ){.        fts
29d40 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
29d50 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 20   pStruct, flags 
29d60 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  | FTS5INDEX_QUER
29d70 59 5f 53 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20  Y_SKIPEMPTY, .  
29d80 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 73 65            pColse
29d90 74 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e  t, buf.p, nToken
29da0 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74  +1, -1, 0, &pRet
29db0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
29dc0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
29dd0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
29de0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53  else{.      /* S
29e00 63 61 6e 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  can multiple ter
29e10 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69  ms in the main i
29e20 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
29e30 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73  t bDesc = (flags
29e40 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
29e50 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20  RY_DESC)!=0;.   
29e60 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54     buf.p[0] = FT
29e70 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a  S5_MAIN_PREFIX;.
29e80 20 20 20 20 20 20 66 74 73 35 53 65 74 75 70 50        fts5SetupP
29e90 72 65 66 69 78 49 74 65 72 28 70 2c 20 62 44 65  refixIter(p, bDe
29ea0 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65  sc, buf.p, nToke
29eb0 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70  n+1, pColset, &p
29ec0 52 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ret);.      asse
29ed0 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
29ee0 45 5f 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43  E_OK || pRet->pC
29ef0 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  olset==0 );.    
29f00 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
29f10 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 52  putCb(&p->rc, pR
29f20 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
29f30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
29f40 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
29f50 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
29f60 70 52 65 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d  pRet->aSeg[pRet-
29f70 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
29f80 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t];.        if( 
29f90 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 20 70 52  pSeg->pLeaf ) pR
29fa0 65 74 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28  et->xSetOutputs(
29fb0 70 52 65 74 2c 20 70 53 65 67 29 3b 0a 20 20 20  pRet, pSeg);.   
29fc0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
29fd0 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
29fe0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74     sqlite3Fts5It
29ff0 65 72 43 6c 6f 73 65 28 28 46 74 73 35 49 6e 64  erClose((Fts5Ind
2a000 65 78 49 74 65 72 2a 29 70 52 65 74 29 3b 0a 20  exIter*)pRet);. 
2a010 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
2a020 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65       fts5CloseRe
2a030 61 64 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a  ader(p);.    }..
2a040 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 28 46      *ppIter = (F
2a050 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 70 52  ts5IndexIter*)pR
2a060 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  et;.    sqlite3F
2a070 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
2a080 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  uf);.  }.  retur
2a090 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
2a0a0 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
2a0b0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2a0c0 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
2a0d0 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2a0e0 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46  gument is at EOF
2a0f0 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ..*/./*.** Move 
2a100 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
2a110 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a  hing rowid. .*/.
2a120 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2a130 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65  terNext(Fts5Inde
2a140 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65  xIter *pIndexIte
2a150 72 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  r){.  Fts5Iter *
2a160 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65  pIter = (Fts5Ite
2a170 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20  r*)pIndexIter;. 
2a180 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a190 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49  pIndex->rc==SQLI
2a1a0 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d  TE_OK );.  fts5M
2a1b0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49 74  ultiIterNext(pIt
2a1c0 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
2a1d0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  r, 0, 0);.  retu
2a1e0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
2a1f0 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
2a200 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
2a210 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
2a220 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64  ching term/rowid
2a230 2e 20 55 73 65 64 20 62 79 20 74 68 65 20 66 74  . Used by the ft
2a240 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a  s5vocab module..
2a250 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2a260 73 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46  s5IterNextScan(F
2a270 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
2a280 6e 64 65 78 49 74 65 72 29 7b 0a 20 20 46 74 73  ndexIter){.  Fts
2a290 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28  5Iter *pIter = (
2a2a0 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78  Fts5Iter*)pIndex
2a2b0 49 74 65 72 3b 0a 20 20 46 74 73 35 49 6e 64 65  Iter;.  Fts5Inde
2a2c0 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49  x *p = pIter->pI
2a2d0 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  ndex;..  assert(
2a2e0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
2a2f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2a300 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
2a310 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
2a320 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  0, 0);.  if( p->
2a330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a340 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
2a350 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
2a360 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
2a370 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
2a380 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ;.    if( pSeg->
2a390 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74  pLeaf && pSeg->t
2a3a0 65 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d  erm.p[0]!=FTS5_M
2a3b0 41 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20  AIN_PREFIX ){.  
2a3c0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
2a3d0 61 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29  ase(pSeg->pLeaf)
2a3e0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c  ;.      pSeg->pL
2a3f0 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  eaf = 0;.      p
2a400 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20  Iter->base.bEof 
2a410 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
2a420 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2a430 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
2a440 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
2a450 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65  * Move to the ne
2a460 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69  xt matching rowi
2a470 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  d that occurs at
2a480 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68   or after iMatch
2a490 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74  . The.** definit
2a4a0 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66  ion of "at or af
2a4b0 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20  ter" depends on 
2a4c0 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65  whether this ite
2a4d0 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a  rator iterates.*
2a4e0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
2a4f0 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  r descending row
2a500 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74  id order..*/.int
2a510 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2a520 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64  NextFrom(Fts5Ind
2a530 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74  exIter *pIndexIt
2a540 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b  er, i64 iMatch){
2a550 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
2a560 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
2a570 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 66 74  pIndexIter;.  ft
2a580 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46  s5MultiIterNextF
2a590 72 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  rom(pIter->pInde
2a5a0 78 2c 20 70 49 74 65 72 2c 20 69 4d 61 74 63 68  x, pIter, iMatch
2a5b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
2a5c0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65  IndexReturn(pIte
2a5d0 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  r->pIndex);.}../
2a5e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2a5f0 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f  current term..*/
2a600 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
2a610 69 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d  ite3Fts5IterTerm
2a620 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
2a630 70 49 6e 64 65 78 49 74 65 72 2c 20 69 6e 74 20  pIndexIter, int 
2a640 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  *pn){.  int n;. 
2a650 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
2a660 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74   (const char*)ft
2a670 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
2a680 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65  (Fts5Iter*)pInde
2a690 78 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70  xIter, &n);.  *p
2a6a0 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72  n = n-1;.  retur
2a6b0 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n &z[1];.}../*.*
2a6c0 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61  * Close an itera
2a6d0 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e  tor opened by an
2a6e0 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
2a6f0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2a700 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69  xQuery()..*/.voi
2a710 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  d sqlite3Fts5Ite
2a720 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78  rClose(Fts5Index
2a730 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72  Iter *pIndexIter
2a740 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 49  ){.  if( pIndexI
2a750 74 65 72 20 29 7b 0a 20 20 20 20 46 74 73 35 49  ter ){.    Fts5I
2a760 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74  ter *pIter = (Ft
2a770 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
2a780 65 72 3b 0a 20 20 20 20 46 74 73 35 49 6e 64 65  er;.    Fts5Inde
2a790 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65  x *pIndex = pIte
2a7a0 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66  r->pIndex;.    f
2a7b0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
2a7c0 28 70 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73  (pIter);.    fts
2a7d0 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e  5CloseReader(pIn
2a7e0 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  dex);.  }.}../*.
2a7f0 2a 2a 20 52 65 61 64 20 61 6e 64 20 64 65 63 6f  ** Read and deco
2a800 64 65 20 74 68 65 20 22 61 76 65 72 61 67 65 73  de the "averages
2a810 22 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  " record from th
2a820 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a  e database. .**.
2a830 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 6e 53  ** Parameter anS
2a840 69 7a 65 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ize must point t
2a850 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69  o an array of si
2a860 7a 65 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e  ze nCol, where n
2a870 43 6f 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75  Col is.** the nu
2a880 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66  mber of user def
2a890 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ined columns in 
2a8a0 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a  the FTS table..*
2a8b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2a8c0 35 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65  5IndexGetAverage
2a8d0 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
2a8e0 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20  i64 *pnRow, i64 
2a8f0 2a 61 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20  *anSize){.  int 
2a900 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nCol = p->pConfi
2a910 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44  g->nCol;.  Fts5D
2a920 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a  ata *pData;..  *
2a930 70 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d  pnRow = 0;.  mem
2a940 73 65 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73  set(anSize, 0, s
2a950 69 7a 65 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f  izeof(i64) * nCo
2a960 6c 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74  l);.  pData = ft
2a970 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
2a980 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
2a990 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  D);.  if( p->rc=
2a9a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
2a9b0 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69  ata->nn ){.    i
2a9c0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e  nt i = 0;.    in
2a9d0 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d  t iCol;.    i +=
2a9e0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
2a9f0 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36  pData->p[i], (u6
2aa00 34 2a 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66  4*)pnRow);.    f
2aa10 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61  or(iCol=0; i<pDa
2aa20 74 61 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e  ta->nn && iCol<n
2aa30 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
2aa40 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
2aa50 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
2aa60 5b 69 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53 69  [i], (u64*)&anSi
2aa70 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d  ze[iCol]);.    }
2aa80 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
2aa90 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
2aaa0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2aab0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2aac0 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
2aad0 65 20 63 75 72 72 65 6e 74 20 22 61 76 65 72 61  e current "avera
2aae0 67 65 73 22 20 72 65 63 6f 72 64 20 77 69 74 68  ges" record with
2aaf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2ab00 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20   the buffer .** 
2ab10 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20  supplied as the 
2ab20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2ab30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2ab40 74 73 35 49 6e 64 65 78 53 65 74 41 76 65 72 61  ts5IndexSetAvera
2ab50 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ges(Fts5Index *p
2ab60 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74  , const u8 *pDat
2ab70 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20  a, int nData){. 
2ab80 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
2ab90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
2aba0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
2abb0 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
2abc0 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  WID, pData, nDat
2abd0 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  a);.  return fts
2abe0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
2abf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2ac00 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
2ac10 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73  r of blocks this
2ac20 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64   module has read
2ac30 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
2ac40 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20  .** table since 
2ac50 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  it was created..
2ac60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2ac70 73 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73  s5IndexReads(Fts
2ac80 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65  5Index *p){.  re
2ac90 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d  turn p->nRead;.}
2aca0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2acb0 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61  32-bit cookie va
2acc0 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  lue stored at th
2acd0 65 20 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73  e start of all s
2ace0 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63  tructure .** rec
2acf0 6f 72 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75  ords to the valu
2ad00 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2ad10 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2ad20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
2ad30 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
2ad40 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
2ad50 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2ad60 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
2ad70 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
2ad80 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
2ad90 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78  Cookie(Fts5Index
2ada0 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a   *p, int iNew){.
2adb0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2add0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2ade0 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43   code */.  Fts5C
2adf0 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
2ae00 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20   p->pConfig;    
2ae10 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
2ae20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20   object */.  u8 
2ae30 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20  aCookie[4];     
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae50 20 20 2f 2a 20 42 69 6e 61 72 79 20 72 65 70 72    /* Binary repr
2ae60 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e  esentation of iN
2ae70 65 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ew */.  sqlite3_
2ae80 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b  blob *pBlob = 0;
2ae90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
2aea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2aeb0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74    sqlite3Fts5Put
2aec0 33 32 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77  32(aCookie, iNew
2aed0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
2aee0 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
2aef0 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69  nfig->db, pConfi
2af00 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
2af10 54 62 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f  Tbl, .      "blo
2af20 63 6b 22 2c 20 46 54 53 35 5f 53 54 52 55 43 54  ck", FTS5_STRUCT
2af30 55 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70  URE_ROWID, 1, &p
2af40 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28 20  Blob.  );.  if( 
2af50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2af60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .    sqlite3_blo
2af70 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61  b_write(pBlob, a
2af80 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20  Cookie, 4, 0);. 
2af90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2afa0 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62  blob_close(pBlob
2afb0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2afc0 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   rc;.}..int sqli
2afd0 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64  te3Fts5IndexLoad
2afe0 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78  Config(Fts5Index
2aff0 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
2b000 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
2b010 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
2b020 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
2b030 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
2b040 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
2b050 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
2b060 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
2b070 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
2b080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b0a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2b0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b100 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c  *********.** Bel
2b110 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73  ow this point is
2b120 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2b130 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ion of the integ
2b140 72 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66  rity-check .** f
2b150 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f  unctionality..*/
2b160 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2b170 20 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d   simple checksum
2b180 20 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20   value based on 
2b190 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  the arguments..*
2b1a0 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74 73  /.u64 sqlite3Fts
2b1b0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2b1c0 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20  (.  i64 iRowid, 
2b1d0 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20  .  int iCol, .  
2b1e0 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74  int iPos, .  int
2b1f0 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63   iIdx,.  const c
2b200 68 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e  har *pTerm,.  in
2b210 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74  t nTerm.){.  int
2b220 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20   i;.  u64 ret = 
2b230 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d  iRowid;.  ret +=
2b240 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c   (ret<<3) + iCol
2b250 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
2b260 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66  <3) + iPos;.  if
2b270 28 20 69 49 64 78 3e 3d 30 20 29 20 72 65 74 20  ( iIdx>=0 ) ret 
2b280 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46  += (ret<<3) + (F
2b290 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20  TS5_MAIN_PREFIX 
2b2a0 2b 20 69 49 64 78 29 3b 0a 20 20 66 6f 72 28 69  + iIdx);.  for(i
2b2b0 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
2b2c0 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33  ) ret += (ret<<3
2b2d0 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20  ) + pTerm[i];.  
2b2e0 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23  return ret;.}..#
2b2f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2b300 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  UG./*.** This fu
2b310 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79  nction is purely
2b320 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
2b330 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
2b340 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
2b350 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
2b360 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
2b370 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
2b380 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
2b390 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74  ** Instead, it t
2b3a0 65 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61  ests that the sa
2b3b0 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72  me set of pgno/r
2b3c0 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  owid combination
2b3d0 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65  s are .** visite
2b3e0 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  d regardless of 
2b3f0 77 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c  whether the docl
2b400 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69  ist-index identi
2b410 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
2b420 72 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65  rs.** iSegid/iLe
2b430 61 66 20 69 73 20 69 74 65 72 61 74 65 64 20 69  af is iterated i
2b440 6e 20 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65  n forwards or re
2b450 76 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a  verse order..*/.
2b460 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2b470 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65  TestDlidxReverse
2b480 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
2b490 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c  , .  int iSegid,
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4b0 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
2b4c0 69 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20  id to load from 
2b4d0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20  */.  int iLeaf  
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63       /* Load doc
2b500 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74  list-index for t
2b510 68 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20  his leaf */.){. 
2b520 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
2b530 70 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75 36  pDlidx = 0;.  u6
2b540 34 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20  4 cksum1 = 13;. 
2b550 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33   u64 cksum2 = 13
2b560 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d  ;..  for(pDlidx=
2b570 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
2b580 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20  t(p, 0, iSegid, 
2b590 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74  iLeaf);.      ft
2b5a0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
2b5b0 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
2b5c0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2b5d0 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29  rNext(p, pDlidx)
2b5e0 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
2b5f0 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78  owid = fts5Dlidx
2b600 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
2b610 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20  );.    int pgno 
2b620 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
2b630 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
2b640 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c   assert( pgno>iL
2b650 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d  eaf );.    cksum
2b660 31 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28  1 += iRowid + ((
2b670 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20  i64)pgno<<32);. 
2b680 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74   }.  fts5DlidxIt
2b690 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
2b6a0 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20    pDlidx = 0;.. 
2b6b0 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
2b6c0 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
2b6d0 20 31 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61   1, iSegid, iLea
2b6e0 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  f);.      fts5Dl
2b6f0 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
2b700 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
2b710 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
2b720 76 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29  v(p, pDlidx).  )
2b730 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
2b740 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
2b750 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20  Rowid(pDlidx);. 
2b760 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74     int pgno = ft
2b770 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
2b780 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73  pDlidx);.    ass
2b790 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74  ert( fts5DlidxIt
2b7a0 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69  erPgno(pDlidx)>i
2b7b0 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75  Leaf );.    cksu
2b7c0 6d 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28  m2 += iRowid + (
2b7d0 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a  (i64)pgno<<32);.
2b7e0 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49    }.  fts5DlidxI
2b7f0 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
2b800 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a  .  pDlidx = 0;..
2b810 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2b820 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31  ITE_OK && cksum1
2b830 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63  !=cksum2 ) p->rc
2b840 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2b850 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
2b860 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20  ts5QueryCksum(. 
2b870 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
2b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b890 20 2f 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f   /* Fts5 index o
2b8a0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
2b8b0 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Idx,.  const cha
2b8c0 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
2b8d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2b8e0 6b 65 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72  key to query for
2b8f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
2b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b910 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2b920 20 69 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79   index key in by
2b930 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  tes */.  int fla
2b940 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2b950 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2b960 73 20 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51  s for Fts5IndexQ
2b970 75 65 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70  uery */.  u64 *p
2b980 43 6b 73 75 6d 20 20 20 20 20 20 20 20 20 20 20  Cksum           
2b990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2b9a0 4f 55 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61  OUT: Checksum va
2b9b0 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lue */.){.  int 
2b9c0 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f  eDetail = p->pCo
2b9d0 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20  nfig->eDetail;. 
2b9e0 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43   u64 cksum = *pC
2b9f0 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65  ksum;.  Fts5Inde
2ba00 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30  xIter *pIter = 0
2ba10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
2ba20 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
2ba30 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67  ry(p, z, n, flag
2ba40 73 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a  s, 0, &pIter);..
2ba50 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2ba60 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
2ba70 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
2ba80 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 36  pIter) ){.    i6
2ba90 34 20 72 6f 77 69 64 20 3d 20 70 49 74 65 72 2d  4 rowid = pIter-
2baa0 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66  >iRowid;..    if
2bab0 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
2bac0 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
2bad0 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71       cksum ^= sq
2bae0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
2baf0 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20  tryCksum(rowid, 
2bb00 30 2c 20 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e  0, 0, iIdx, z, n
2bb10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2bb20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52      Fts5PoslistR
2bb30 65 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20  eader sReader;. 
2bb40 20 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65 33       for(sqlite3
2bb50 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2bb60 72 49 6e 69 74 28 70 49 74 65 72 2d 3e 70 44 61  rInit(pIter->pDa
2bb70 74 61 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61  ta, pIter->nData
2bb80 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20  , &sReader);.   
2bb90 20 20 20 20 20 20 20 73 52 65 61 64 65 72 2e 62         sReader.b
2bba0 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  Eof==0;.        
2bbb0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
2bbc0 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26  listReaderNext(&
2bbd0 73 52 65 61 64 65 72 29 0a 20 20 20 20 20 20 29  sReader).      )
2bbe0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
2bbf0 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f  ol = FTS5_POS2CO
2bc00 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f  LUMN(sReader.iPo
2bc10 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  s);.        int 
2bc20 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32  iOff = FTS5_POS2
2bc30 4f 46 46 53 45 54 28 73 52 65 61 64 65 72 2e 69  OFFSET(sReader.i
2bc40 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  Pos);.        ck
2bc50 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74  sum ^= sqlite3Ft
2bc60 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
2bc70 6d 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  m(rowid, iCol, i
2bc80 4f 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29  Off, iIdx, z, n)
2bc90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bca0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bcb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2bcc0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
2bcd0 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
2bce0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2bcf0 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
2bd00 28 70 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b  (pIter);..  *pCk
2bd10 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72  sum = cksum;.  r
2bd20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2bd30 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2bd40 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79  n is also purely
2bd50 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
2bd60 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
2bd70 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
2bd80 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
2bd90 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
2bda0 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
2bdb0 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a   in any way..*/.
2bdc0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2bdd0 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35  TestTerm(.  Fts5
2bde0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
2bdf0 35 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20  5Buffer *pPrev, 
2be00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2be10 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f  Previous term */
2be20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2be30 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20  , int n,        
2be40 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e     /* Possibly n
2be50 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20  ew term to test 
2be60 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74 65  */.  u64 expecte
2be70 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d  d,.  u64 *pCksum
2be80 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  .){.  int rc = p
2be90 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65  ->rc;.  if( pPre
2bea0 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66  v->n==0 ){.    f
2beb0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63  ts5BufferSet(&rc
2bec0 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e  , pPrev, n, (con
2bed0 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c  st u8*)z);.  }el
2bee0 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  se.  if( rc==SQL
2bef0 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76  ITE_OK && (pPrev
2bf00 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70  ->n!=n || memcmp
2bf10 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29  (pPrev->p, z, n)
2bf20 29 20 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73  ) ){.    u64 cks
2bf30 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20  um3 = *pCksum;. 
2bf40 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2bf50 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68  Term = (const ch
2bf60 61 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d  ar*)&pPrev->p[1]
2bf70 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20  ;  /* term sans 
2bf80 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20  prefix-byte */. 
2bf90 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70     int nTerm = p
2bfa0 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20  Prev->n-1;      
2bfb0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2bfc0 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
2bfd0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20  */.    int iIdx 
2bfe0 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d  = (pPrev->p[0] -
2bff0 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
2c000 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  X);.    int flag
2c010 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30  s = (iIdx==0 ? 0
2c020 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   : FTS5INDEX_QUE
2c030 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20  RY_PREFIX);.    
2c040 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20  u64 ck1 = 0;.   
2c050 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20   u64 ck2 = 0;.. 
2c060 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
2c070 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74   the results ret
2c080 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e  urned for ASC an
2c090 64 20 44 45 53 43 20 71 75 65 72 69 65 73 20 61  d DESC queries a
2c0a0 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  re.    ** the sa
2c0b0 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c  me. If not, call
2c0c0 20 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f 6e   this corruption
2c0d0 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  .  */.    rc = f
2c0e0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
2c0f0 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
2c100 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31  erm, flags, &ck1
2c110 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2c120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c130 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c    int f = flags|
2c140 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2c150 44 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20 3d  DESC;.      rc =
2c160 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
2c170 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
2c180 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b  nTerm, f, &ck2);
2c190 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2c1a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2c1b0 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
2c1c0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
2c1d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2c1e0 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79 2c   a prefix query,
2c1f0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
2c200 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64  results returned
2c210 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   if the.    ** t
2c220 68 65 20 69 6e 64 65 78 20 69 73 20 64 69 73 61  he index is disa
2c230 62 6c 65 64 20 61 72 65 20 74 68 65 20 73 61 6d  bled are the sam
2c240 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20 61  e. In both ASC a
2c250 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a  nd DESC order. .
2c260 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2c270 69 73 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c  is check may onl
2c280 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69  y be performed i
2c290 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  f the hash table
2c2a0 20 69 73 20 65 6d 70 74 79 2e 20 54 68 69 73 0a   is empty. This.
2c2b0 20 20 20 20 2a 2a 20 69 73 20 62 65 63 61 75 73      ** is becaus
2c2c0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
2c2d0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
2c2e0 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 71 75 65   single scan que
2c2f0 72 79 20 61 74 0a 20 20 20 20 2a 2a 20 61 20 74  ry at.    ** a t
2c300 69 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c  ime, and the mul
2c310 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f  ti-iter loop fro
2c320 6d 20 77 68 69 63 68 20 74 68 69 73 20 66 75 6e  m which this fun
2c330 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a  ction is called.
2c340 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64      ** is alread
2c350 79 20 70 65 72 66 6f 72 6d 69 6e 67 20 73 75 63  y performing suc
2c360 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  h a scan. */.   
2c370 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   if( p->nPending
2c380 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
2c390 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72   if( iIdx>0 && r
2c3a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c3b0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
2c3c0 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
2c3d0 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
2c3e0 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20  ;.        ck2 = 
2c3f0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
2c400 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
2c410 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
2c420 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
2c430 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2c440 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
2c450 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
2c460 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2c470 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 49 64   }.      if( iId
2c480 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  x>0 && rc==SQLIT
2c490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c4a0 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54  int f = flags|FT
2c4b0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
2c4c0 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44  ST_NOIDX|FTS5IND
2c4d0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20  EX_QUERY_DESC;. 
2c4e0 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a         ck2 = 0;.
2c4f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
2c500 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
2c510 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
2c520 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
2c530 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2c540 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
2c550 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
2c560 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
2c570 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d      }..    cksum
2c580 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74  3 ^= ck1;.    ft
2c590 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
2c5a0 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73   pPrev, n, (cons
2c5b0 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69  t u8*)z);..    i
2c5c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c5d0 20 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65   && cksum3!=expe
2c5e0 63 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  cted ){.      rc
2c5f0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2c600 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73  .    }.    *pCks
2c610 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d  um = cksum3;.  }
2c620 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d  .  p->rc = rc;.}
2c630 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  . .#else.# defin
2c640 65 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52  e fts5TestDlidxR
2c650 65 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20  everse(x,y,z).# 
2c660 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 54  define fts5TestT
2c670 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29  erm(u,v,w,x,y,z)
2c680 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
2c690 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  heck that:.**.**
2c6a0 20 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73     1) All leaves
2c6b0 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e   of pSeg between
2c6c0 20 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73   iFirst and iLas
2c6d0 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78  t (inclusive) ex
2c6e0 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ist and.**      
2c6f0 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72  contain zero ter
2c700 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20  ms..**   2) All 
2c710 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62  leaves of pSeg b
2c720 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20  etween iNoRowid 
2c730 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75  and iLast (inclu
2c740 73 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a  sive) exist and.
2c750 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
2c760 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a  zero rowids..*/.
2c770 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2c780 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2c790 65 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35  eckEmpty(.  Fts5
2c7a0 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
2c7b0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2c7c0 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53   *pSeg,     /* S
2c7d0 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  egment to check 
2c7e0 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74  internal consist
2c7f0 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ency */.  int iF
2c800 69 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52  irst,.  int iNoR
2c810 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73  owid,.  int iLas
2c820 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  t.){.  int i;.. 
2c830 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68   /* Now check th
2c840 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70  at the iter.nEmp
2c850 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  ty leaves follow
2c860 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
2c870 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78  leaf.  ** (a) ex
2c880 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ist and (b) cont
2c890 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f  ain no terms. */
2c8a0 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b  .  for(i=iFirst;
2c8b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2c8c0 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69  K && i<=iLast; i
2c8d0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  ++){.    Fts5Dat
2c8e0 61 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44  a *pLeaf = fts5D
2c8f0 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
2c900 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
2c910 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 29 29 3b  eg->iSegid, i));
2c920 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29  .    if( pLeaf )
2c930 7b 0a 20 20 20 20 20 20 69 66 28 20 21 66 74 73  {.      if( !fts
2c940 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
2c950 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d  pLeaf) ) p->rc =
2c960 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2c970 20 20 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52       if( i>=iNoR
2c980 6f 77 69 64 20 26 26 20 30 21 3d 66 74 73 35 4c  owid && 0!=fts5L
2c990 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
2c9a0 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20  (pLeaf) ) p->rc 
2c9b0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2c9c0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61      }.    fts5Da
2c9d0 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
2c9e0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
2c9f0 76 6f 69 64 20 66 74 73 35 49 6e 74 65 67 72 69  void fts5Integri
2ca00 74 79 43 68 65 63 6b 50 67 69 64 78 28 46 74 73  tyCheckPgidx(Fts
2ca10 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
2ca20 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69  ata *pLeaf){.  i
2ca30 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b  nt iTermOff = 0;
2ca40 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74  .  int ii;..  Ft
2ca50 73 35 42 75 66 66 65 72 20 62 75 66 31 20 3d 20  s5Buffer buf1 = 
2ca60 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42  {0,0,0};.  Fts5B
2ca70 75 66 66 65 72 20 62 75 66 32 20 3d 20 7b 30 2c  uffer buf2 = {0,
2ca80 30 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c  0,0};..  ii = pL
2ca90 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77  eaf->szLeaf;.  w
2caa0 68 69 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e  hile( ii<pLeaf->
2cab0 6e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  nn && p->rc==SQL
2cac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
2cad0 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 69  t res;.    int i
2cae0 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e  Off;.    int nIn
2caf0 63 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66  cr;..    ii += f
2cb00 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2cb10 70 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49  pLeaf->p[ii], nI
2cb20 6e 63 72 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f  ncr);.    iTermO
2cb30 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20  ff += nIncr;.   
2cb40 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
2cb50 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  ;..    if( iOff>
2cb60 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
2cb70 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
2cb80 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2cb90 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72    }else if( iTer
2cba0 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20  mOff==nIncr ){. 
2cbb0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a       int nByte;.
2cbc0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2cbd0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2cbe0 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2cbf0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
2cc00 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c   (iOff+nByte)>pL
2cc10 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2cc20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
2cc30 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2cc40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cc50 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
2cc60 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e  &p->rc, &buf1, n
2cc70 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b  Byte, &pLeaf->p[
2cc80 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  iOff]);.      }.
2cc90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cca0 20 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74   int nKeep, nByt
2ccb0 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  e;.      iOff +=
2ccc0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2ccd0 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
2cce0 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
2ccf0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
2cd00 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
2cd10 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  p[iOff], nByte);
2cd20 0a 20 20 20 20 20 20 69 66 28 20 6e 4b 65 65 70  .      if( nKeep
2cd30 3e 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66  >buf1.n || (iOff
2cd40 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73  +nByte)>pLeaf->s
2cd50 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
2cd60 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2cd70 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  RRUPT;.      }el
2cd80 73 65 7b 0a 20 20 20 20 20 20 20 20 62 75 66 31  se{.        buf1
2cd90 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20  .n = nKeep;.    
2cda0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
2cdb0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
2cdc0 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26   &buf1, nByte, &
2cdd0 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b  pLeaf->p[iOff]);
2cde0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2cdf0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
2ce00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ce10 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72  res = fts5Buffer
2ce20 43 6f 6d 70 61 72 65 28 26 62 75 66 31 2c 20 26  Compare(&buf1, &
2ce30 62 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20 69  buf2);.        i
2ce40 66 28 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72  f( res<=0 ) p->r
2ce50 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2ce60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ce70 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
2ce80 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c  t(&p->rc, &buf2,
2ce90 20 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29   buf1.n, buf1.p)
2cea0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66  ;.  }..  fts5Buf
2ceb0 66 65 72 46 72 65 65 28 26 62 75 66 31 29 3b 0a  ferFree(&buf1);.
2cec0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
2ced0 28 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74  (&buf2);.}..stat
2cee0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
2cef0 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
2cf00 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e  egment(.  Fts5In
2cf10 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
2cf20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
2cf30 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
2cf40 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
2cf50 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
2cf60 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
2cf70 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e   to check intern
2cf80 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a  al consistency *
2cf90 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  /.){.  Fts5Confi
2cfa0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
2cfb0 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74  pConfig;.  sqlit
2cfc0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
2cfd0 20 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20   0;.  int rc2;. 
2cfe0 20 69 6e 74 20 69 49 64 78 50 72 65 76 4c 65 61   int iIdxPrevLea
2cff0 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  f = pSeg->pgnoFi
2d000 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c  rst-1;.  int iDl
2d010 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53  idxPrevLeaf = pS
2d020 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20  eg->pgnoLast;.. 
2d030 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46   if( pSeg->pgnoF
2d040 69 72 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  irst==0 ) return
2d050 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 50 72  ;..  fts5IndexPr
2d060 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 53  epareStmt(p, &pS
2d070 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  tmt, sqlite3_mpr
2d080 69 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c  intf(.      "SEL
2d090 45 43 54 20 73 65 67 69 64 2c 20 74 65 72 6d 2c  ECT segid, term,
2d0a0 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e   (pgno>>1), (pgn
2d0b0 6f 26 31 29 20 46 52 4f 4d 20 25 51 2e 27 25 71  o&1) FROM %Q.'%q
2d0c0 5f 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69  _idx' WHERE segi
2d0d0 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f  d=%d",.      pCo
2d0e0 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
2d0f0 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d  ig->zName, pSeg-
2d100 3e 69 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20  >iSegid.  ));.. 
2d110 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f   /* Iterate thro
2d120 75 67 68 20 74 68 65 20 62 2d 74 72 65 65 20 68  ugh the b-tree h
2d130 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20  ierarchy.  */.  
2d140 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
2d150 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
2d160 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2d170 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
2d180 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20    i64 iRow;     
2d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1a0 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69  /* Rowid for thi
2d1b0 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74  s leaf */.    Ft
2d1c0 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20  s5Data *pLeaf;  
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2d1e0 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61  ata for this lea
2d1f0 66 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49  f */..    int nI
2d200 64 78 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33  dxTerm = sqlite3
2d210 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
2d220 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e  tmt, 1);.    con
2d230 73 74 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72  st char *zIdxTer
2d240 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  m = (const char*
2d250 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2d260 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  text(pStmt, 1);.
2d270 20 20 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66      int iIdxLeaf
2d280 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2d290 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b  n_int(pStmt, 2);
2d2a0 0a 20 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69  .    int bIdxDli
2d2b0 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  dx = sqlite3_col
2d2c0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33  umn_int(pStmt, 3
2d2d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2d2e0 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69  e leaf in questi
2d2f0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
2d300 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d  een trimmed from
2d310 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20   the segment, . 
2d320 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69     ** ignore thi
2d330 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20  s b-tree entry. 
2d340 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20  Otherwise, load 
2d350 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  it into memory. 
2d360 2a 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c  */.    if( iIdxL
2d370 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eaf<pSeg->pgnoFi
2d380 72 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rst ) continue;.
2d390 20 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f      iRow = FTS5_
2d3a0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
2d3b0 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 49 64 78  eg->iSegid, iIdx
2d3c0 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66  Leaf);.    pLeaf
2d3d0 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64 28   = fts5LeafRead(
2d3e0 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66  p, iRow);.    if
2d3f0 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ( pLeaf==0 ) bre
2d400 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  ak;..    /* Chec
2d410 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
2d420 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73  contains at leas
2d430 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20  t one term, and 
2d440 74 68 61 74 20 69 74 20 69 73 20 65 71 75 61 6c  that it is equal
2d450 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61  .    ** to or la
2d460 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70  rger than the sp
2d470 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54  lit-key in zIdxT
2d480 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b  erm.  Also check
2d490 20 74 68 61 74 20 69 66 20 74 68 65 72 65 0a 20   that if there. 
2d4a0 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20     ** is also a 
2d4b0 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69  rowid pointer wi
2d4c0 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61  thin the leaf pa
2d4d0 67 65 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f  ge header, it po
2d4e0 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a  ints to a.    **
2d4f0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
2d500 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20   the term.  */. 
2d510 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e     if( pLeaf->nn
2d520 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  <=pLeaf->szLeaf 
2d530 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
2d540 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2d550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d560 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
2d570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2d580 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74  ffset of first t
2d590 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20  erm on leaf */. 
2d5a0 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
2d5b0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
2d5c0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
2d5d0 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61  rst rowid on lea
2d5e0 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  f */.      int n
2d5f0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
2d600 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2d610 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69  f term on leaf i
2d620 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
2d630 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
2d640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d650 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65  Comparison of te
2d660 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79  rm and split-key
2d670 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66 20   */..      iOff 
2d680 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  = fts5LeafFirstT
2d690 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20  ermOff(pLeaf);. 
2d6a0 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d       iRowidOff =
2d6b0 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
2d6c0 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20  widOff(pLeaf);. 
2d6d0 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
2d6e0 66 66 3e 3d 69 4f 66 66 20 7c 7c 20 69 4f 66 66  ff>=iOff || iOff
2d6f0 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  >=pLeaf->szLeaf 
2d700 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
2d710 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2d720 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2d730 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2d740 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2d750 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2d760 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 72  Term);.        r
2d770 65 73 20 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28  es = fts5Memcmp(
2d780 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2d790 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28 6e   zIdxTerm, MIN(n
2d7a0 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29 29  Term, nIdxTerm))
2d7b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
2d7c0 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54 65  s==0 ) res = nTe
2d7d0 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a 20  rm - nIdxTerm;. 
2d7e0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30         if( res<0
2d7f0 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
2d800 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2d810 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e 74 65  ..      fts5Inte
2d820 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78 28  grityCheckPgidx(
2d830 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d  p, pLeaf);.    }
2d840 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
2d850 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ease(pLeaf);.   
2d860 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
2d870 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ak;..    /* Now 
2d880 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  check that the i
2d890 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65  ter.nEmpty leave
2d8a0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
2d8b0 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 20  current leaf.   
2d8c0 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e   ** (a) exist an
2d8d0 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f  d (b) contain no
2d8e0 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66   terms. */.    f
2d8f0 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
2d900 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 20  yCheckEmpty(.   
2d910 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20 69 49       p, pSeg, iI
2d920 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 44  dxPrevLeaf+1, iD
2d930 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20  lidxPrevLeaf+1, 
2d940 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20 20 29  iIdxLeaf-1.    )
2d950 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
2d960 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
2d970 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
2d980 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63 68  oclist-index, ch
2d990 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b  eck that it look
2d9a0 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  s right. */.    
2d9b0 69 66 28 20 62 49 64 78 44 6c 69 64 78 20 29 7b  if( bIdxDlidx ){
2d9c0 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
2d9d0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
2d9e0 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74  ;  /* For iterat
2d9f0 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63 6c  ing through docl
2da00 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist index */.   
2da10 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61 66     int iPrevLeaf
2da20 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 20   = iIdxLeaf;.   
2da30 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
2da40 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
2da50 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 30 3b      int iPg = 0;
2da60 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79 3b  .      i64 iKey;
2da70 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c 69  ..      for(pDli
2da80 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
2da90 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69  Init(p, 0, iSegi
2daa0 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20  d, iIdxLeaf);.  
2dab0 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
2dac0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
2dad0 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  dx)==0;.        
2dae0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
2daf0 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  ext(p, pDlidx). 
2db00 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20       ){..       
2db10 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f   /* Check any ro
2db20 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74  wid-less pages t
2db30 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65  hat occur before
2db40 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
2db50 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  f. */.        fo
2db60 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b  r(iPg=iPrevLeaf+
2db70 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69 64 78  1; iPg<fts5Dlidx
2db80 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
2db90 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iPg++){.      
2dba0 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f      iKey = FTS5_
2dbb0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
2dbc0 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20 20 20  egid, iPg);.    
2dbd0 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
2dbe0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
2dbf0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
2dc00 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
2dc10 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
2dc20 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
2dc30 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20 70 2d  f(pLeaf)!=0 ) p-
2dc40 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2dc50 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2dc60 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2dc70 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2dc80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2dc90 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66 20        iPrevLeaf 
2dca0 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
2dcb0 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20  gno(pDlidx);..  
2dcc0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2dcd0 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61 67  hat the leaf pag
2dce0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
2dcf0 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 6c  he iterator real
2dd00 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  ly does.        
2dd10 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  ** contain the r
2dd20 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20 62  owid suggested b
2dd30 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  y the same. */. 
2dd40 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
2dd50 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2dd60 28 69 53 65 67 69 64 2c 20 69 50 72 65 76 4c 65  (iSegid, iPrevLe
2dd70 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  af);.        pLe
2dd80 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
2dd90 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
2dda0 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
2ddb0 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
2ddc0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Rowid;.         
2ddd0 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d   int iRowidOff =
2dde0 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
2ddf0 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20  widOff(pLeaf);. 
2de00 20 20 20 20 20 20 20 20 20 41 53 53 45 52 54 5f           ASSERT_
2de10 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29  SZLEAF_OK(pLeaf)
2de20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2de30 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61 66  iRowidOff>=pLeaf
2de40 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
2de50 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
2de60 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2de70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2de80 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 47             fts5G
2de90 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
2dea0 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28  >p[iRowidOff], (
2deb0 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
2dec0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2ded0 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69 64 78  Rowid!=fts5Dlidx
2dee0 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
2def0 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  ) ) p->rc = FTS5
2df00 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2df10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2df20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2df30 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2df40 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
2df50 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20   iDlidxPrevLeaf 
2df60 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66 74 73  = iPg;.      fts
2df70 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
2df80 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74  Dlidx);.      ft
2df90 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
2dfa0 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69 49  se(p, iSegid, iI
2dfb0 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d 65 6c  dxLeaf);.    }el
2dfc0 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69 64 78  se{.      iDlidx
2dfd0 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
2dfe0 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20  >pgnoLast;.     
2dff0 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
2e000 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f 63 6c  there is no docl
2e010 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist index */.   
2e020 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72 65 76   }..    iIdxPrev
2e030 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b  Leaf = iIdxLeaf;
2e040 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71  .  }..  rc2 = sq
2e050 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2e060 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Stmt);.  if( p->
2e070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
2e080 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20  p->rc = rc2;..  
2e090 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69 4c 65  /* Page iter.iLe
2e0a0 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65 20 74  af must now be t
2e0b0 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c 65 61  he rightmost lea
2e0c0 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20 73 65  f-page in the se
2e0d0 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30 0a 20  gment */.#if 0. 
2e0e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2e0f0 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69 4c  TE_OK && iter.iL
2e100 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  eaf!=pSeg->pgnoL
2e110 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ast ){.    p->rc
2e120 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2e130 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  .  }.#endif.}...
2e140 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e  /*.** Run intern
2e150 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e 73  al checks to ens
2e160 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54 53  ure that the FTS
2e170 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69 6e   index (a) is in
2e180 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e  ternally .** con
2e190 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29 20  sistent and (b) 
2e1a0 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
2e1b0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 58   for which the X
2e1c0 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73  OR of the checks
2e1d0 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c  ums.** as calcul
2e1e0 61 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 46  ated by sqlite3F
2e1f0 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2e200 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a  um() is cksum..*
2e210 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2e220 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
2e230 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  y of the interna
2e240 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f  l checks fail, o
2e250 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63  r if the.** chec
2e260 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ksum does not ma
2e270 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  tch. Return SQLI
2e280 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65  TE_OK if all che
2e290 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74  cks pass without
2e2a0 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f  .** error, or so
2e2b0 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
2e2c0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
2e2d0 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67  other error (e.g
2e2e0 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73  . OOM).** occurs
2e2f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e300 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
2e310 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
2e320 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29  x *p, u64 cksum)
2e330 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20  {.  int eDetail 
2e340 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
2e350 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73  etail;.  u64 cks
2e360 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um2 = 0;        
2e370 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2e380 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
2e390 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
2e3a0 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
2e3b0 72 20 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30  r poslist = {0,0
2e3c0 2c 30 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65 72  ,0};   /* Buffer
2e3d0 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20   used to hold a 
2e3e0 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73  poslist */.  Fts
2e3f0 35 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20  5Iter *pIter;   
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e410 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
2e420 74 68 72 6f 75 67 68 20 65 6e 74 69 72 65 20 69  through entire i
2e430 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74  ndex */.  Fts5St
2e440 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
2e450 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
2e460 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
2e470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2e480 45 42 55 47 0a 20 20 2f 2a 20 55 73 65 64 20 62  EBUG.  /* Used b
2e490 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e 61 6c  y extra internal
2e4a0 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e 20   tests only run 
2e4b0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
2e4c0 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 75 36   defined */.  u6
2e4d0 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20  4 cksum3 = 0;   
2e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e4f0 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   Checksum based 
2e500 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69  on contents of i
2e510 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35  ndexes */.  Fts5
2e520 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b 30  Buffer term = {0
2e530 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42  ,0,0};      /* B
2e540 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f  uffer used to ho
2e550 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 74  ld most recent t
2e560 65 72 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  erm */.#endif.  
2e570 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
2e580 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  = FTS5INDEX_QUER
2e590 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 0a 20  Y_NOOUTPUT;.  . 
2e5a0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46 54 53   /* Load the FTS
2e5b0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
2e5c0 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20   */.  pStruct = 
2e5d0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
2e5e0 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  d(p);..  /* Chec
2e5f0 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72  k that the inter
2e600 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63  nal nodes of eac
2e610 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20  h segment match 
2e620 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20  the leaves */.  
2e630 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
2e640 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65     int iLvl, iSe
2e650 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  g;.    for(iLvl=
2e660 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
2e670 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
2e680 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  {.      for(iSeg
2e690 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
2e6a0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
2e6b0 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
2e6c0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
2e6d0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
2e6e0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
2e6f0 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
2e700 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 66 74  Seg];.        ft
2e710 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
2e720 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20  CheckSegment(p, 
2e730 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSeg);.      }. 
2e740 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
2e750 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e  he cksum argumen
2e760 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
2e770 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63   function is a c
2e780 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74  hecksum calculat
2e790 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e  ed.  ** based on
2e7a0 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20 65 6e   all expected en
2e7b0 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 54 53  tries in the FTS
2e7c0 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64 69 6e   index (includin
2e7d0 67 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 20  g prefix index. 
2e7e0 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20 54 68   ** entries). Th
2e7f0 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20  is block checks 
2e800 74 68 61 74 20 61 20 63 68 65 63 6b 73 75 6d 20  that a checksum 
2e810 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64  calculated based
2e820 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   on the.  ** act
2e830 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ual contents of 
2e840 46 54 53 20 69 6e 64 65 78 20 69 73 20 69 64 65  FTS index is ide
2e850 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ntical..  **.  *
2e860 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  * Two versions o
2e870 66 20 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b  f the same check
2e880 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c 61 74  sum are calculat
2e890 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 28 73  ed. The first (s
2e8a0 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62  tack.  ** variab
2e8b0 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73 65 64  le cksum2) based
2e8c0 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78 74 72   on entries extr
2e8d0 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
2e8e0 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20  ull-text index. 
2e8f0 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67 20   ** while doing 
2e900 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66  a linear scan of
2e910 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
2e920 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e 20   index in turn. 
2e930 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61  .  **.  ** As ea
2e940 63 68 20 74 65 72 6d 20 76 69 73 69 74 65 64 20  ch term visited 
2e950 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20 73 63  by the linear sc
2e960 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74 65 20  ans, a separate 
2e970 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20  query for the.  
2e980 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69 73 20  ** same term is 
2e990 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d  performed. cksum
2e9a0 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  3 is calculated 
2e9b0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 6e 74  based on the ent
2e9c0 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72 61 63  ries.  ** extrac
2e9d0 74 65 64 20 62 79 20 74 68 65 73 65 20 71 75 65  ted by these que
2e9e0 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ries..  */.  for
2e9f0 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
2ea00 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c  w(p, pStruct, fl
2ea10 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ags, 0, 0, 0, -1
2ea20 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  , 0, &pIter);.  
2ea30 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
2ea40 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d  rEof(p, pIter)==
2ea50 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  0;.      fts5Mul
2ea60 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
2ea70 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a  ter, 0, 0).  ){.
2ea80 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
2ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eaa0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
2eab0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
2eac0 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20 20 20  i64 iPos = 0;   
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2eae0 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66 72 6f  osition read fro
2eaf0 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20  m poslist */.   
2eb00 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20   int iOff = 0;  
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eb20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 70 6f  Offset within po
2eb30 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 36 34  slist */.    i64
2eb40 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
2eb50 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
2eb60 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  er);.    char *z
2eb70 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d 75   = (char*)fts5Mu
2eb80 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
2eb90 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  r, &n);..    /* 
2eba0 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 65 77  If this is a new
2ebb0 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f 72   term, query for
2ebc0 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73 75   it. Update cksu
2ebd0 6d 33 20 77 69 74 68 20 74 68 65 20 72 65 73 75  m3 with the resu
2ebe0 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  lts. */.    fts5
2ebf0 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72  TestTerm(p, &ter
2ec00 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c  m, z, n, cksum2,
2ec10 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20   &cksum3);..    
2ec20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53  if( eDetail==FTS
2ec30 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
2ec40 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74  .      if( 0==ft
2ec50 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
2ec60 74 79 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a  ty(p, pIter) ){.
2ec70 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e          cksum2 ^
2ec80 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2ec90 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
2eca0 77 69 64 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 7a  wid, 0, 0, -1, z
2ecb0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
2ecc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2ecd0 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20  oslist.n = 0;.  
2ece0 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50      fts5SegiterP
2ecf0 6f 73 6c 69 73 74 28 70 2c 20 26 70 49 74 65 72  oslist(p, &pIter
2ed00 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46  ->aSeg[pIter->aF
2ed10 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 2c  irst[1].iFirst],
2ed20 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20   0, &poslist);. 
2ed30 20 20 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 73       while( 0==s
2ed40 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2ed50 74 4e 65 78 74 36 34 28 70 6f 73 6c 69 73 74 2e  tNext64(poslist.
2ed60 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69  p, poslist.n, &i
2ed70 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20  Off, &iPos) ){. 
2ed80 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
2ed90 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  = FTS5_POS2COLUM
2eda0 4e 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  N(iPos);.       
2edb0 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20 3d 20 46   int iTokOff = F
2edc0 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 69  TS5_POS2OFFSET(i
2edd0 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  Pos);.        ck
2ede0 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33 46  sum2 ^= sqlite3F
2edf0 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2ee00 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  um(iRowid, iCol,
2ee10 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c   iTokOff, -1, z,
2ee20 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
2ee30 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54 65 73   }.  }.  fts5Tes
2ee40 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20  tTerm(p, &term, 
2ee50 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20 26 63  0, 0, cksum2, &c
2ee60 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73 35 4d  ksum3);..  fts5M
2ee70 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74  ultiIterFree(pIt
2ee80 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er);.  if( p->rc
2ee90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2eea0 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70  ksum!=cksum2 ) p
2eeb0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2eec0 55 50 54 3b 0a 0a 20 20 66 74 73 35 53 74 72 75  UPT;..  fts5Stru
2eed0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
2eee0 72 75 63 74 29 3b 0a 23 69 66 64 65 66 20 53 51  ruct);.#ifdef SQ
2eef0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 74 73  LITE_DEBUG.  fts
2ef00 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
2ef10 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 74 73  m);.#endif.  fts
2ef20 35 42 75 66 66 65 72 46 72 65 65 28 26 70 6f 73  5BufferFree(&pos
2ef30 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  list);.  return 
2ef40 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
2ef50 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  p);.}../********
2ef60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ef70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ef80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ef90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2efa0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2efb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2efc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2efd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2efe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
2eff0 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74  Below this point
2f000 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   is the implemen
2f010 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 74  tation of the ft
2f020 73 35 5f 64 65 63 6f 64 65 28 29 20 73 63 61 6c  s5_decode() scal
2f030 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f  ar.** function o
2f040 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  nly..*/../*.** D
2f050 65 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d  ecode a segment-
2f060 64 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20  data rowid from 
2f070 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
2f080 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2f090 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69  is.** the opposi
2f0a0 74 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35  te of macro FTS5
2f0b0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29  _SEGMENT_ROWID()
2f0c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f0d0 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
2f0e0 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20  (.  i64 iRowid, 
2f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f100 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f      /* Rowid fro
2f110 6d 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  m %_data table *
2f120 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64  /.  int *piSegid
2f130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f140 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d      /* OUT: Segm
2f150 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
2f160 2a 70 62 44 6c 69 64 78 2c 20 20 20 20 20 20 20  *pbDlidx,       
2f170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2f180 55 54 3a 20 44 6c 69 64 78 20 66 6c 61 67 20 2a  UT: Dlidx flag *
2f190 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68  /.  int *piHeigh
2f1a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2f1b0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67      /* OUT: Heig
2f1c0 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50  ht */.  int *piP
2f1d0 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  gno             
2f1e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2f1f0 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  Page number */.)
2f200 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69  {.  *piPgno = (i
2f210 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
2f220 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
2f230 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29  TA_PAGE_B) - 1))
2f240 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
2f250 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b  TS5_DATA_PAGE_B;
2f260 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20  ..  *piHeight = 
2f270 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
2f280 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
2f290 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d  DATA_HEIGHT_B) -
2f2a0 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e   1));.  iRowid >
2f2b0 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  >= FTS5_DATA_HEI
2f2c0 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69  GHT_B;..  *pbDli
2f2d0 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  dx = (int)(iRowi
2f2e0 64 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 69  d & 0x0001);.  i
2f2f0 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
2f300 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70  ATA_DLI_B;..  *p
2f310 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69  iSegid = (int)(i
2f320 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2f330 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44   << FTS5_DATA_ID
2f340 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74  _B) - 1));.}..st
2f350 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2f360 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52  bugRowid(int *pR
2f370 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
2f380 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a  Buf, i64 iKey){.
2f390 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 69 48    int iSegid, iH
2f3a0 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44  eight, iPgno, bD
2f3b0 6c 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 52  lidx;       /* R
2f3c0 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20  owid compenents 
2f3d0 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52  */.  fts5DecodeR
2f3e0 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 53 65 67  owid(iKey, &iSeg
2f3f0 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48  id, &bDlidx, &iH
2f400 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a  eight, &iPgno);.
2f410 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30  .  if( iSegid==0
2f420 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79   ){.    if( iKey
2f430 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  ==FTS5_AVERAGES_
2f440 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73  ROWID ){.      s
2f450 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f460 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f470 2c 20 70 42 75 66 2c 20 22 7b 61 76 65 72 61 67  , pBuf, "{averag
2f480 65 73 7d 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73  es} ");.    }els
2f490 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2f4a0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f4b0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2f4c0 2c 20 22 7b 73 74 72 75 63 74 75 72 65 7d 22 29  , "{structure}")
2f4d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c  ;.    }.  }.  el
2f4e0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  se{.    sqlite3F
2f4f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2f500 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2f510 20 22 7b 25 73 73 65 67 69 64 3d 25 64 20 68 3d   "{%ssegid=%d h=
2f520 25 64 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20  %d pgno=%d}",.  
2f530 20 20 20 20 20 20 62 44 6c 69 64 78 20 3f 20 22        bDlidx ? "
2f540 64 6c 69 64 78 20 22 20 3a 20 22 22 2c 20 69 53  dlidx " : "", iS
2f550 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69  egid, iHeight, i
2f560 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Pgno.    );.  }.
2f570 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
2f580 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
2f590 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
2f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5b0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2f5c0 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
2f5d0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2f5e0 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
2f5f0 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c  e *p.){.  int iL
2f600 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20  vl, iSeg;       
2f610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2f620 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
2f630 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f  els, segments */
2f640 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20  ..  for(iLvl=0; 
2f650 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20  iLvl<p->nLevel; 
2f660 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73  iLvl++){.    Fts
2f670 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f680 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76  *pLvl = &p->aLev
2f690 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71  el[iLvl];.    sq
2f6a0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2f6b0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2f6c0 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20   pBuf, .        
2f6d0 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65  " {lvl=%d nMerge
2f6e0 3d 25 64 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c  =%d nSeg=%d", iL
2f6f0 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  vl, pLvl->nMerge
2f700 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20  , pLvl->nSeg.   
2f710 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67   );.    for(iSeg
2f720 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
2f730 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
2f740 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
2f750 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
2f760 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
2f770 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g];.      sqlite
2f780 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2f790 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2f7a0 66 2c 20 22 20 7b 69 64 3d 25 64 20 6c 65 61 76  f, " {id=%d leav
2f7b0 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a 20 20  es=%d..%d}", .  
2f7c0 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53          pSeg->iS
2f7d0 65 67 69 64 2c 20 70 53 65 67 2d 3e 70 67 6e 6f  egid, pSeg->pgno
2f7e0 46 69 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e  First, pSeg->pgn
2f7f0 6f 4c 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20  oLast.      );. 
2f800 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2f810 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f820 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2f830 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , "}");.  }.}../
2f840 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72  *.** This is par
2f850 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  t of the fts5_de
2f860 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67  code() debugging
2f870 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75   aid..**.** Argu
2f880 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f  ments pBlob/nBlo
2f890 62 20 63 6f 6e 74 61 69 6e 20 61 20 73 65 72 69  b contain a seri
2f8a0 61 6c 69 7a 65 64 20 46 74 73 35 53 74 72 75 63  alized Fts5Struc
2f8b0 74 75 72 65 20 6f 62 6a 65 63 74 2e 20 54 68 69  ture object. Thi
2f8c0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
2f8d0 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65  pends a human-re
2f8e0 61 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74  adable represent
2f8f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
2f900 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74  e object.** to t
2f910 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  he buffer passed
2f920 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2f930 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61  rgument. .*/.sta
2f940 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
2f950 6f 64 65 53 74 72 75 63 74 75 72 65 28 0a 20 20  odeStructure(.  
2f960 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f980 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72  /* IN/OUT: error
2f990 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42   code */.  Fts5B
2f9a0 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63  uffer *pBuf,.  c
2f9b0 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20  onst u8 *pBlob, 
2f9c0 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69  int nBlob.){.  i
2f9d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f9f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2fa00 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2fa10 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
2fa20 20 20 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74     /* Decoded st
2fa30 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a  ructure object *
2fa40 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74  /..  rc = fts5St
2fa50 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 42  ructureDecode(pB
2fa60 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26  lob, nBlob, 0, &
2fa70 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  p);.  if( rc!=SQ
2fa80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2fa90 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRc = rc;.    re
2faa0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  turn;.  }..  fts
2fab0 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
2fac0 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20  pRc, pBuf, p);. 
2fad0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2fae0 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  lease(p);.}../*.
2faf0 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20  ** This is part 
2fb00 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2fb10 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61  de() debugging a
2fb20 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  id..**.** Argume
2fb30 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20  nts pBlob/nBlob 
2fb40 63 6f 6e 74 61 69 6e 20 61 6e 20 22 61 76 65 72  contain an "aver
2fb50 61 67 65 73 22 20 72 65 63 6f 72 64 2e 20 54 68  ages" record. Th
2fb60 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
2fb70 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d  appends a human-
2fb80 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65  readable represe
2fb90 6e 74 61 74 69 6f 6e 20 6f 66 20 72 65 63 6f 72  ntation of recor
2fba0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
2fbb0 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74 68  passed .** as th
2fbc0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2fbd0 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
2fbe0 69 64 20 66 74 73 35 44 65 63 6f 64 65 41 76 65  id fts5DecodeAve
2fbf0 72 61 67 65 73 28 0a 20 20 69 6e 74 20 2a 70 52  rages(.  int *pR
2fc00 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2fc10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2fc20 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2fc30 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2fc40 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
2fc50 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
2fc60 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ob.){.  int i = 
2fc70 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
2fc80 2a 7a 53 70 61 63 65 20 3d 20 22 22 3b 0a 0a 20  *zSpace = "";.. 
2fc90 20 77 68 69 6c 65 28 20 69 3c 6e 42 6c 6f 62 20   while( i<nBlob 
2fca0 29 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b  ){.    u64 iVal;
2fcb0 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  .    i += sqlite
2fcc0 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
2fcd0 70 42 6c 6f 62 5b 69 5d 2c 20 26 69 56 61 6c 29  pBlob[i], &iVal)
2fce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2fcf0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2fd00 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2fd10 25 73 25 64 22 2c 20 7a 53 70 61 63 65 2c 20 28  %s%d", zSpace, (
2fd20 69 6e 74 29 69 56 61 6c 29 3b 0a 20 20 20 20 7a  int)iVal);.    z
2fd30 53 70 61 63 65 20 3d 20 22 20 22 3b 0a 20 20 7d  Space = " ";.  }
2fd40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  .}../*.** Buffer
2fd50 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65   (a/n) is assume
2fd60 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c  d to contain a l
2fd70 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65  ist of serialize
2fd80 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a  d varints. Read.
2fd90 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20 61  ** each varint a
2fda0 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20 73 74  nd append its st
2fdb0 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
2fdc0 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42  ion to buffer pB
2fdd0 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66  uf. Return.** af
2fde0 74 65 72 20 65 69 74 68 65 72 20 74 68 65 20 69  ter either the i
2fdf0 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20 65  nput buffer is e
2fe00 78 68 61 75 73 74 65 64 20 6f 72 20 61 20 30 20  xhausted or a 0 
2fe10 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a  value is read..*
2fe20 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
2fe30 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
2fe40 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
2fe50 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
2fe60 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74   buffer..*/.stat
2fe70 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64  ic int fts5Decod
2fe80 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52  ePoslist(int *pR
2fe90 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
2fea0 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  Buf, const u8 *a
2feb0 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
2fec0 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  iOff = 0;.  whil
2fed0 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
2fee0 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69   int iVal;.    i
2fef0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2ff00 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
2ff10 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   iVal);.    sqli
2ff20 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2ff30 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2ff40 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c  Buf, " %d", iVal
2ff50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2ff60 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
2ff70 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66  he start of buff
2ff80 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e  er (a/n) contain
2ff90 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
2ffa0 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f   doclist. The do
2ffb0 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20  clist.** may or 
2ffc0 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77  may not finish w
2ffd0 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
2ffe0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2fff0 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a  appends a text.*
30000 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  * representation
30010 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20   of the part of 
30020 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74  the doclist that
30030 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62   is present to b
30040 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a  uffer.** pBuf. .
30050 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
30060 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
30070 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
30080 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
30090 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
300a0 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
300b0 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70  deDoclist(int *p
300c0 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
300d0 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
300e0 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34  a, int n){.  i64
300f0 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69   iDocid = 0;.  i
30100 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  nt iOff = 0;..  
30110 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69  if( n>0 ){.    i
30120 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Off = sqlite3Fts
30130 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75  5GetVarint(a, (u
30140 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20 20  64*)&iDocid);.  
30150 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
30160 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
30170 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d  pRc, pBuf, " id=
30180 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a  %lld", iDocid);.
30190 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f 66    }.  while( iOf
301a0 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  f<n ){.    int n
301b0 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44 65  Pos;.    int bDe
301c0 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  l;.    iOff += f
301d0 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
301e0 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  e(&a[iOff], &nPo
301f0 73 2c 20 26 62 44 65 6c 29 3b 0a 20 20 20 20 73  s, &bDel);.    s
30200 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
30210 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
30220 2c 20 70 42 75 66 2c 20 22 20 6e 50 6f 73 3d 25  , pBuf, " nPos=%
30230 64 25 73 22 2c 20 6e 50 6f 73 2c 20 62 44 65 6c  d%s", nPos, bDel
30240 3f 22 2a 22 3a 22 22 29 3b 0a 20 20 20 20 69 4f  ?"*":"");.    iO
30250 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65  ff += fts5Decode
30260 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75  Poslist(pRc, pBu
30270 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e  f, &a[iOff], MIN
30280 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b  (n-iOff, nPos));
30290 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20  .    if( iOff<n 
302a0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  ){.      i64 iDe
302b0 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  lta;.      iOff 
302c0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
302d0 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
302e0 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
302f0 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b  ;.      iDocid +
30300 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
30310 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
30320 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
30330 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c  c, pBuf, " id=%l
30340 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20  ld", iDocid);.  
30350 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
30360 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
30370 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
30380 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 74  s part of the ft
30390 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75  s5_decode() debu
303a0 67 67 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  gging function. 
303b0 49 74 20 69 73 20 0a 2a 2a 20 6f 6e 6c 79 20 65  It is .** only e
303c0 76 65 72 20 75 73 65 64 20 77 69 74 68 20 64 65  ver used with de
303d0 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73  tail=none tables
303e0 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28  ..**.** Buffer (
303f0 70 44 61 74 61 2f 6e 44 61 74 61 29 20 63 6f 6e  pData/nData) con
30400 74 61 69 6e 73 20 61 20 64 6f 63 6c 69 73 74 20  tains a doclist 
30410 69 6e 20 74 68 65 20 66 6f 72 6d 61 74 20 75 73  in the format us
30420 65 64 20 62 79 20 64 65 74 61 69 6c 3d 6e 6f 6e  ed by detail=non
30430 65 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68 69  e.** tables. Thi
30440 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
30450 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
30460 62 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ble version of t
30470 68 61 74 20 6c 69 73 74 20 74 6f 0a 2a 2a 20 62  hat list to.** b
30480 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
30490 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6f 74 68  * If *pRc is oth
304a0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
304b0 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
304c0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
304d0 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  it is a.** no-op
304e0 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 72 20 6f  . If an OOM or o
304f0 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
30500 73 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  s within this fu
30510 6e 63 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73 0a  nction, *pRc is.
30520 2a 2a 20 73 65 74 20 74 6f 20 61 6e 20 53 51 4c  ** set to an SQL
30530 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 62  ite error code b
30540 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
30550 20 54 68 65 20 66 69 6e 61 6c 20 73 74 61 74 65   The final state
30560 20 6f 66 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   of buffer.** pB
30570 75 66 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  uf is undefined 
30580 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
30590 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
305a0 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74  5DecodeRowidList
305b0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
305c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305d0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
305e0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
305f0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
30600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30610 2a 20 42 75 66 66 65 72 20 74 6f 20 61 70 70 65  * Buffer to appe
30620 6e 64 20 74 65 78 74 20 74 6f 20 2a 2f 0a 20 20  nd text to */.  
30630 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c  const u8 *pData,
30640 20 69 6e 74 20 6e 44 61 74 61 20 20 20 20 20 20   int nData      
30650 2f 2a 20 44 61 74 61 20 74 6f 20 64 65 63 6f 64  /* Data to decod
30660 65 20 6c 69 73 74 2d 6f 66 2d 72 6f 77 69 64 73  e list-of-rowids
30670 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e   from */.){.  in
30680 74 20 69 20 3d 20 30 3b 0a 20 20 69 36 34 20 69  t i = 0;.  i64 i
30690 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20 77 68  Rowid = 0;..  wh
306a0 69 6c 65 28 20 69 3c 6e 44 61 74 61 20 29 7b 0a  ile( i<nData ){.
306b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
306c0 7a 41 70 70 20 3d 20 22 22 3b 0a 20 20 20 20 75  zApp = "";.    u
306d0 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b  64 iVal;.    i +
306e0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
306f0 56 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d  Varint(&pData[i]
30700 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 69 52  , &iVal);.    iR
30710 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 0a 20  owid += iVal;.. 
30720 20 20 20 69 66 28 20 69 3c 6e 44 61 74 61 20 26     if( i<nData &
30730 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30  & pData[i]==0x00
30740 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
30750 20 20 20 20 20 69 66 28 20 69 3c 6e 44 61 74 61       if( i<nData
30760 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78   && pData[i]==0x
30770 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b  00 ){.        i+
30780 2b 3b 0a 20 20 20 20 20 20 20 20 7a 41 70 70 20  +;.        zApp 
30790 3d 20 22 2b 22 3b 0a 20 20 20 20 20 20 7d 65 6c  = "+";.      }el
307a0 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 41 70 70  se{.        zApp
307b0 20 3d 20 22 2a 22 3b 0a 20 20 20 20 20 20 7d 0a   = "*";.      }.
307c0 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
307d0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
307e0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
307f0 75 66 2c 20 22 20 25 6c 6c 64 25 73 22 2c 20 69  uf, " %lld%s", i
30800 52 6f 77 69 64 2c 20 7a 41 70 70 29 3b 0a 20 20  Rowid, zApp);.  
30810 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  }.}../*.** The i
30820 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
30830 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63   user-defined sc
30840 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74  alar function ft
30850 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a  s5_decode()..*/.
30860 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
30870 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a  DecodeFunction(.
30880 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
30890 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
308a0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61    /* Function ca
308b0 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
308c0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
308d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
308f0 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a  s (always 2) */.
30900 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
30910 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20  **apVal         
30920 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72    /* Function ar
30930 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
30940 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
30950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30960 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72 65 63  /* Rowid for rec
30970 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65  ord being decode
30980 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69  d */.  int iSegi
30990 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c  d,iHeight,iPgno,
309a0 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20  bDlidx;/* Rowid 
309b0 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20  components */.  
309c0 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b  const u8 *aBlob;
309d0 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
309e0 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64 65 63  /* Record to dec
309f0 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d  ode */.  u8 *a =
30a00 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   0;.  Fts5Buffer
30a10 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
30a20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75        /* Build u
30a30 70 20 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e  p text to return
30a40 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
30a50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30a70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
30a80 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 53 70  qlite3_int64 nSp
30a90 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65  ace = 0;.  int e
30aa0 44 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71  DetailNone = (sq
30ab0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
30ac0 70 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73  pCtx)!=0);..  as
30ad0 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
30ae0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
30af0 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28  nArg);.  memset(
30b00 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  &s, 0, sizeof(Ft
30b10 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52  s5Buffer));.  iR
30b20 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
30b30 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c  alue_int64(apVal
30b40 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  [0]);..  /* Make
30b50 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
30b60 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28  econd argument (
30b70 61 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62  a blob) in aBlob
30b80 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a  []. The aBlob[].
30b90 20 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c    ** copy is fol
30ba0 6c 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44 41  lowed by FTS5_DA
30bb0 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20  TA_ZERO_PADDING 
30bc0 30 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63  0x00 bytes, whic
30bd0 68 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20  h prevents.  ** 
30be0 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
30bf0 20 65 76 65 6e 20 69 66 20 74 68 65 20 72 65 63   even if the rec
30c00 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ord is corrupt. 
30c10 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65   */.  n = sqlite
30c20 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70  3_value_bytes(ap
30c30 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62  Val[1]);.  aBlob
30c40 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
30c50 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b  _blob(apVal[1]);
30c60 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20  .  nSpace = n + 
30c70 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
30c80 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75  ADDING;.  a = (u
30c90 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  8*)sqlite3Fts5Ma
30ca0 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53  llocZero(&rc, nS
30cb0 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d  pace);.  if( a==
30cc0 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f  0 ) goto decode_
30cd0 6f 75 74 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29  out;.  if( n>0 )
30ce0 20 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62   memcpy(a, aBlob
30cf0 2c 20 6e 29 3b 0a 0a 20 20 66 74 73 35 44 65 63  , n);..  fts5Dec
30d00 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c  odeRowid(iRowid,
30d10 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64   &iSegid, &bDlid
30d20 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50  x, &iHeight, &iP
30d30 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62  gno);..  fts5Deb
30d40 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c  ugRowid(&rc, &s,
30d50 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20   iRowid);.  if( 
30d60 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74  bDlidx ){.    Ft
30d70 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20  s5Data dlidx;.  
30d80 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c    Fts5DlidxLvl l
30d90 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70  vl;..    dlidx.p
30da0 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e   = a;.    dlidx.
30db0 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d  nn = n;..    mem
30dc0 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a  set(&lvl, 0, siz
30dd0 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
30de0 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74  ));.    lvl.pDat
30df0 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20  a = &dlidx;.    
30e00 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  lvl.iLeafPgno = 
30e10 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28  iPgno;..    for(
30e20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
30e30 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66  (&lvl); lvl.bEof
30e40 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76  ==0; fts5DlidxLv
30e50 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20  lNext(&lvl)){.  
30e60 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
30e70 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
30e80 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20  f(&rc, &s, .    
30e90 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29        " %d(%lld)
30ea0 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f  ", lvl.iLeafPgno
30eb0 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20  , lvl.iRowid.   
30ec0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65     );.    }.  }e
30ed0 6c 73 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d  lse if( iSegid==
30ee0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f  0 ){.    if( iRo
30ef0 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47  wid==FTS5_AVERAG
30f00 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  ES_ROWID ){.    
30f10 20 20 66 74 73 35 44 65 63 6f 64 65 41 76 65 72    fts5DecodeAver
30f20 61 67 65 73 28 26 72 63 2c 20 26 73 2c 20 61 2c  ages(&rc, &s, a,
30f30 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
30f40 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65        fts5Decode
30f50 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26  Structure(&rc, &
30f60 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  s, a, n);.    }.
30f70 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 74    }else if( eDet
30f80 61 69 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46  ailNone ){.    F
30f90 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
30fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30fb0 43 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61  Current term rea
30fc0 64 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20  d from page */. 
30fd0 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20     int szLeaf;. 
30fe0 20 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66     int iPgidxOff
30ff0 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35   = szLeaf = fts5
31000 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20  GetU16(&a[2]);. 
31010 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b     int iTermOff;
31020 0a 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d  .    int nKeep =
31030 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   0;.    int iOff
31040 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  ;..    memset(&t
31050 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
31060 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
31070 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20    /* Decode any 
31080 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
31090 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ur before the fi
310a0 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  rst term. */.   
310b0 20 69 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b   if( szLeaf<n ){
310c0 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66  .      iPgidxOff
310d0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
310e0 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66  t32(&a[iPgidxOff
310f0 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20  ], iTermOff);.  
31100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
31110 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66  TermOff = szLeaf
31120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
31130 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28  DecodeRowidList(
31140 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20  &rc, &s, &a[4], 
31150 69 54 65 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20  iTermOff-4);..  
31160 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
31170 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4f  f;.    while( iO
31180 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  ff<szLeaf ){.   
31190 20 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 3b 0a     int nAppend;.
311a0 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74  .      /* Read t
311b0 68 65 20 74 65 72 6d 20 64 61 74 61 20 66 6f 72  he term data for
311c0 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2a 2f   the next term*/
311d0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
311e0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
311f0 61 5b 69 4f 66 66 5d 2c 20 6e 41 70 70 65 6e 64  a[iOff], nAppend
31200 29 3b 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e 20  );.      term.n 
31210 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 66  = nKeep;.      f
31220 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
31230 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20  lob(&rc, &term, 
31240 6e 41 70 70 65 6e 64 2c 20 26 61 5b 69 4f 66 66  nAppend, &a[iOff
31250 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
31260 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
31270 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  dPrintf(.       
31280 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65     &rc, &s, " te
31290 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e  rm=%.*s", term.n
312a0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74  , (const char*)t
312b0 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20  erm.p.      );. 
312c0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 41 70       iOff += nAp
312d0 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pend;..      /* 
312e0 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
312f0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
31300 20 74 68 69 73 20 74 65 72 6d 20 65 6e 64 73 20   this term ends 
31310 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 50 67  */.      if( iPg
31320 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  idxOff<n ){.    
31330 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 20      int nIncr;. 
31340 20 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66         iPgidxOff
31350 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
31360 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66  t32(&a[iPgidxOff
31370 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 20  ], nIncr);.     
31380 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e     iTermOff += n
31390 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Incr;.      }els
313a0 65 7b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d  e{.        iTerm
313b0 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  Off = szLeaf;.  
313c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73      }..      fts
313d0 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74  5DecodeRowidList
313e0 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
313f0 66 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 69 4f 66  f], iTermOff-iOf
31400 66 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  f);.      iOff =
31410 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20   iTermOff;.     
31420 20 69 66 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66   if( iOff<szLeaf
31430 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
31440 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
31450 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
31460 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eep);.      }.  
31470 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66    }..    fts5Buf
31480 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
31490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73    }else{.    Fts
314a0 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
314b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
314c0 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20  rrent term read 
314d0 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20  from page */.   
314e0 20 69 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20 20   int szLeaf;    
314f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31500 2a 20 4f 66 66 73 65 74 20 6f 66 20 70 67 69 64  * Offset of pgid
31510 78 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20  x in a[] */.    
31520 69 6e 74 20 69 50 67 69 64 78 4f 66 66 3b 0a 20  int iPgidxOff;. 
31530 20 20 20 69 6e 74 20 69 50 67 69 64 78 50 72 65     int iPgidxPre
31540 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
31550 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
31560 75 65 20 72 65 61 64 20 66 72 6f 6d 20 70 67 69  ue read from pgi
31570 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54  dx */.    int iT
31580 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  ermOff = 0;.    
31590 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20  int iRowidOff = 
315a0 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  0;.    int iOff;
315b0 0a 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  .    int nDoclis
315c0 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  t;..    memset(&
315d0 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  term, 0, sizeof(
315e0 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20  Fts5Buffer));.. 
315f0 20 20 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20     if( n<4 ){.  
31600 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
31610 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26 73  ufferSet(&rc, &s
31620 2c 20 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  , 7, (const u8*)
31630 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20 20  "corrupt");.    
31640 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75    goto decode_ou
31650 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
31660 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
31670 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d  fts5GetU16(&a[0]
31680 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f  );.      iPgidxO
31690 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74  ff = szLeaf = ft
316a0 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b  s5GetU16(&a[2]);
316b0 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64  .      if( iPgid
316c0 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  xOff<n ){.      
316d0 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33    fts5GetVarint3
316e0 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c  2(&a[iPgidxOff],
316f0 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20   iTermOff);.    
31700 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 67 69    }else if( iPgi
31710 64 78 4f 66 66 3e 6e 20 29 7b 0a 20 20 20 20 20  dxOff>n ){.     
31720 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52     rc = FTS5_COR
31730 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  RUPT;.        go
31740 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20  to decode_out;. 
31750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
31760 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
31770 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 61  position list ta
31780 69 6c 20 61 74 20 74 68 65 20 73 74 61 72 74 20  il at the start 
31790 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
317a0 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
317b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66  !=0 ){.      iOf
317c0 66 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  f = iRowidOff;. 
317d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65     }else if( iTe
317e0 72 6d 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20  rmOff!=0 ){.    
317f0 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
31800 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  f;.    }else{.  
31810 20 20 20 20 69 4f 66 66 20 3d 20 73 7a 4c 65 61      iOff = szLea
31820 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  f;.    }.    if(
31830 20 69 4f 66 66 3e 6e 20 29 7b 0a 20 20 20 20 20   iOff>n ){.     
31840 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
31850 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  PT;.      goto d
31860 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ecode_out;.    }
31870 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 50  .    fts5DecodeP
31880 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oslist(&rc, &s, 
31890 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a  &a[4], iOff-4);.
318a0 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61  .    /* Decode a
318b0 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20  ny more doclist 
318c0 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
318d0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 62 65  s on the page be
318e0 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
318f0 66 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20  first term. */. 
31900 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69     nDoclist = (i
31910 54 65 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f  TermOff ? iTermO
31920 66 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69  ff : szLeaf) - i
31930 4f 66 66 3b 0a 20 20 20 20 69 66 28 20 6e 44 6f  Off;.    if( nDo
31940 63 6c 69 73 74 2b 69 4f 66 66 3e 6e 20 29 7b 0a  clist+iOff>n ){.
31950 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
31960 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 67  CORRUPT;.      g
31970 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
31980 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65      }.    fts5De
31990 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c  codeDoclist(&rc,
319a0 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e   &s, &a[iOff], n
319b0 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77  Doclist);..    w
319c0 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66 66 3c  hile( iPgidxOff<
319d0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
319e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
319f0 62 46 69 72 73 74 20 3d 20 28 69 50 67 69 64 78  bFirst = (iPgidx
31a00 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20  Off==szLeaf);   
31a10 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69    /* True for fi
31a20 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65  rst term on page
31a30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
31a40 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
31a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a60 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61  /* Bytes of data
31a70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 45   */.      int iE
31a80 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20  nd;.      .     
31a90 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74   iPgidxOff += ft
31aa0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
31ab0 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79  [iPgidxOff], nBy
31ac0 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64  te);.      iPgid
31ad0 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a  xPrev += nByte;.
31ae0 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 50 67        iOff = iPg
31af0 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20 20 20  idxPrev;..      
31b00 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  if( iPgidxOff<n 
31b10 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47  ){.        fts5G
31b20 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
31b30 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
31b40 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d  ;.        iEnd =
31b50 20 69 50 67 69 64 78 50 72 65 76 20 2b 20 6e 42   iPgidxPrev + nB
31b60 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  yte;.      }else
31b70 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d  {.        iEnd =
31b80 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d   szLeaf;.      }
31b90 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e  .      if( iEnd>
31ba0 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
31bb0 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52    rc = FTS5_CORR
31bc0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 62 72 65  UPT;.        bre
31bd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
31be0 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30     if( bFirst==0
31bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
31c00 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
31c10 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42  t32(&a[iOff], nB
31c20 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
31c30 28 20 6e 42 79 74 65 3e 74 65 72 6d 2e 6e 20 29  ( nByte>term.n )
31c40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
31c50 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
31c60 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
31c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31c80 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65    term.n = nByte
31c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31ca0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
31cb0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
31cc0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
31cd0 69 66 28 20 69 4f 66 66 2b 6e 42 79 74 65 3e 6e  if( iOff+nByte>n
31ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
31cf0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
31d00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
31d10 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
31d20 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
31d30 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79  (&rc, &term, nBy
31d40 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  te, &a[iOff]);. 
31d50 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79       iOff += nBy
31d60 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  te;..      sqlit
31d70 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
31d80 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ndPrintf(.      
31d90 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74      &rc, &s, " t
31da0 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e  erm=%.*s", term.
31db0 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  n, (const char*)
31dc0 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a  term.p.      );.
31dd0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
31de0 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28  s5DecodeDoclist(
31df0 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
31e00 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20  ], iEnd-iOff);. 
31e10 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
31e20 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
31e30 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f  .  }.  . decode_
31e40 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
31e50 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63  ree(a);.  if( rc
31e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31e70 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
31e80 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f  t_text(pCtx, (co
31e90 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73  nst char*)s.p, s
31ea0 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  .n, SQLITE_TRANS
31eb0 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
31ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31ed0 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
31ee0 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66  tx, rc);.  }.  f
31ef0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73  ts5BufferFree(&s
31f00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
31f10 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
31f20 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  f user-defined s
31f30 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
31f40 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a  ts5_rowid()..*/.
31f50 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
31f60 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20  RowidFunction(. 
31f70 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
31f80 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
31f90 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c   /* Function cal
31fa0 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  l context */.  i
31fb0 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
31fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31fd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  * Number of args
31fe0 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20   (always 2) */. 
31ff0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
32000 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
32010 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
32020 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
32030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
32040 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29  .  if( nArg==0 )
32050 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
32060 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
32070 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73   "should be: fts
32080 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c  5_rowid(subject,
32090 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20   ....)", -1);.  
320a0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20  }else{.    zArg 
320b0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
320c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
320d0 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20  t(apVal[0]);.   
320e0 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
320f0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73  stricmp(zArg, "s
32100 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  egment") ){.    
32110 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
32120 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c 20 70      int segid, p
32130 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  gno;.      if( n
32140 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg!=3 ){.      
32150 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
32160 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
32170 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c            "shoul
32180 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
32190 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69  ('segment', segi
321a0 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20  d, pgno))", -1. 
321b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
321c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
321d0 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  egid = sqlite3_v
321e0 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31  alue_int(apVal[1
321f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f  ]);.        pgno
32200 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
32210 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a  _int(apVal[2]);.
32220 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
32230 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
32240 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e 6f 29  WID(segid, pgno)
32250 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32260 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
32270 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Ctx, iRowid);.  
32280 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
32290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
322a0 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
322b0 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69 72 73  , .        "firs
322c0 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f  t arg to fts5_ro
322d0 77 69 64 28 29 20 6d 75 73 74 20 62 65 20 27 73  wid() must be 's
322e0 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20  egment'" , -1.  
322f0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
32300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
32310 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
32320 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67 20   of registering 
32330 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20  the FTS5 module 
32340 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a  with database.**
32350 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20   connection db. 
32360 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65 76  It registers sev
32370 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65  eral user-define
32380 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
32390 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74  ns useful.** wit
323a0 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66  h FTS5..**.** If
323b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
323c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
323d0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
323e0 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68  occurs, some oth
323f0 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  er.** SQLite err
32400 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
32410 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ned instead..*/.
32420 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
32430 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33  ndexInit(sqlite3
32440 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
32450 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
32460 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
32470 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64   db, "fts5_decod
32480 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  e", 2, SQLITE_UT
32490 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64  F8, 0, fts5Decod
324a0 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a  eFunction, 0, 0.
324b0 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d    );..  if( rc==
324c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
324d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
324e0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
324f0 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35         db, "fts5
32500 5f 64 65 63 6f 64 65 5f 6e 6f 6e 65 22 2c 20 32  _decode_none", 2
32510 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  , .        SQLIT
32520 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 64  E_UTF8, (void*)d
32530 62 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e  b, fts5DecodeFun
32540 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20  ction, 0, 0.    
32550 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
32560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32570 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
32580 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
32590 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74  .        db, "ft
325a0 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53  s5_rowid", -1, S
325b0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
325c0 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e  ts5RowidFunction
325d0 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
325e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
325f0 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
32600 73 35 49 6e 64 65 78 52 65 73 65 74 28 46 74 73  s5IndexReset(Fts
32610 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73  5Index *p){.  as
32620 73 65 72 74 28 20 70 2d 3e 70 53 74 72 75 63 74  sert( p->pStruct
32630 3d 3d 30 20 7c 7c 20 70 2d 3e 69 53 74 72 75 63  ==0 || p->iStruc
32640 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20  tVersion!=0 );. 
32650 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 44 61   if( fts5IndexDa
32660 74 61 56 65 72 73 69 6f 6e 28 70 29 21 3d 70 2d  taVersion(p)!=p-
32670 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 20  >iStructVersion 
32680 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  ){.    fts5Struc
32690 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70  tureInvalidate(p
326a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
326b0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
326c0 70 29 3b 0a 7d 0a                                p);.}.