/ Hex Artifact Content
Login

Artifact 6694a1ee02fe4dfeecb19b4d7b730003af9d8c1b9b3ed34ffc0ca88ac9fecbfd:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
4d20: 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
4d30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 74 72   /* Database str
4d40: 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20  ucture for this 
4d50: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74  iterator */.  Ft
4d60: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
4d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d80: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
4d90: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
4da0: 73 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  st */.  Fts5Cols
4db0: 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
4dc0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
4dd0: 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
4de0: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  hese columns */.
4df0: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64 20 74 6f  .  /* Invoked to
4e00: 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   set output vari
4e10: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76 6f 69 64  ables. */.  void
4e20: 20 28 2a 78 53 65 74 4f 75 74 70 75 74 73 29 28   (*xSetOutputs)(
4e30: 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 53  Fts5Iter*, Fts5S
4e40: 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20 69 6e 74  egIter*);..  int
4e50: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e70: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4e80: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4e90: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4eb0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4ec0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4ed0: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ef0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4f00: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4f10: 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20 69 53 77  es */..  i64 iSw
4f20: 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20 20 20  itchRowid;      
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4f40: 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20 6f 74  test rowid of ot
4f50: 68 65 72 20 74 68 61 6e 20 61 46 69 72 73 74 5b  her than aFirst[
4f60: 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  1] */.  Fts5CRes
4f70: 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20 20 20  ult *aFirst;    
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f90: 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28  nt merge state (
4fa0: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
4fb0: 46 74 73 35 53 65 67 49 74 65 72 20 61 53 65 67  Fts5SegIter aSeg
4fc0: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
4fd0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
4fe0: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f  ent iterators */
4ff0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  .};.../*.** An i
5000: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5010: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
5020: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5030: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5040: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5050: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5060: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5070: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5080: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5090: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
50a0: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
50b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
50c0: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
50d0: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
50e0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
50f0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5100: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5110: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5120: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
5130: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
5140: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5150: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5160: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
5170: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
5180: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
51b0: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
51c0: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51e0: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
5200: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5210: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5220: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
5230: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
5240: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5250: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5280: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5290: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
52a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
52b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
52c0: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
52d0: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
52e0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
52f0: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
5300: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5310: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5320: 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  [1];.};..static 
5330: 76 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28  void fts5PutU16(
5340: 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56  u8 *aOut, u16 iV
5350: 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d  al){.  aOut[0] =
5360: 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f   (iVal>>8);.  aO
5370: 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78  ut[1] = (iVal&0x
5380: 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  FF);.}..static u
5390: 31 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f  16 fts5GetU16(co
53a0: 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20  nst u8 *aIn){.  
53b0: 72 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e  return ((u16)aIn
53c0: 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b  [0] << 8) + aIn[
53d0: 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c  1];.} ../*.** Al
53e0: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
53f0: 6e 20 61 20 62 75 66 66 65 72 20 61 74 20 6c 65  n a buffer at le
5400: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20  ast nByte bytes 
5410: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
5420: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
5430: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72  s encountered, r
5440: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73  eturn NULL and s
5450: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
5460: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35  e in.** the Fts5
5470: 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73  Index handle pas
5480: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5490: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49  atic void *fts5I
54b0: 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64  dxMalloc(Fts5Ind
54c0: 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ex *p, int nByte
54d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
54e0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
54f0: 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
5500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
5510: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5520: 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75 66  of the pLeft buf
5530: 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52 69  fer with the pRi
5540: 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e  ght/nRight blob.
5550: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
5560: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
5570: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
5580: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
5590: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
55a0: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
55b0: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
55c0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
55d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
55e0: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
55f0: 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ht.*/.#ifdef SQL
5600: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5610: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
5620: 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74  ompareBlob(.  Ft
5630: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5650: 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20   Left hand side 
5660: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
5670: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
5680: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20  ght, int nRight 
5690: 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64     /* Right hand
56a0: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
56b0: 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
56c0: 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74  nCmp = MIN(pLeft
56d0: 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20  ->n, nRight);.  
56e0: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
56f0: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5700: 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  t, nCmp);.  retu
5710: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
5720: 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29  eft->n - nRight)
5730: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
5740: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  f../*.** Compare
5750: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
5760: 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
5770: 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
5780: 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a   If one buffer.*
5790: 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  * is a prefix of
57a0: 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
57b0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65  s considered the
57c0: 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   lesser..**.** R
57d0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
57e0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
57f0: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
5800: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
5810: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
5820: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
5830: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
5840: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
5850: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
5860: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
5870: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
5880: 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42  ferCompare(Fts5B
5890: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74  uffer *pLeft, Ft
58a0: 73 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74  s5Buffer *pRight
58b0: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
58c0: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52  MIN(pLeft->n, pR
58d0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20  ight->n);.  int 
58e0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
58f0: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70  ft->p, pRight->p
5900: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
5910: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
5920: 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e  ft->n - pRight->
5930: 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73 74  n) : res);.}..st
5940: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65 61  atic int fts5Lea
5950: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46 74  fFirstTermOff(Ft
5960: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a  s5Data *pLeaf){.
5970: 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74 73    int ret;.  fts
5980: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
5990: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
59a0: 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20 72  Leaf], ret);.  r
59b0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
59c0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
59d0: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
59e0: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
59f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
5a00: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
5a10: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
5a20: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
5a30: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
5a40: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20  3_blob *pReader 
5a50: 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20  = p->pReader;.  
5a60: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
5a70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  ;.    sqlite3_bl
5a80: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
5a90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5aa0: 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f 72  Retrieve a recor
5ab0: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
5ac0: 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
5ad0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
5ae0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
5af0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
5b00: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a   left in the .**
5b10: 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63   Fts5Index objec
5b20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  t..*/.static Fts
5b30: 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52  5Data *fts5DataR
5b40: 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ead(Fts5Index *p
5b50: 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
5b60: 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74 20   Fts5Data *pRet 
5b70: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
5b80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5b90: 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
5ba0: 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20  TE_OK;..    if( 
5bb0: 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20  p->pReader ){.  
5bc0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
5bd0: 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
5be0: 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65 72  TE_ABORT if ther
5bf0: 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61 76  e has been a sav
5c00: 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20  epoint.      ** 
5c10: 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20 69  rollback since i
5c20: 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
5c30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 20   In this case a 
5c40: 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a  new blob handle.
5c50: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
5c60: 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ired.  */.      
5c70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
5c80: 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65 72  lob = p->pReader
5c90: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64  ;.      p->pRead
5ca0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  er = 0;.      rc
5cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
5cc0: 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52  reopen(pBlob, iR
5cd0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73 73  owid);.      ass
5ce0: 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d  ert( p->pReader=
5cf0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 );.      p->p
5d00: 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b 0a  Reader = pBlob;.
5d10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
5d20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5d30: 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
5d40: 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  er(p);.      }. 
5d50: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
5d60: 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20 3d  ITE_ABORT ) rc =
5d70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5d80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
5d90: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20   blob handle is 
5da0: 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69 73  not open at this
5db0: 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74 20   point, open it 
5dc0: 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a 2a  and seek .    **
5dd0: 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74 65   to the requeste
5de0: 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 20  d entry.  */.   
5df0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d   if( p->pReader=
5e00: 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
5e10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73  _OK ){.      Fts
5e20: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
5e30: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
5e40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5e50: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e  3_blob_open(pCon
5e60: 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20  fig->db, .      
5e70: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
5e80: 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22  , p->zDataTbl, "
5e90: 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20  block", iRowid, 
5ea0: 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20  0, &p->pReader. 
5eb0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
5ec0: 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
5ed0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  of the sqlite3_b
5ee0: 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  lob_open() or sq
5ef0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
5f00: 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a  n() calls.    **
5f10: 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20   above returned 
5f20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65  SQLITE_ERROR, re
5f30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
5f40: 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64  UPT_VTAB instead
5f50: 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65  ..    ** All the
5f60: 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66   reasons those f
5f70: 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72  unctions might r
5f80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5f90: 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20  OR - missing.   
5fa0: 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69   ** table, missi
5fb0: 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62  ng row, non-blob
5fc0: 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63  /text in block c
5fd0: 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65  olumn - indicate
5fe0: 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67   .    ** backing
5ff0: 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f   store corruptio
6000: 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  n.  */.    if( r
6010: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
6020: 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
6030: 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  UPT;..    if( rc
6040: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6050: 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20       u8 *aOut = 
6060: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6070: 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61   /* Read blob da
6080: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  ta into this buf
6090: 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  fer */.      int
60a0: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
60b0: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
60c0: 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69  Reader);.      i
60d0: 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65  nt nAlloc = size
60e0: 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 6e  of(Fts5Data) + n
60f0: 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41 54 41  Byte + FTS5_DATA
6100: 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PADDING;.      
6110: 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74 61  pRet = (Fts5Data
6120: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6130: 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  (nAlloc);.      
6140: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
6150: 20 20 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e      pRet->nn = n
6160: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 61 4f  Byte;.        aO
6170: 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28  ut = pRet->p = (
6180: 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20  u8*)&pRet[1];.  
6190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
61b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OMEM;.      }.. 
61c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
61d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
61e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
61f0: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61  lob_read(p->pRea
6200: 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65  der, aOut, nByte
6210: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6220: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6240: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
6250: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  et);.        pRe
6260: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
6270: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
6280: 4f 44 4f 31 3a 20 46 69 78 20 74 68 69 73 20 2a  ODO1: Fix this *
6290: 2f 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  /.        pRet->
62a0: 70 5b 6e 42 79 74 65 5d 20 3d 20 30 78 30 30 3b  p[nByte] = 0x00;
62b0: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 73  .        pRet->s
62c0: 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
62d0: 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b  16(&pRet->p[2]);
62e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
62f0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
6300: 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20     p->nRead++;. 
6310: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
6320: 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21  Ret==0)==(p->rc!
6330: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20  =SQLITE_OK) );. 
6340: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
6350: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6360: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64 61   reference to da
6370: 74 61 20 72 65 63 6f 72 64 20 72 65 74 75 72 6e  ta record return
6380: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
6390: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35   call to.** fts5
63a0: 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73  DataRead()..*/.s
63b0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
63c0: 61 74 61 52 65 6c 65 61 73 65 28 46 74 73 35 44  ataRelease(Fts5D
63d0: 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 73  ata *pData){.  s
63e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
63f0: 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74  a);.}..static Ft
6400: 73 35 44 61 74 61 20 2a 66 74 73 35 4c 65 61 66  s5Data *fts5Leaf
6410: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
6420: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
6430: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
6440: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
6450: 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  p, iRowid);.  if
6460: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 66  ( pRet ){.    if
6470: 28 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 3e 70  ( pRet->szLeaf>p
6480: 52 65 74 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20  Ret->nn ){.     
6490: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
64a0: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 66 74 73  RRUPT;.      fts
64b0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 52 65  5DataRelease(pRe
64c0: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
64d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
64e0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
64f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
6500: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6510: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
6520: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
6530: 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72  **ppStmt,.  char
6540: 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20   *zSql.){.  if( 
6550: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
6560: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
6570: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
6580: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6590: 65 5f 76 33 28 70 2d 3e 70 43 6f 6e 66 69 67 2d  e_v3(p->pConfig-
65a0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20  >db, zSql, -1,. 
65b0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
65c0: 50 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45  PREPARE_PERSISTE
65d0: 4e 54 7c 53 51 4c 49 54 45 5f 50 52 45 50 41 52  NT|SQLITE_PREPAR
65e0: 45 5f 4e 4f 5f 56 54 41 42 2c 0a 20 20 20 20 20  E_NO_VTAB,.     
65f0: 20 20 20 20 20 70 70 53 74 6d 74 2c 20 30 29 3b       ppStmt, 0);
6600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6610: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
6620: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
6630: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
6640: 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zSql);.  return
6650: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   p->rc;.}.../*.*
6660: 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c  * INSERT OR REPL
6670: 41 43 45 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ACE a record int
6680: 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  o the %_data tab
6690: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
66a0: 69 64 20 66 74 73 35 44 61 74 61 57 72 69 74 65  id fts5DataWrite
66b0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
66c0: 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74  64 iRowid, const
66d0: 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
66e0: 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d  nData){.  if( p-
66f0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
6700: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
6710: 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b  p->pWriter==0 ){
6720: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
6730: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
6740: 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
6750: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6760: 70 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20  p, &p->pWriter, 
6770: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6780: 0a 20 20 20 20 20 20 20 20 20 20 22 52 45 50 4c  .          "REPL
6790: 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25  ACE INTO '%q'.'%
67a0: 71 5f 64 61 74 61 27 28 69 64 2c 20 62 6c 6f 63  q_data'(id, bloc
67b0: 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c  k) VALUES(?,?)",
67c0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
67d0: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
67e0: 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
67f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
6800: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
6810: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6820: 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31  64(p->pWriter, 1
6830: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  , iRowid);.  sql
6840: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
6850: 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44  ->pWriter, 2, pD
6860: 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49  ata, nData, SQLI
6870: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
6880: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57  lite3_step(p->pW
6890: 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  riter);.  p->rc 
68a0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
68b0: 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 73  p->pWriter);.  s
68c0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
68d0: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 29 3b  (p->pWriter, 2);
68e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
68f0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
6900: 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  SQL:.**.**     D
6910: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
6920: 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45  a WHERE id BETWE
6930: 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24  EN $iFirst AND $
6940: 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  iLast.*/.static 
6950: 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c  void fts5DataDel
6960: 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ete(Fts5Index *p
6970: 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36  , i64 iFirst, i6
6980: 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20  4 iLast){.  if( 
6990: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
69a0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
69b0: 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30  ( p->pDeleter==0
69c0: 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
69d0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
69e0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68  >pConfig;.    ch
69f0: 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
6a00: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6a10: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6a20: 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20   '%q'.'%q_data' 
6a30: 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20  WHERE id>=? AND 
6a40: 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20  id<=?", .       
6a50: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
6a60: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
6a70: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 66      );.    if( f
6a80: 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
6a90: 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44 65 6c 65  tmt(p, &p->pDele
6aa0: 74 65 72 2c 20 7a 53 71 6c 29 20 29 20 72 65 74  ter, zSql) ) ret
6ab0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  urn;.  }..  sqli
6ac0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
6ad0: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  ->pDeleter, 1, i
6ae0: 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  First);.  sqlite
6af0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
6b00: 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61  pDeleter, 2, iLa
6b10: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
6b20: 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  tep(p->pDeleter)
6b30: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
6b40: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65  te3_reset(p->pDe
6b50: 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  leter);.}../*.**
6b60: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f   Remove all reco
6b70: 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  rds associated w
6b80: 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67  ith segment iSeg
6b90: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  id..*/.static vo
6ba0: 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76  id fts5DataRemov
6bb0: 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64  eSegment(Fts5Ind
6bc0: 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69  ex *p, int iSegi
6bd0: 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74  d){.  i64 iFirst
6be0: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
6bf0: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 29  ROWID(iSegid, 0)
6c00: 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
6c10: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6c20: 49 44 28 69 53 65 67 69 64 2b 31 2c 20 30 29 2d  ID(iSegid+1, 0)-
6c30: 31 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c  1;.  fts5DataDel
6c40: 65 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69  ete(p, iFirst, i
6c50: 4c 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Last);.  if( p->
6c60: 70 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29  pIdxDeleter==0 )
6c70: 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
6c80: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
6c90: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
6ca0: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
6cb0: 28 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65  (p, &p->pIdxDele
6cc0: 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  ter, sqlite3_mpr
6cd0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
6ce0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
6cf0: 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45  '.'%q_idx' WHERE
6d00: 20 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20   segid=?",.     
6d10: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
6d20: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
6d30: 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20  e.    ));.  }.  
6d40: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
6d50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6d60: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
6d70: 70 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20  pIdxDeleter, 1, 
6d80: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c  iSegid);.    sql
6d90: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64  ite3_step(p->pId
6da0: 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70  xDeleter);.    p
6db0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6dc0: 65 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65  eset(p->pIdxDele
6dd0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
6de0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
6df0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73  erence to an Fts
6e00: 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
6e10: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  t returned by an
6e20: 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c   earlier .** cal
6e30: 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75  l to fts5Structu
6e40: 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35  reRead() or fts5
6e50: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
6e60: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
6e70: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  d fts5StructureR
6e80: 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63  elease(Fts5Struc
6e90: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
6ea0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
6eb0: 20 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e   0>=(--pStruct->
6ec0: 6e 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74  nRef) ){.    int
6ed0: 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
6ee0: 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30  pStruct->nRef==0
6ef0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
6f00: 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   i<pStruct->nLev
6f10: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
6f20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
6f30: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
6f40: 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aSeg);.    }.   
6f50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
6f60: 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  truct);.  }.}..s
6f70: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
6f80: 74 72 75 63 74 75 72 65 52 65 66 28 46 74 73 35  tructureRef(Fts5
6f90: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
6fa0: 63 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e  ct){.  pStruct->
6fb0: 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nRef++;.}../*.**
6fc0: 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64   Deserialize and
6fd0: 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75   return the stru
6fe0: 63 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72  cture record cur
6ff0: 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
7000: 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66   serialized.** f
7010: 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65  orm within buffe
7020: 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a  r pData/nData..*
7030: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72  *.** The Fts5Str
7040: 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20  ucture.aLevel[] 
7050: 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72  and each Fts5Str
7060: 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67  uctureLevel.aSeg
7070: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
7080: 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62  over-allocated b
7090: 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73  y one slot. This
70a0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75   allows the stru
70b0: 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  cture contents.*
70c0: 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73  * to be more eas
70d0: 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a  ily edited..**.*
70e0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
70f0: 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20  curs, *ppOut is 
7100: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
7110: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
7120: 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
7130: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70  . Otherwise, *pp
7140: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
7150: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
7160: 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c  bject and.** SQL
7170: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
7180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7190: 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
71a0: 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  de(.  const u8 *
71b0: 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
71c0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
71d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61  containing seria
71e0: 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20  lized structure 
71f0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7220: 62 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20  buffer pData in 
7230: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  bytes */.  int *
7240: 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20  piCookie,       
7250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7260: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
7270: 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74  ie value */.  Ft
7280: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
7290: 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Out           /*
72a0: 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a   OUT: Deserializ
72b0: 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ed object */.){.
72c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
72d0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20  E_OK;.  int i = 
72e0: 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20  0;.  int iLvl;. 
72f0: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b   int nLevel = 0;
7300: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
7310: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
7320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7330: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
7340: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
7350: 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a  cate at pRet */.
7360: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7370: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
7380: 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
7390: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
73a0: 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  */..  /* Grab th
73b0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  e cookie value *
73c0: 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65  /.  if( piCookie
73d0: 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73   ) *piCookie = s
73e0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28  qlite3Fts5Get32(
73f0: 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b  pData);.  i = 4;
7400: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
7410: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7420: 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65  levels and segme
7430: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
7440: 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  rt of the.  ** s
7450: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
7460: 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35    */.  i += fts5
7470: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7480: 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a  ta[i], nLevel);.
7490: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
74a0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
74b0: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69  , nSegment);.  i
74c0: 66 28 20 6e 4c 65 76 65 6c 3e 46 54 53 35 5f 4d  f( nLevel>FTS5_M
74d0: 41 58 5f 53 45 47 4d 45 4e 54 20 20 20 7c 7c 20  AX_SEGMENT   || 
74e0: 6e 4c 65 76 65 6c 3c 30 0a 20 20 20 7c 7c 20 6e  nLevel<0.   || n
74f0: 53 65 67 6d 65 6e 74 3e 46 54 53 35 5f 4d 41 58  Segment>FTS5_MAX
7500: 5f 53 45 47 4d 45 4e 54 20 7c 7c 20 6e 53 65 67  _SEGMENT || nSeg
7510: 6d 65 6e 74 3c 30 0a 20 20 29 7b 0a 20 20 20 20  ment<0.  ){.    
7520: 72 65 74 75 72 6e 20 46 54 53 35 5f 43 4f 52 52  return FTS5_CORR
7530: 55 50 54 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  UPT;.  }.  nByte
7540: 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f   = (.      sizeo
7550: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
7560: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
7570: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
7580: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
7590: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
75a0: 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e  ctureLevel) * (n
75b0: 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61  Level-1)    /* a
75c0: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
75d0: 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28  .  );.  pRet = (
75e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73  Fts5Structure*)s
75f0: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
7600: 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29  Zero(&rc, nByte)
7610: 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  ;..  if( pRet ){
7620: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20  .    pRet->nRef 
7630: 3d 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  = 1;.    pRet->n
7640: 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a  Level = nLevel;.
7650: 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65      pRet->nSegme
7660: 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20  nt = nSegment;. 
7670: 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46     i += sqlite3F
7680: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
7690: 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e  ata[i], &pRet->n
76a0: 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a  WriteCounter);..
76b0: 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
76c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
76d0: 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c   iLvl<nLevel; iL
76e0: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  vl++){.      Fts
76f0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
7700: 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61  *pLvl = &pRet->a
7710: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
7720: 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20     int nTotal = 
7730: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  0;.      int iSe
7740: 67 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3e  g;..      if( i>
7750: 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  =nData ){.      
7760: 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52    rc = FTS5_CORR
7770: 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
7780: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66  {.        i += f
7790: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
77a0: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
77b0: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 20  nMerge);.       
77c0: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
77d0: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
77e0: 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20   nTotal);.      
77f0: 20 20 69 66 28 20 6e 54 6f 74 61 6c 3c 70 4c 76    if( nTotal<pLv
7800: 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 63 20 3d  l->nMerge ) rc =
7810: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
7820: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65         pLvl->aSe
7830: 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  g = (Fts5Structu
7840: 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74  reSegment*)sqlit
7850: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
7860: 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20  (&rc, .         
7870: 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65     nTotal * size
7880: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7890: 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 20  Segment).       
78a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 67   );.        nSeg
78b0: 6d 65 6e 74 20 2d 3d 20 6e 54 6f 74 61 6c 3b 0a  ment -= nTotal;.
78c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
78d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
78e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c   ){.        pLvl
78f0: 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b  ->nSeg = nTotal;
7900: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
7910: 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c  g=0; iSeg<nTotal
7920: 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
7930: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
7940: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
7950: 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
7960: 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
7970: 66 28 20 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20  f( i>=nData ){. 
7980: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
7990: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
79a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
79b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
79c0: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
79d0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
79e0: 74 61 5b 69 5d 2c 20 70 53 65 67 2d 3e 69 53 65  ta[i], pSeg->iSe
79f0: 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gid);.          
7a00: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7a10: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7a20: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29  pSeg->pgnoFirst)
7a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
7a40: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7a50: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 53 65 67  (&pData[i], pSeg
7a60: 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20  ->pgnoLast);.   
7a70: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d         if( pSeg-
7a80: 3e 70 67 6e 6f 4c 61 73 74 3c 70 53 65 67 2d 3e  >pgnoLast<pSeg->
7a90: 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20  pgnoFirst ){.   
7aa0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54           rc = FT
7ab0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
7ac0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7ad0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7ae0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
7af0: 20 69 4c 76 6c 3e 30 20 26 26 20 70 4c 76 6c 5b   iLvl>0 && pLvl[
7b00: 2d 31 5d 2e 6e 4d 65 72 67 65 20 26 26 20 6e 54  -1].nMerge && nT
7b10: 6f 74 61 6c 3d 3d 30 20 29 20 72 63 20 3d 20 46  otal==0 ) rc = F
7b20: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
7b30: 20 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 6e       if( iLvl==n
7b40: 4c 65 76 65 6c 2d 31 20 26 26 20 70 4c 76 6c 2d  Level-1 && pLvl-
7b50: 3e 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20 46  >nMerge ) rc = F
7b60: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
7b70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
7b80: 66 28 20 6e 53 65 67 6d 65 6e 74 21 3d 30 20 26  f( nSegment!=0 &
7b90: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
7ba0: 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
7bb0: 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  UPT;..    if( rc
7bc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7bd0: 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
7be0: 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b  reRelease(pRet);
7bf0: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
7c00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
7c10: 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20 20 72  pOut = pRet;.  r
7c20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7c30: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
7c40: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41  d fts5StructureA
7c50: 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52 63  ddLevel(int *pRc
7c60: 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
7c70: 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a 20 20 69  **ppStruct){.  i
7c80: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
7c90: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  OK ){.    Fts5St
7ca0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
7cb0: 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
7cc0: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70    int nLevel = p
7cd0: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a  Struct->nLevel;.
7ce0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
7cf0: 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66  (.        sizeof
7d00: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
7d10: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
7d20: 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63     /* Main struc
7d30: 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ture */.        
7d40: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7d50: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
7d60: 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65 76  evel+1)  /* aLev
7d70: 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  el[] array */.  
7d80: 20 20 29 3b 0a 0a 20 20 20 20 70 53 74 72 75 63    );..    pStruc
7d90: 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  t = sqlite3_real
7da0: 6c 6f 63 28 70 53 74 72 75 63 74 2c 20 6e 42 79  loc(pStruct, nBy
7db0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  te);.    if( pSt
7dc0: 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 6d 65  ruct ){.      me
7dd0: 6d 73 65 74 28 26 70 53 74 72 75 63 74 2d 3e 61  mset(&pStruct->a
7de0: 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30  Level[nLevel], 0
7df0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
7e00: 75 63 74 75 72 65 4c 65 76 65 6c 29 29 3b 0a 20  uctureLevel));. 
7e10: 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 4c       pStruct->nL
7e20: 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a 70  evel++;.      *p
7e30: 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
7e40: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
7e50: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
7e60: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
7e70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65   }.}../*.** Exte
7e80: 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20 73 6f  nd level iLvl so
7e90: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 72   that there is r
7ea0: 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74  oom for at least
7eb0: 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a 2a 20   nExtra more.** 
7ec0: 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  segments..*/.sta
7ed0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
7ee0: 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
7ef0: 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  l(.  int *pRc, .
7f00: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7f10: 2a 70 53 74 72 75 63 74 2c 20 0a 20 20 69 6e 74  *pStruct, .  int
7f20: 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20 6e 45   iLvl, .  int nE
7f30: 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 49 6e  xtra, .  int bIn
7f40: 73 65 72 74 0a 29 7b 0a 20 20 69 66 28 20 2a 70  sert.){.  if( *p
7f50: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
7f60: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7f70: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
7f80: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
7f90: 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74 73 35  [iLvl];.    Fts5
7fa0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7fb0: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *aNew;.    int 
7fc0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79 74  nByte;..    nByt
7fd0: 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20  e = (pLvl->nSeg 
7fe0: 2b 20 6e 45 78 74 72 61 29 20 2a 20 73 69 7a 65  + nExtra) * size
7ff0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
8000: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61 4e  Segment);.    aN
8010: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
8020: 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65 67 2c  lloc(pLvl->aSeg,
8030: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
8040: 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69   aNew ){.      i
8050: 66 28 20 62 49 6e 73 65 72 74 3d 3d 30 20 29 7b  f( bInsert==0 ){
8060: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
8070: 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67  &aNew[pLvl->nSeg
8080: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  ], 0, sizeof(Fts
8090: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
80a0: 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20  t) * nExtra);.  
80b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
80c0: 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 70     int nMove = p
80d0: 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a 65  Lvl->nSeg * size
80e0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
80f0: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Segment);.      
8100: 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b    memmove(&aNew[
8110: 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20 6e  nExtra], aNew, n
8120: 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 6d  Move);.        m
8130: 65 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20 73  emset(aNew, 0, s
8140: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
8150: 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45  ureSegment) * nE
8160: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra);.      }. 
8170: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
8180: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73  = aNew;.    }els
8190: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
81a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
81b0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
81c0: 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  c Fts5Structure 
81d0: 2a 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65  *fts5StructureRe
81e0: 61 64 55 6e 63 61 63 68 65 64 28 46 74 73 35 49  adUncached(Fts5I
81f0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
8200: 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74 20  Structure *pRet 
8210: 3d 20 30 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69  = 0;.  Fts5Confi
8220: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
8230: 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69  pConfig;.  int i
8240: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
8250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
8260: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
8270: 69 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  ie */.  Fts5Data
8280: 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44 61 74   *pData;..  pDat
8290: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
82a0: 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  (p, FTS5_STRUCTU
82b0: 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28  RE_ROWID);.  if(
82c0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
82d0: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K ){.    /* TODO
82e0: 3a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 68 69  : Do we need thi
82f0: 73 20 69 66 20 74 68 65 20 6c 65 61 66 2d 69 6e  s if the leaf-in
8300: 64 65 78 20 69 73 20 61 70 70 65 6e 64 65 64 3f  dex is appended?
8310: 20 50 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a   Probably... */.
8320: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 44 61 74      memset(&pDat
8330: 61 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c  a->p[pData->nn],
8340: 20 30 2c 20 46 54 53 35 5f 44 41 54 41 5f 50 41   0, FTS5_DATA_PA
8350: 44 44 49 4e 47 29 3b 0a 20 20 20 20 70 2d 3e 72  DDING);.    p->r
8360: 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  c = fts5Structur
8370: 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70  eDecode(pData->p
8380: 2c 20 70 44 61 74 61 2d 3e 6e 6e 2c 20 26 69 43  , pData->nn, &iC
8390: 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a 20  ookie, &pRet);. 
83a0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
83b0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66  LITE_OK && pConf
83c0: 69 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f  ig->iCookie!=iCo
83d0: 6f 6b 69 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  okie ){.      p-
83e0: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
83f0: 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43 6f 6e  5ConfigLoad(pCon
8400: 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20  fig, iCookie);. 
8410: 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
8420: 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
8430: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  .    if( p->rc!=
8440: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8450: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
8460: 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20  Release(pRet);. 
8470: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
8480: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
8490: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61 74  rn pRet;.}..stat
84a0: 69 63 20 69 36 34 20 66 74 73 35 49 6e 64 65 78  ic i64 fts5Index
84b0: 44 61 74 61 56 65 72 73 69 6f 6e 28 46 74 73 35  DataVersion(Fts5
84c0: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 36 34  Index *p){.  i64
84d0: 20 69 56 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 0a   iVersion = 0;..
84e0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
84f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
8500: 28 20 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  ( p->pDataVersio
8510: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  n==0 ){.      p-
8520: 3e 72 63 20 3d 20 66 74 73 35 49 6e 64 65 78 50  >rc = fts5IndexP
8530: 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70  repareStmt(p, &p
8540: 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20  ->pDataVersion, 
8550: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8560: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
8570: 4d 41 20 25 51 2e 64 61 74 61 5f 76 65 72 73 69  MA %Q.data_versi
8580: 6f 6e 22 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  on", p->pConfig-
8590: 3e 7a 44 62 29 0a 20 20 20 20 20 20 20 20 20 20  >zDb).          
85a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
85b0: 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rc ) return 0;. 
85c0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 53 51     }..    if( SQ
85d0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
85e0: 33 5f 73 74 65 70 28 70 2d 3e 70 44 61 74 61 56  3_step(p->pDataV
85f0: 65 72 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20  ersion) ){.     
8600: 20 69 56 65 72 73 69 6f 6e 20 3d 20 73 71 6c 69   iVersion = sqli
8610: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
8620: 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e  (p->pDataVersion
8630: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
8640: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
8650: 72 65 73 65 74 28 70 2d 3e 70 44 61 74 61 56 65  reset(p->pDataVe
8660: 72 73 69 6f 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72  rsion);.  }..  r
8670: 65 74 75 72 6e 20 69 56 65 72 73 69 6f 6e 3b 0a  eturn iVersion;.
8680: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64  }../*.** Read, d
8690: 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72  eserialize and r
86a0: 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74  eturn the struct
86b0: 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  ure record..**.*
86c0: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
86d0: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
86e0: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
86f0: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
8700: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
8710: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 64  r-allocated as d
8720: 65 73 63 72 69 62 65 64 20 66 6f 72 20 66 75 6e  escribed for fun
8730: 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63 74  ction fts5Struct
8740: 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20  ureDecode() .** 
8750: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  above..**.** If 
8760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8770: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
8780: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  d and an error c
8790: 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a  ode left in the.
87a0: 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ** Fts5Index han
87b0: 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  dle. If an error
87c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
87d0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
87e0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
87f0: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
8800: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
8810: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66  Fts5Structure *f
8820: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
8830: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
8840: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 72 75 63  .  if( p->pStruc
8850: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 69  t==0 ){.    p->i
8860: 53 74 72 75 63 74 56 65 72 73 69 6f 6e 20 3d 20  StructVersion = 
8870: 66 74 73 35 49 6e 64 65 78 44 61 74 61 56 65 72  fts5IndexDataVer
8880: 73 69 6f 6e 28 70 29 3b 0a 20 20 20 20 69 66 28  sion(p);.    if(
8890: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
88a0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53  K ){.      p->pS
88b0: 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
88c0: 63 74 75 72 65 52 65 61 64 55 6e 63 61 63 68 65  ctureReadUncache
88d0: 64 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  d(p);.    }.  }.
88e0: 0a 23 69 66 20 30 0a 20 20 65 6c 73 65 7b 0a 20  .#if 0.  else{. 
88f0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
8900: 20 2a 70 54 65 73 74 20 3d 20 66 74 73 35 53 74   *pTest = fts5St
8910: 72 75 63 74 75 72 65 52 65 61 64 55 6e 63 61 63  ructureReadUncac
8920: 68 65 64 28 70 29 3b 0a 20 20 20 20 69 66 28 20  hed(p);.    if( 
8930: 70 54 65 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pTest ){.      i
8940: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 61  nt i, j;.      a
8950: 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74  ssert_nc( p->pSt
8960: 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  ruct->nSegment==
8970: 70 54 65 73 74 2d 3e 6e 53 65 67 6d 65 6e 74 20  pTest->nSegment 
8980: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f  );.      assert_
8990: 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e  nc( p->pStruct->
89a0: 6e 4c 65 76 65 6c 3d 3d 70 54 65 73 74 2d 3e 6e  nLevel==pTest->n
89b0: 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 66  Level );.      f
89c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 65 73 74 2d  or(i=0; i<pTest-
89d0: 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
89e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
89f0: 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61 4c  ( p->pStruct->aL
8a00: 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d  evel[i].nMerge==
8a10: 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  pTest->aLevel[i]
8a20: 2e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20  .nMerge );.     
8a30: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
8a40: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8a50: 5b 69 5d 2e 6e 53 65 67 3d 3d 70 54 65 73 74 2d  [i].nSeg==pTest-
8a60: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 20  >aLevel[i].nSeg 
8a70: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
8a80: 3d 30 3b 20 6a 3c 70 54 65 73 74 2d 3e 61 4c 65  =0; j<pTest->aLe
8a90: 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 20 6a 2b 2b  vel[i].nSeg; j++
8aa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ){.          Fts
8ab0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
8ac0: 74 20 2a 70 31 20 3d 20 26 70 54 65 73 74 2d 3e  t *p1 = &pTest->
8ad0: 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a  aLevel[i].aSeg[j
8ae0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ];.          Fts
8af0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
8b00: 74 20 2a 70 32 20 3d 20 26 70 2d 3e 70 53 74 72  t *p2 = &p->pStr
8b10: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61  uct->aLevel[i].a
8b20: 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  Seg[j];.        
8b30: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d    assert_nc( p1-
8b40: 3e 69 53 65 67 69 64 3d 3d 70 32 2d 3e 69 53 65  >iSegid==p2->iSe
8b50: 67 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  gid );.         
8b60: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e   assert_nc( p1->
8b70: 70 67 6e 6f 46 69 72 73 74 3d 3d 70 32 2d 3e 70  pgnoFirst==p2->p
8b80: 67 6e 6f 46 69 72 73 74 20 29 3b 0a 20 20 20 20  gnoFirst );.    
8b90: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
8ba0: 20 70 31 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 70   p1->pgnoLast==p
8bb0: 32 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20  2->pgnoLast );. 
8bc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8bd0: 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
8be0: 74 75 72 65 52 65 6c 65 61 73 65 28 70 54 65 73  tureRelease(pTes
8bf0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
8c00: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e 72  ndif..  if( p->r
8c10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8c20: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
8c30: 74 28 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72  t( p->iStructVer
8c40: 73 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 61 73 73  sion!=0 );.  ass
8c50: 65 72 74 28 20 70 2d 3e 70 53 74 72 75 63 74 21  ert( p->pStruct!
8c60: 3d 30 20 29 3b 0a 20 20 66 74 73 35 53 74 72 75  =0 );.  fts5Stru
8c70: 63 74 75 72 65 52 65 66 28 70 2d 3e 70 53 74 72  ctureRef(p->pStr
8c80: 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  uct);.  return p
8c90: 2d 3e 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74  ->pStruct;.}..st
8ca0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
8cb0: 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
8cc0: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
8cd0: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 72 75 63  .  if( p->pStruc
8ce0: 74 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72  t ){.    fts5Str
8cf0: 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 2d  uctureRelease(p-
8d00: 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 70  >pStruct);.    p
8d10: 2d 3e 70 53 74 72 75 63 74 20 3d 20 30 3b 0a 20  ->pStruct = 0;. 
8d20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
8d30: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
8d40: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
8d50: 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  in index structu
8d60: 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 69 73  re pStruct. This
8d70: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
8d80: 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 61  only ever used a
8d90: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
8da0: 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a  () conditions..*
8db0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8dc0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
8dd0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f   fts5StructureCo
8de0: 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73 35  untSegments(Fts5
8df0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8e00: 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d  ct){.  int nSegm
8e10: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
8e20: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
8e30: 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
8e40: 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72  ts */.  if( pStr
8e50: 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uct ){.    int i
8e60: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
8e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
8e80: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
8e90: 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
8ea0: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
8eb0: 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
8ec0: 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
8ed0: 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70     nSegment += p
8ee0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8ef0: 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 7d  Lvl].nSeg;.    }
8f00: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
8f10: 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69  Segment;.}.#endi
8f20: 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42  f..#define fts5B
8f30: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
8f40: 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62 2c  lob(pBuf, pBlob,
8f50: 20 6e 42 6c 6f 62 29 20 7b 20 20 20 20 20 5c 0a   nBlob) {     \.
8f60: 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29    assert( (pBuf)
8f70: 2d 3e 6e 53 70 61 63 65 3e 3d 28 28 70 42 75 66  ->nSpace>=((pBuf
8f80: 29 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20  )->n+nBlob) );  
8f90: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d             \.  m
8fa0: 65 6d 63 70 79 28 26 28 70 42 75 66 29 2d 3e 70  emcpy(&(pBuf)->p
8fb0: 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c  [(pBuf)->n], pBl
8fc0: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20 20  ob, nBlob);     
8fd0: 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75          \.  (pBu
8fe0: 66 29 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20  f)->n += nBlob; 
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e       \.}..#defin
9020: 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65  e fts5BufferSafe
9030: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
9040: 66 2c 20 69 56 61 6c 29 20 7b 20 20 20 20 20 20  f, iVal) {      
9050: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70            \.  (p
9060: 42 75 66 29 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  Buf)->n += sqlit
9070: 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
9080: 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66  &(pBuf)->p[(pBuf
9090: 29 2d 3e 6e 5d 2c 20 28 69 56 61 6c 29 29 3b 20  )->n], (iVal)); 
90a0: 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70 42   \.  assert( (pB
90b0: 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42  uf)->nSpace>=(pB
90c0: 75 66 29 2d 3e 6e 20 29 3b 20 20 20 20 20 20 20  uf)->n );       
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90e0: 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53     \.}.../*.** S
90f0: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f  erialize and sto
9100: 72 65 20 74 68 65 20 22 73 74 72 75 63 74 75 72  re the "structur
9110: 65 22 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  e" record..**.**
9120: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
9130: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
9140: 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20  ror code in the 
9150: 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74  Fts5Index object
9160: 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  . If an.** error
9170: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
9180: 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
9190: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
91a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
91b0: 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
91c0: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
91d0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
91e0: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20  pStruct){.  if( 
91f0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9200: 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66   ){.    Fts5Buff
9210: 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  er buf;         
9220: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
9230: 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63  to serialize rec
9240: 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20  ord into */.    
9250: 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9270: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
9280: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
9290: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b  */.    int iCook
92a0: 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ie;             
92b0: 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76       /* Cookie v
92c0: 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f  alue to store */
92d0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ..    assert( pS
92e0: 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d  truct->nSegment=
92f0: 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f  =fts5StructureCo
9300: 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72  untSegments(pStr
9310: 75 63 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d 73  uct) );.    mems
9320: 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
9330: 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
9340: 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
9350: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  the current conf
9360: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
9370: 20 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20   */.    iCookie 
9380: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43  = p->pConfig->iC
9390: 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 69  ookie;.    if( i
93a0: 43 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b  Cookie<0 ) iCook
93b0: 69 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ie = 0;..    if(
93c0: 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 42   0==sqlite3Fts5B
93d0: 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
93e0: 2c 20 26 62 75 66 2c 20 34 2b 39 2b 39 2b 39 29  , &buf, 4+9+9+9)
93f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9400: 33 46 74 73 35 50 75 74 33 32 28 62 75 66 2e 70  3Fts5Put32(buf.p
9410: 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  , iCookie);.    
9420: 20 20 62 75 66 2e 6e 20 3d 20 34 3b 0a 20 20 20    buf.n = 4;.   
9430: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
9440: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62  eAppendVarint(&b
9450: 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  uf, pStruct->nLe
9460: 76 65 6c 29 3b 0a 20 20 20 20 20 20 66 74 73 35  vel);.      fts5
9470: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
9480: 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74  Varint(&buf, pSt
9490: 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b  ruct->nSegment);
94a0: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
94b0: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
94c0: 74 28 26 62 75 66 2c 20 28 69 36 34 29 70 53 74  t(&buf, (i64)pSt
94d0: 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
94e0: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ter);.    }..   
94f0: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
9500: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
9510: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
9520: 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
9550: 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
9560: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  nts */.      Fts
9570: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9580: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
9590: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
95a0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
95b0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
95c0: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
95d0: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
95e0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
95f0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9600: 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29  buf, pLvl->nSeg)
9610: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9620: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
9630: 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20  vl->nSeg );..   
9640: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
9650: 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
9660: 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
9670: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
9680: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
9690: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
96a0: 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a  [iSeg].iSegid);.
96b0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
96c0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
96d0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
96e0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
96f0: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
9700: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
9710: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
9720: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
9730: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74  g[iSeg].pgnoLast
9740: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9750: 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61 57 72  ..    fts5DataWr
9760: 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52 55  ite(p, FTS5_STRU
9770: 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75 66  CTURE_ROWID, buf
9780: 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20  .p, buf.n);.    
9790: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
97a0: 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  buf);.  }.}..#if
97b0: 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66   0.static void f
97c0: 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
97d0: 65 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66 65  e(int*,Fts5Buffe
97e0: 72 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72 65  r*,Fts5Structure
97f0: 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
9800: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
9810: 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
9820: 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72  Caption, Fts5Str
9830: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
9840: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
9850: 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75  ITE_OK;.  Fts5Bu
9860: 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73  ffer buf;.  mems
9870: 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
9880: 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35  of(buf));.  fts5
9890: 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 26  DebugStructure(&
98a0: 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63  rc, &buf, pStruc
98b0: 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  t);.  fprintf(st
98c0: 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22  dout, "%s: %s\n"
98d0: 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e  , zCaption, buf.
98e0: 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64  p);.  fflush(std
98f0: 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66  out);.  fts5Buff
9900: 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
9910: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
9920: 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72  ts5PrintStructur
9930: 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73  e(x,y).#endif..s
9940: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 65  tatic int fts5Se
9950: 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53 74  gmentSize(Fts5St
9960: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
9970: 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  pSeg){.  return 
9980: 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  1 + pSeg->pgnoLa
9990: 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  st - pSeg->pgnoF
99a0: 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irst;.}../*.** R
99b0: 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20  eturn a copy of 
99c0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
99d0: 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74 2c  pStruct. Except,
99e0: 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79   promote as many
99f0: 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 73   .** segments as
9a00: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76   possible to lev
9a10: 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20  el iPromote. If 
9a20: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e  an OOM occurs, N
9a30: 55 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ULL is .** retur
9a40: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ned..*/.static v
9a50: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
9a60: 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74  ePromoteTo(.  Ft
9a70: 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e  s5Index *p,.  in
9a80: 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e  t iPromote,.  in
9a90: 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46  t szPromote,.  F
9aa0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
9ab0: 74 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69  truct.){.  int i
9ac0: 6c 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72  l, is;.  Fts5Str
9ad0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75  uctureLevel *pOu
9ae0: 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
9af0: 65 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a  evel[iPromote];.
9b00: 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65  .  if( pOut->nMe
9b10: 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  rge==0 ){.    fo
9b20: 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b  r(il=iPromote+1;
9b30: 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65   il<pStruct->nLe
9b40: 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20  vel; il++){.    
9b50: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9b60: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
9b70: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c  truct->aLevel[il
9b80: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  ];.      if( pLv
9b90: 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74 75  l->nMerge ) retu
9ba0: 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 73  rn;.      for(is
9bb0: 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pLvl->nSeg-1; i
9bc0: 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20  s>=0; is--){.   
9bd0: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66 74       int sz = ft
9be0: 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26 70  s5SegmentSize(&p
9bf0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a  Lvl->aSeg[is]);.
9c00: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
9c10: 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72  zPromote ) retur
9c20: 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  n;.        fts5S
9c30: 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
9c40: 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
9c50: 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31  uct, iPromote, 1
9c60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
9c70: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
9c80: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
9c90: 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c  (pOut->aSeg, &pL
9ca0: 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69  vl->aSeg[is], si
9cb0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
9cc0: 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20  reSegment));.   
9cd0: 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b       pOut->nSeg+
9ce0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  +;.        pLvl-
9cf0: 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d  >nSeg--;.      }
9d00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9d10: 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e  .** A new segmen
9d20: 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  t has just been 
9d30: 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c  written to level
9d40: 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73   iLvl of index s
9d50: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72  tructure.** pStr
9d60: 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  uct. This functi
9d70: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  on determines if
9d80: 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68   any segments sh
9d90: 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64  ould be promoted
9da0: 0a 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e  .** as a result.
9db0: 20 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72   Segments are pr
9dc0: 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63  omoted in two sc
9dd0: 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
9de0: 20 61 29 20 49 66 20 74 68 65 20 73 65 67 6d 65   a) If the segme
9df0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
9e00: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
9e10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  one or more segm
9e20: 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74  ents.**      wit
9e30: 68 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hin the previous
9e40: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
9e50: 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64  , it is promoted
9e60: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
9e70: 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74  .**      populat
9e80: 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ed level..**.** 
9e90: 20 20 62 29 20 49 66 20 74 68 65 20 73 65 67 6d    b) If the segm
9ea0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9eb0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
9ec0: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
9ed0: 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68  nt on.**      th
9ee0: 65 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64  e next populated
9ef0: 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61   level, then tha
9f00: 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61  t segment, and a
9f10: 6e 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e  ny other adjacen
9f20: 74 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e  t.**      segmen
9f30: 74 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ts that are also
9f40: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
9f50: 65 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74  e one just writt
9f60: 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  en, are .**     
9f70: 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a   promoted. .**.*
9f80: 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * If one or more
9f90: 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72   segments are pr
9fa0: 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75  omoted, the stru
9fb0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20  cture object is 
9fc0: 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65  updated.** to re
9fd0: 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73  flect this..*/.s
9fe0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
9ff0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
a000: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
a030: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
a040: 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20  nt iLvl,        
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a060: 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75  * Index level ju
a070: 73 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  st updated */.  
a080: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
a090: 53 74 72 75 63 74 20 20 20 20 20 20 20 20 20 20  Struct          
a0a0: 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
a0b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  re */.){.  if( p
a0c0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a0d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b  ){.    int iTst;
a0e0: 0a 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74  .    int iPromot
a0f0: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  e = -1;.    int 
a100: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20 20  szPromote = 0;  
a110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
a120: 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68  mote anything th
a130: 69 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c  is size or small
a140: 65 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74  er */.    Fts5St
a150: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
a160: 70 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65  pSeg;   /* Segme
a170: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
a180: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67  */.    int szSeg
a190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1a0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a1b0: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
a1c0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
a1d0: 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
a1e0: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
a1f0: 67 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 65 67  g;..    if( nSeg
a200: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a210: 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
a220: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
a230: 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c  aSeg[pStruct->aL
a240: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d  evel[iLvl].nSeg-
a250: 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d 20  1];.    szSeg = 
a260: 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  (1 + pSeg->pgnoL
a270: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
a280: 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  First);..    /* 
a290: 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74  Check for condit
a2a0: 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20 66  ion (a) */.    f
a2b0: 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20  or(iTst=iLvl-1; 
a2c0: 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72 75  iTst>=0 && pStru
a2d0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d  ct->aLevel[iTst]
a2e0: 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d  .nSeg==0; iTst--
a2f0: 29 3b 0a 20 20 20 20 69 66 28 20 69 54 73 74 3e  );.    if( iTst>
a300: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
a310: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 4d  i;.      int szM
a320: 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74  ax = 0;.      Ft
a330: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
a340: 20 2a 70 54 73 74 20 3d 20 26 70 53 74 72 75 63   *pTst = &pStruc
a350: 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b  t->aLevel[iTst];
a360: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a370: 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29  Tst->nMerge==0 )
a380: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a390: 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69   i<pTst->nSeg; i
a3a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
a3b0: 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65 67   sz = pTst->aSeg
a3c0: 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70  [i].pgnoLast - p
a3d0: 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e  Tst->aSeg[i].pgn
a3e0: 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20 20  oFirst + 1;.    
a3f0: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78      if( sz>szMax
a400: 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20   ) szMax = sz;. 
a410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a420: 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b   szMax>=szSeg ){
a430: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64  .        /* Cond
a440: 69 74 69 6f 6e 20 28 61 29 20 69 73 20 74 72 75  ition (a) is tru
a450: 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e  e. Promote the n
a460: 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e  ewest segment on
a470: 20 6c 65 76 65 6c 20 0a 20 20 20 20 20 20 20 20   level .        
a480: 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c  ** iLvl to level
a490: 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20   iTst.  */.     
a4a0: 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54     iPromote = iT
a4b0: 73 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 72  st;.        szPr
a4c0: 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20  omote = szMax;. 
a4d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a4e0: 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69 6f    /* If conditio
a4f0: 6e 20 28 61 29 20 69 73 20 6e 6f 74 20 6d 65 74  n (a) is not met
a500: 2c 20 61 73 73 75 6d 65 20 28 62 29 20 69 73 20  , assume (b) is 
a510: 74 72 75 65 2e 20 53 74 72 75 63 74 75 72 65 50  true. StructureP
a520: 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20 2a  romoteTo().    *
a530: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  * is a no-op if 
a540: 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20  it is not.  */. 
a550: 20 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c     if( iPromote<
a560: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 72 6f 6d  0 ){.      iProm
a570: 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  ote = iLvl;.    
a580: 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a    szPromote = sz
a590: 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Seg;.    }.    f
a5a0: 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
a5b0: 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74  oteTo(p, iPromot
a5c0: 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53  e, szPromote, pS
a5d0: 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  truct);.  }.}...
a5e0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
a5f0: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
a600: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
a610: 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 65  gument. If the e
a620: 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64 6f  nd of the .** do
a630: 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65  clist-index page
a640: 20 69 73 20 72 65 61 63 68 65 64 2c 20 72 65 74   is reached, ret
a650: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
a660: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
a670: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74 73  DlidxLvlNext(Fts
a680: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29  5DlidxLvl *pLvl)
a690: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  {.  Fts5Data *pD
a6a0: 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74  ata = pLvl->pDat
a6b0: 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e  a;..  if( pLvl->
a6c0: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  iOff==0 ){.    a
a6d0: 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f  ssert( pLvl->bEo
a6e0: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c  f==0 );.    pLvl
a6f0: 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20 20  ->iOff = 1;.    
a700: 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74  pLvl->iOff += ft
a710: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
a720: 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c  Data->p[1], pLvl
a730: 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ->iLeafPgno);.  
a740: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20    pLvl->iOff += 
a750: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
a760: 44 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f  Data->p[pLvl->iO
a770: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c  ff], (u64*)&pLvl
a780: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  ->iRowid);.    p
a790: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d  Lvl->iFirstOff =
a7a0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d   pLvl->iOff;.  }
a7b0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f  else{.    int iO
a7c0: 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66  ff;.    for(iOff
a7d0: 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66  =pLvl->iOff; iOf
a7e0: 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66  f<pData->nn; iOf
a7f0: 66 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  f++){.      if( 
a800: 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20 29  pData->p[iOff] )
a810: 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a   break; .    }..
a820: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44 61      if( iOff<pDa
a830: 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20  ta->nn ){.      
a840: 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  i64 iVal;.      
a850: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  pLvl->iLeafPgno 
a860: 2b 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c 2d  += (iOff - pLvl-
a870: 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20 20  >iOff) + 1;.    
a880: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
a890: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
a8a0: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
a8b0: 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c 76  iVal);.      pLv
a8c0: 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61  l->iRowid += iVa
a8d0: 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  l;.      pLvl->i
a8e0: 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  Off = iOff;.    
a8f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76  }else{.      pLv
a900: 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  l->bEof = 1;.   
a910: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
a920: 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a   pLvl->bEof;.}..
a930: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
a940: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
a950: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
a960: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
a970: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
a980: 74 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e 64  terNextR(Fts5Ind
a990: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
a9a0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
a9b0: 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c   iLvl){.  Fts5Dl
a9c0: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
a9d0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c  pIter->aLvl[iLvl
a9e0: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  ];..  assert( iL
a9f0: 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29  vl<pIter->nLvl )
aa00: 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64  ;.  if( fts5Dlid
aa10: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20 29  xLvlNext(pLvl) )
aa20: 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b  {.    if( (iLvl+
aa30: 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c  1) < pIter->nLvl
aa40: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
aa50: 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20  idxIterNextR(p, 
aa60: 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a  pIter, iLvl+1);.
aa70: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31        if( pLvl[1
aa80: 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  ].bEof==0 ){.   
aa90: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
aaa0: 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
aab0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
aac0: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
aad0: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
aae0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
aaf0: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
ab00: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
ab10: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
ab20: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
ab30: 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b  gid, iLvl, pLvl[
ab40: 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  1].iLeafPgno).  
ab50: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
ab60: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
ab70: 20 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e   ) fts5DlidxLvlN
ab80: 65 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20 20  ext(pLvl);.     
ab90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
aba0: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
abb0: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74  vl[0].bEof;.}.st
abc0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
abd0: 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  dxIterNext(Fts5I
abe0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
abf0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
ac00: 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69    return fts5Dli
ac10: 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70  dxIterNextR(p, p
ac20: 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Iter, 0);.}../*.
ac30: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
ac40: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
ac50: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61 73  rst argument has
ac60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
ac70: 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73 20  ields set.** as 
ac80: 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66 75  follows. This fu
ac90: 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20 74  nction sets up t
aca0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69  he rest of the i
acb0: 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
acc0: 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  it.** points to 
acd0: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
ace0: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  in the doclist-i
acf0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44  ndex..**.**   pD
ad00: 61 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69 6e  ata:.**     poin
ad10: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69  ter to doclist-i
ad20: 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a  ndex record, .**
ad30: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
ad40: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
ad50: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
ad60: 6f 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  o is the page nu
ad70: 6d 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c  mber the.** docl
ad80: 69 73 74 20 69 73 20 61 73 73 6f 63 69 61 74 65  ist is associate
ad90: 64 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65 20  d with (the one 
ada0: 66 65 61 74 75 72 69 6e 67 20 74 68 65 20 74 65  featuring the te
adb0: 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rm)..*/.static i
adc0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
add0: 46 69 72 73 74 28 46 74 73 35 44 6c 69 64 78 49  First(Fts5DlidxI
ade0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
adf0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
ae00: 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
ae10: 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44 6c  i++){.    fts5Dl
ae20: 69 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74 65  idxLvlNext(&pIte
ae30: 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d  r->aLvl[i]);.  }
ae40: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
ae50: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
ae60: 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  ...static int ft
ae70: 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46  s5DlidxIterEof(F
ae80: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
ae90: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
aea0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  r){.  return p->
aeb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
aec0: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
aed0: 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bEof;.}..static 
aee0: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
aef0: 65 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65 78  erLast(Fts5Index
af00: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
af10: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
af20: 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  t i;..  /* Advan
af30: 63 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74 6f  ce each level to
af40: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
af50: 6f 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  on the last page
af60: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74 65   */.  for(i=pIte
af70: 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63  r->nLvl-1; p->rc
af80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
af90: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46  >=0; i--){.    F
afa0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
afb0: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
afc0: 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [i];.    while( 
afd0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
afe0: 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  (pLvl)==0 );.   
aff0: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b   pLvl->bEof = 0;
b000: 0a 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b  ..    if( i>0 ){
b010: 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
b020: 4c 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26 70  Lvl *pChild = &p
b030: 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20 66  Lvl[-1];.      f
b040: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
b050: 43 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a 20  Child->pData);. 
b060: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68 69       memset(pChi
b070: 6c 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  ld, 0, sizeof(Ft
b080: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
b090: 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61 74      pChild->pDat
b0a0: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
b0b0: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
b0c0: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
b0d0: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  pIter->iSegid, i
b0e0: 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50  -1, pLvl->iLeafP
b0f0: 67 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  gno).      );.  
b100: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b110: 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74   Move the iterat
b120: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
b130: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74   only argument t
b140: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
b150: 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ntry..*/.static 
b160: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  int fts5DlidxLvl
b170: 50 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c 76  Prev(Fts5DlidxLv
b180: 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20  l *pLvl){.  int 
b190: 69 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66  iOff = pLvl->iOf
b1a0: 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  f;..  assert( pL
b1b0: 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  vl->bEof==0 );. 
b1c0: 20 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d   if( iOff<=pLvl-
b1d0: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
b1e0: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31    pLvl->bEof = 1
b1f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
b200: 38 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61  8 *a = pLvl->pDa
b210: 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20 69  ta->p;.    i64 i
b220: 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  Val;.    int iLi
b230: 6d 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  mit;.    int ii;
b240: 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d  .    int nZero =
b250: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72   0;..    /* Curr
b260: 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74  ently iOff point
b270: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
b280: 79 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74 2e  yte of a varint.
b290: 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20   This block .   
b2a0: 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20 69   ** decrements i
b2b0: 4f 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f 69  Off until it poi
b2c0: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
b2d0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 72 65   byte of the pre
b2e0: 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76 61  vious .    ** va
b2f0: 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61 72  rint. Taking car
b300: 65 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61 6e  e not to read an
b310: 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  y memory locatio
b320: 6e 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20 20  ns that occur.  
b330: 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
b340: 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79  buffer in memory
b350: 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74  .  */.    iLimit
b360: 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66   = (iOff>9 ? iOf
b370: 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f  f-9 : 0);.    fo
b380: 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69  r(iOff--; iOff>i
b390: 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a  Limit; iOff--){.
b3a0: 20 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f 66        if( (a[iOf
b3b0: 66 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30 20  f-1] & 0x80)==0 
b3c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ) break;.    }..
b3d0: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
b3e0: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
b3f0: 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 4c  *)&iVal);.    pL
b400: 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56  vl->iRowid -= iV
b410: 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c  al;.    pLvl->iL
b420: 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20  eafPgno--;..    
b430: 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72 64  /* Skip backward
b440: 73 20 70 61 73 74 20 61 6e 79 20 30 78 30 30 20  s past any 0x00 
b450: 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20  varints. */.    
b460: 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20 69  for(ii=iOff-1; i
b470: 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  i>=pLvl->iFirstO
b480: 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78 30  ff && a[ii]==0x0
b490: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
b4a0: 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nZero++;.    }. 
b4b0: 20 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c 2d     if( ii>=pLvl-
b4c0: 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 28 61  >iFirstOff && (a
b4d0: 5b 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b 0a  [ii] & 0x80) ){.
b4e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
b4f0: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65  e immediately be
b500: 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30 78  fore the last 0x
b510: 30 30 20 62 79 74 65 20 68 61 73 20 74 68 65 20  00 byte has the 
b520: 30 78 38 30 20 62 69 74 0a 20 20 20 20 20 20 2a  0x80 bit.      *
b530: 2a 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c 61  * set. So the la
b540: 73 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79 20  st 0x00 is only 
b550: 61 20 76 61 72 69 6e 74 20 30 20 69 66 20 74 68  a varint 0 if th
b560: 65 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20 30  ere are 8 more 0
b570: 78 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  x80.      ** byt
b580: 65 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d 2e  es before a[ii].
b590: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 5a   */.      int bZ
b5a0: 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ero = 0;        
b5b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
b5c0: 20 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e 74   last 0x00 count
b5d0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  s */.      if( (
b5e0: 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69  ii-8)>=pLvl->iFi
b5f0: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  rstOff ){.      
b600: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
b610: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26   for(j=1; j<=8 &
b620: 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78 38  & (a[ii-j] & 0x8
b630: 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  0); j++);.      
b640: 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29 3b    bZero = (j>8);
b650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b660: 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a  f( bZero==0 ) nZ
b670: 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ero--;.    }.   
b680: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
b690: 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70   -= nZero;.    p
b6a0: 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  Lvl->iOff = iOff
b6b0: 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20   - nZero;.  }.. 
b6c0: 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45   return pLvl->bE
b6d0: 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  of;.}..static in
b6e0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  t fts5DlidxIterP
b6f0: 72 65 76 52 28 46 74 73 35 49 6e 64 65 78 20 2a  revR(Fts5Index *
b700: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
b710: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76   *pIter, int iLv
b720: 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c  l){.  Fts5DlidxL
b730: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
b740: 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a  r->aLvl[iLvl];..
b750: 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
b760: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20  Iter->nLvl );.  
b770: 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  if( fts5DlidxLvl
b780: 50 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20 20  Prev(pLvl) ){.  
b790: 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c    if( (iLvl+1) <
b7a0: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a   pIter->nLvl ){.
b7b0: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
b7c0: 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65  terPrevR(p, pIte
b7d0: 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20  r, iLvl+1);.    
b7e0: 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45    if( pLvl[1].bE
b7f0: 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
b800: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
b810: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
b820: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c         memset(pL
b830: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
b840: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
b850: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
b860: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
b870: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
b880: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
b890: 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c  D(pIter->iSegid,
b8a0: 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69   iLvl, pLvl[1].i
b8b0: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
b8c0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
b8d0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a   pLvl->pData ){.
b8e0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
b8f0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
b900: 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20  t(pLvl)==0 );.  
b910: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45          pLvl->bE
b920: 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  of = 0;.        
b930: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
b940: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
b950: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
b960: 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  f;.}.static int 
b970: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
b980: 76 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  v(Fts5Index *p, 
b990: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b9a0: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
b9b0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
b9c0: 76 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  vR(p, pIter, 0);
b9d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
b9e0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
b9f0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61  terator object a
ba00: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35  llocated by fts5
ba10: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e  DlidxIterInit().
ba20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ba30: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
ba40: 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  e(Fts5DlidxIter 
ba50: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
ba60: 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  Iter ){.    int 
ba70: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
ba80: 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
ba90: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  ++){.      fts5D
baa0: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
bab0: 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 29  ->aLvl[i].pData)
bac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
bad0: 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
bae0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
baf0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66 74  ts5DlidxIter *ft
bb00: 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
bb10: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65     /* Fts5 Backe
bb40: 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
bb50: 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52  thin */.  int bR
bb60: 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
bb70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
bb80: 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41  e for ORDER BY A
bb90: 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  SC */.  int iSeg
bba0: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
bbb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
bbc0: 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  nt id */.  int i
bbd0: 4c 65 61 66 50 67 20 20 20 20 20 20 20 20 20 20  LeafPg          
bbe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
bbf0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  af page number t
bc00: 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f 72  o load dlidx for
bc10: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69   */.){.  Fts5Dli
bc20: 64 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  dxIter *pIter = 
bc30: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
bc40: 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20  t bDone = 0;..  
bc50: 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
bc60: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f  SQLITE_OK && bDo
bc70: 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ne==0; i++){.   
bc80: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
bc90: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65  eof(Fts5DlidxIte
bca0: 72 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28  r) + i * sizeof(
bcb0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20  Fts5DlidxLvl);. 
bcc0: 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72     Fts5DlidxIter
bcd0: 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65   *pNew;..    pNe
bce0: 77 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74  w = (Fts5DlidxIt
bcf0: 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  er*)sqlite3_real
bd00: 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74 65  loc(pIter, nByte
bd10: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
bd20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
bd30: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
bd40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bd50: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
bd60: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
bd70: 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65 61  (iSegid, i, iLea
bd80: 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73 35  fPg);.      Fts5
bd90: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d  DlidxLvl *pLvl =
bda0: 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b   &pNew->aLvl[i];
bdb0: 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20 70  .      pIter = p
bdc0: 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  New;.      memse
bdd0: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
bde0: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
bdf0: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
be00: 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
be10: 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ad(p, iRowid);. 
be20: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
be30: 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e 70  Data && (pLvl->p
be40: 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78 30  Data->p[0] & 0x0
be50: 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  001)==0 ){.     
be60: 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20     bDone = 1;.  
be70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
be80: 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20  r->nLvl = i+1;. 
be90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
bea0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
beb0: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
bec0: 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
bed0: 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20      if( bRev==0 
bee0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
bef0: 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74 65  dxIterFirst(pIte
bf00: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
bf10: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
bf20: 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72 29  erLast(p, pIter)
bf30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
bf40: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
bf50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 44  _OK ){.    fts5D
bf60: 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74  lidxIterFree(pIt
bf70: 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d  er);.    pIter =
bf80: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
bf90: 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61 74  n pIter;.}..stat
bfa0: 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78  ic i64 fts5Dlidx
bfb0: 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44 6c  IterRowid(Fts5Dl
bfc0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
bfd0: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
bfe0: 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b  >aLvl[0].iRowid;
bff0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  .}.static int ft
c000: 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
c010: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
c020: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
c030: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69  pIter->aLvl[0].i
c040: 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  LeafPgno;.}../*.
c050: 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74  ** Load the next
c060: 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20   leaf page into 
c070: 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72  the segment iter
c080: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
c090: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
c0a0: 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73 35  NextPage(.  Fts5
c0b0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
c0d0: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
c0e0: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
c0f0: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
c100: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
c110: 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74  tor to advance t
c120: 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29  o next page */.)
c130: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
c140: 65 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75 63  eaf;.  Fts5Struc
c150: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
c160: 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b  g = pIter->pSeg;
c170: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
c180: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
c190: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
c1a0: 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49  Pgno++;.  if( pI
c1b0: 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29  ter->pNextLeaf )
c1c0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
c1d0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78  af = pIter->pNex
c1e0: 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  tLeaf;.    pIter
c1f0: 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b  ->pNextLeaf = 0;
c200: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74  .  }else if( pIt
c210: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70  er->iLeafPgno<=p
c220: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
c230: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
c240: 66 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64  f = fts5LeafRead
c250: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53  (p, .        FTS
c260: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
c270: 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 49  pSeg->iSegid, pI
c280: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a  ter->iLeafPgno).
c290: 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
c2a0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
c2b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 61   = 0;.  }.  pLea
c2c0: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
c2d0: 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20 29  ;..  if( pLeaf )
c2e0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67  {.    pIter->iPg
c2f0: 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e  idxOff = pLeaf->
c300: 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28 20  szLeaf;.    if( 
c310: 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
c320: 73 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20  ss(pLeaf) ){.   
c330: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
c340: 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d  Doclist = pLeaf-
c350: 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  >nn+1;.    }else
c360: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
c370: 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
c380: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
c390: 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50 67  af->p[pIter->iPg
c3a0: 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20 20  idxOff],.       
c3b0: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
c3c0: 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29 3b  Doclist.      );
c3d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
c3e0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70  .** Argument p p
c3f0: 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
c400: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76  r containing a v
c410: 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74 65  arint to be inte
c420: 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a 20  rpreted as a.** 
c430: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69  position list si
c440: 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74  ze field. Read t
c450: 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72 65  he varint and re
c460: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
c470: 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64  of bytes.** read
c480: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
c490: 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f  ng, set *pnSz to
c4a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c4b0: 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73 69  ytes in the posi
c4c0: 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e  tion.** list, an
c4d0: 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75 65  d *pbDel to true
c4e0: 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66   if the delete f
c4f0: 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20 66  lag is set, or f
c500: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
c510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
c520: 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
c530: 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e  (const u8 *p, in
c540: 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62  t *pnSz, int *pb
c550: 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b  Del){.  int nSz;
c560: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
c570: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
c580: 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a  t32(p, n, nSz);.
c590: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a    assert_nc( nSz
c5a0: 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d  >=0 );.  *pnSz =
c5b0: 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c   nSz/2;.  *pbDel
c5c0: 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31 3b   = nSz & 0x0001;
c5d0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
c5e0: 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  /*.** Fts5SegIte
c5f0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75  r.iLeafOffset cu
c600: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
c610: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
c620: 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f   of a.** positio
c630: 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
c640: 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c 75  d. Read the valu
c650: 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 61  e of the field a
c660: 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69  nd store it.** i
c670: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
c680: 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a  variables:.**.**
c690: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 6e     Fts5SegIter.n
c6a0: 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65 67  Pos.**   Fts5Seg
c6b0: 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20  Iter.bDel.**.** 
c6c0: 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74 65  Leave Fts5SegIte
c6d0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
c6e0: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
c6f0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c700: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  .** position lis
c710: 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e  t content (if an
c720: 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  y)..*/.static vo
c730: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
c740: 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65 78  adNPos(Fts5Index
c750: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
c760: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
c770: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
c780: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
c790: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
c7a0: 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65  ffset;  /* Offse
c7b0: 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a  t to read at */.
c7c0: 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41      ASSERT_SZLEA
c7d0: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
c7e0: 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  f);.    if( p->p
c7f0: 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
c800: 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
c810: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  E ){.      int i
c820: 45 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72 2d  Eod = MIN(pIter-
c830: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c 20  >iEndofDoclist, 
c840: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
c850: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74  Leaf);.      pIt
c860: 65 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20 20  er->bDel = 0;.  
c870: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
c880: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
c890: 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65  Off<iEod && pIte
c8a0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  r->pLeaf->p[iOff
c8b0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
c8c0: 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31 3b  pIter->bDel = 1;
c8d0: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b  .        iOff++;
c8e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
c8f0: 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d  f<iEod && pIter-
c900: 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d  >pLeaf->p[iOff]=
c910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
c920: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b  pIter->nPos = 1;
c930: 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b  .          iOff+
c940: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
c950: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
c960: 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20 20  r->nPos = 0;.   
c970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c980: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c990: 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 66  int nSz;.      f
c9a0: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
c9b0: 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  32(pIter->pLeaf-
c9c0: 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a  >p, iOff, nSz);.
c9d0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65        pIter->bDe
c9e0: 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30  l = (nSz & 0x000
c9f0: 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  1);.      pIter-
ca00: 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a  >nPos = nSz>>1;.
ca10: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
ca20: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20   pIter->nPos>=0 
ca30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  );.    }.    pIt
ca40: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
ca50: 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73  = iOff;.  }.}..s
ca60: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
ca70: 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28  egIterLoadRowid(
ca80: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ca90: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
caa0: 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  ){.  u8 *a = pIt
cab0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20  er->pLeaf->p;   
cac0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
cad0: 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d  o read data from
cae0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d   */.  int iOff =
caf0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
cb00: 73 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53  set;..  ASSERT_S
cb10: 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e  ZLEAF_OK(pIter->
cb20: 70 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69 4f  pLeaf);.  if( iO
cb30: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
cb40: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
cb50: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
cb60: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
cb70: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
cb80: 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
cb90: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
cba0: 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46  E_OK ) p->rc = F
cbb0: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
cbc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
cbd0: 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20  .    iOff = 4;. 
cbe0: 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c     a = pIter->pL
cbf0: 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f  eaf->p;.  }.  iO
cc00: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
cc10: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
cc20: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
cc30: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70 49  r->iRowid);.  pI
cc40: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
cc50: 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   = iOff;.}../*.*
cc60: 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  * Fts5SegIter.iL
cc70: 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e  eafOffset curren
cc80: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
cc90: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
cca0: 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78  the .** "nSuffix
ccb0: 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65 72  " field of a ter
ccc0: 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72 61  m. Function para
ccd0: 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74  meter nKeep cont
cce0: 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a 2a  ains the value.*
ccf0: 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66 69  * of the "nPrefi
cd00: 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68 65  x" field (if the
cd10: 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74 20  re was one - it 
cd20: 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20 74  is passed 0 if t
cd30: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
cd40: 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20  rst term in the 
cd50: 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20  segment)..**.** 
cd60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f  This function po
cd70: 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  pulates:.**.**  
cd80: 20 46 74 73 35 53 65 67 49 74 65 72 2e 74 65 72   Fts5SegIter.ter
cd90: 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  m.**   Fts5SegIt
cda0: 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61  er.rowid.**.** a
cdb0: 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c  ccordingly and l
cdc0: 65 61 76 65 73 20 28 46 74 73 35 53 65 67 49 74  eaves (Fts5SegIt
cdd0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29 20  er.iLeafOffset) 
cde0: 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65  set to the conte
cdf0: 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72  nt of.** the fir
ce00: 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  st position list
ce10: 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  . The position l
ce20: 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ist belonging to
ce30: 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28 46   document .** (F
ce40: 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77 69  ts5SegIter.iRowi
ce50: 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  d)..*/.static vo
ce60: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
ce70: 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  adTerm(Fts5Index
ce80: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
ce90: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65   *pIter, int nKe
cea0: 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70  ep){.  u8 *a = p
ceb0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20  Iter->pLeaf->p; 
cec0: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
ced0: 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72   to read data fr
cee0: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  om */.  int iOff
cef0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
cf00: 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65  ffset;  /* Offse
cf10: 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a  t to read at */.
cf20: 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20    int nNew;     
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e 65    /* Bytes of ne
cf50: 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66  w data */..  iOf
cf60: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
cf70: 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
cf80: 4e 65 77 29 3b 0a 20 20 69 66 28 20 69 4f 66 66  New);.  if( iOff
cf90: 2b 6e 4e 65 77 3e 70 49 74 65 72 2d 3e 70 4c 65  +nNew>pIter->pLe
cfa0: 61 66 2d 3e 6e 6e 20 7c 7c 20 6e 4b 65 65 70 3e  af->nn || nKeep>
cfb0: 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 29 7b  pIter->term.n ){
cfc0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
cfd0: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
cfe0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74  eturn;.  }.  pIt
cff0: 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65  er->term.n = nKe
d000: 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  ep;.  fts5Buffer
d010: 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
d020: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
d030: 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
d040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
d050: 72 2d 3e 74 65 72 6d 2e 6e 3c 3d 70 49 74 65 72  r->term.n<=pIter
d060: 2d 3e 74 65 72 6d 2e 6e 53 70 61 63 65 20 29 3b  ->term.nSpace );
d070: 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  .  iOff += nNew;
d080: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
d090: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
d0a0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
d0b0: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
d0c0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70  ->iLeafPgno;.  p
d0d0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d0e0: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28  t = iOff;..  if(
d0f0: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
d100: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
d110: 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >nn ){.    pIter
d120: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
d130: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d140: 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
d150: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
d160: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
d170: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
d180: 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d  rint32(&a[pIter-
d190: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78  >iPgidxOff], nEx
d1a0: 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  tra);.    pIter-
d1b0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b  >iEndofDoclist +
d1c0: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20  = nExtra;.  }.. 
d1d0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
d1e0: 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
d1f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
d200: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
d210: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
d220: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
d230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d240: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76  5SegIterNext_Rev
d250: 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 2a 2c  erse(Fts5Index*,
d260: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
d270: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  nt*);.static voi
d280: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
d290: 74 5f 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65 78  t_None(Fts5Index
d2a0: 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c  *, Fts5SegIter*,
d2b0: 20 69 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20   int*);..static 
d2c0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d2d0: 53 65 74 4e 65 78 74 28 46 74 73 35 49 6e 64 65  SetNext(Fts5Inde
d2e0: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
d2f0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
d300: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
d310: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
d320: 45 52 53 45 20 29 7b 0a 20 20 20 20 70 49 74 65  ERSE ){.    pIte
d330: 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53  r->xNext = fts5S
d340: 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72  egIterNext_Rever
d350: 73 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  se;.  }else if( 
d360: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
d370: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
d380: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49 74  _NONE ){.    pIt
d390: 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  er->xNext = fts5
d3a0: 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65  SegIterNext_None
d3b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d3c0: 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74  Iter->xNext = ft
d3d0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 3b 0a 20  s5SegIterNext;. 
d3e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
d3f0: 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61  ialize the itera
d400: 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72  tor object pIter
d410: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
d420: 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20  ugh the entries 
d430: 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53  in.** segment pS
d440: 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72  eg. The iterator
d450: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
d460: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
d470: 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68  ntry when .** th
d480: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
d490: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  rns..**.** If an
d4a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
d4b0: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
d4c0: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
d4d0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
d4e0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
d4f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
d500: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
d510: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d520: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
d530: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
d540: 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69  d fts5SegIterIni
d550: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
d560: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
d570: 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
d580: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
d590: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
d5a0: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
d5b0: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
d5c0: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
d5d0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d5f0: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
d600: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  te */.){.  if( p
d610: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
d620: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
d630: 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
d640: 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67  segment is being
d650: 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75   used as an inpu
d660: 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t to an incremen
d670: 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65  tal.    ** merge
d680: 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61   and all data ha
d690: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22  s already been "
d6a0: 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75  trimmed". See fu
d6b0: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74  nction.    ** ft
d6c0: 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29  s5TrimSegments()
d6d0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e   for details. In
d6e0: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
d6f0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d   the iterator em
d700: 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  pty..    ** The 
d710: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20  caller will see 
d720: 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61  the (pIter->pLea
d730: 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65  f==0) and assume
d740: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
d750: 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61  .    ** at EOF a
d760: 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61  lready. */.    a
d770: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
d780: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  eaf==0 );.    re
d790: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
d7a0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d7b0: 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  K ){.    memset(
d7c0: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
d7d0: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66  (*pIter));.    f
d7e0: 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78  ts5SegIterSetNex
d7f0: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
d800: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
d810: 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Seg;.    pIter->
d820: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67  iLeafPgno = pSeg
d830: 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20  ->pgnoFirst-1;. 
d840: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
d850: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
d860: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
d870: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d880: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
d890: 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20  fOffset = 4;.   
d8a0: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65   assert_nc( pIte
d8b0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29  r->pLeaf->nn>4 )
d8c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  ;.    assert_nc(
d8d0: 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
d8e0: 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65  rmOff(pIter->pLe
d8f0: 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49  af)==4 );.    pI
d900: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
d910: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
d920: 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66 74 73  zLeaf+1;.    fts
d930: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
d940: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
d950: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
d960: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
d970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
d980: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d990: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
d9a0: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
d9b0: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74  eated by calls t
d9c0: 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75  o.** Fts5IndexQu
d9d0: 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20 46  ery() with the F
d9e0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
d9f0: 45 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ESC flag set..**
da00: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
da10: 20 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61   is in an unusua
da20: 6c 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  l state when thi
da30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
da40: 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73  lled: the.** Fts
da50: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
da60: 66 73 65 74 20 76 61 72 69 61 62 6c 65 20 69 73  fset variable is
da70: 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
da80: 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  et of the start 
da90: 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69  of.** the positi
daa0: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
dab0: 6c 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ld for the first
dac0: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
dad0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  on the page..** 
dae0: 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69  Fts5SegIter.rowi
daf0: 64 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50  d is set, but nP
db00: 6f 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20  os and bDel are 
db10: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  not..**.** This 
db20: 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65  function advance
db30: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  s the iterator s
db40: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
db50: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a   to the last .**
db60: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
db70: 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c  on the page and,
db80: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69   if necessary, i
db90: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a  nitializes the .
dba0: 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  ** aRowidOffset[
dbb0: 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73  ] and iRowidOffs
dbc0: 65 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74  et variables. At
dbd0: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
dbe0: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  iterator.** is i
dbf0: 6e 20 69 74 73 20 72 65 67 75 6c 61 72 20 73 74  n its regular st
dc00: 61 74 65 20 2d 20 46 74 73 35 53 65 67 49 74 65  ate - Fts5SegIte
dc10: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
dc20: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
dc30: 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65  t.** byte of the
dc40: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
dc50: 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65  ontent associate
dc60: 64 20 77 69 74 68 20 73 61 69 64 20 72 6f 77 69  d with said rowi
dc70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
dc80: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
dc90: 65 72 73 65 49 6e 69 74 50 61 67 65 28 46 74 73  erseInitPage(Fts
dca0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
dcb0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
dcc0: 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
dcd0: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
dce0: 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ail;.  int n = p
dcf0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
dd00: 65 61 66 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  eaf;.  int i = p
dd10: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
dd20: 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  t;.  u8 *a = pIt
dd30: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
dd40: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74  int iRowidOffset
dd50: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 70   = 0;..  if( n>p
dd60: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dd70: 69 73 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  ist ){.    n = p
dd80: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dd90: 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41 53 53 45  ist;.  }..  ASSE
dda0: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
ddb0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77 68  er->pLeaf);.  wh
ddc0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
ddd0: 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 0a 20  4 iDelta = 0;.. 
dde0: 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
ddf0: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
de00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64   ){.      /* tod
de10: 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  o */.      if( i
de20: 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 7b  <n && a[i]==0 ){
de30: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
de40: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26        if( i<n &&
de50: 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b 2b 3b 0a   a[i]==0 ) i++;.
de60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
de70: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  e{.      int nPo
de80: 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 75  s;.      int bDu
de90: 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  mmy;.      i += 
dea0: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
deb0: 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c  ze(&a[i], &nPos,
dec0: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
ded0: 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20   i += nPos;.    
dee0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29  }.    if( i>=n )
def0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d   break;.    i +=
df00: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
df10: 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  a[i], (u64*)&iDe
df20: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
df30: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
df40: 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65  a;..    /* If ne
df50: 63 65 73 73 61 72 79 2c 20 67 72 6f 77 20 74 68  cessary, grow th
df60: 65 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e pIter->aRowidO
df70: 66 66 73 65 74 5b 5d 20 61 72 72 61 79 2e 20 2a  ffset[] array. *
df80: 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  /.    if( iRowid
df90: 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e  Offset>=pIter->n
dfa0: 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a 20  RowidOffset ){. 
dfb0: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
dfc0: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
dfd0: 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20 69  set + 8;.      i
dfe0: 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a  nt *aNew = (int*
dff0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
e000: 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66  (pIter->aRowidOf
e010: 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f  fset, nNew*sizeo
e020: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69  f(int));.      i
e030: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
e040: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
e050: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e060: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e070: 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e   }.      pIter->
e080: 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 61  aRowidOffset = a
e090: 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65 72  New;.      pIter
e0a0: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->nRowidOffset =
e0b0: 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20 20   nNew;.    }..  
e0c0: 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f    pIter->aRowidO
e0d0: 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66 73  ffset[iRowidOffs
e0e0: 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e 69  et++] = pIter->i
e0f0: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
e100: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e110: 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70 49  et = i;.  }.  pI
e120: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
e130: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65 74  t = iRowidOffset
e140: 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c  ;.  fts5SegIterL
e150: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
e160: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  );.}../*.**.*/.s
e170: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
e180: 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
e190: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
e1a0: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
e1b0: 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
e1c0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
e1d0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
e1e0: 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72  VERSE );.  asser
e1f0: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
e200: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
e210: 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74 73  NETERM );..  fts
e220: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
e230: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
e240: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
e250: 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
e260: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
e270: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70 49  er->iLeafPgno>pI
e280: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
e290: 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  no ){.    Fts5Da
e2a0: 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 49  ta *pNew;.    pI
e2b0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d  ter->iLeafPgno--
e2c0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73  ;.    pNew = fts
e2d0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
e2e0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
e2f0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e300: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  ->pSeg->iSegid, 
e310: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
e320: 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28  .    ));.    if(
e330: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f   pNew ){.      /
e340: 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  * iTermLeafOffse
e350: 74 20 6d 61 79 20 62 65 20 65 71 75 61 6c 20 74  t may be equal t
e360: 6f 20 73 7a 4c 65 61 66 20 69 66 20 74 68 65 20  o szLeaf if the 
e370: 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74  term is the last
e380: 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e 67 20  .      ** thing 
e390: 6f 6e 20 74 68 65 20 70 61 67 65 20 2d 20 69 2e  on the page - i.
e3a0: 65 2e 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  e. the first row
e3b0: 69 64 20 69 73 20 6f 6e 20 74 68 65 20 66 6f 6c  id is on the fol
e3c0: 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a 20 20 20  lowing page..   
e3d0: 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
e3e0: 73 65 20 6c 65 61 76 65 20 70 49 74 65 72 2d 3e  se leave pIter->
e3f0: 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69 73 20 69  pLeaf==0, this i
e400: 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
e410: 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  F. */.      if( 
e420: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
e430: 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ==pIter->iTermLe
e440: 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
e450: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
e460: 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  >pLeaf==0 );.   
e470: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
e480: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c  iTermLeafOffset<
e490: 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  pNew->szLeaf ){.
e4a0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e4b0: 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20  >pLeaf = pNew;. 
e4c0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e4d0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49  iLeafOffset = pI
e4e0: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
e4f0: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
e500: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e510: 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
e520: 66 66 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77  ff;.        iRow
e530: 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66  idOff = fts5Leaf
e540: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e  FirstRowidOff(pN
e550: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
e560: 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20   iRowidOff ){.  
e570: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
e580: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
e590: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
e5a0: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  eafOffset = iRow
e5b0: 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 7d  idOff;.        }
e5c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e5d0: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
e5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
e5f0: 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61  a = &pIter->pLea
e600: 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61  f->p[pIter->iLea
e610: 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20  fOffset];.      
e620: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e630: 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74 56  fset += fts5GetV
e640: 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26  arint(a, (u64*)&
e650: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
e660: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e670: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e680: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
e690: 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ase(pNew);.     
e6a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
e6b0: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
e6c0: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
e6d0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
e6e0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
e6f0: 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  1;.    fts5SegIt
e700: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
e710: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
e720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e730: 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
e740: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
e750: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
e760: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ent currently.**
e770: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65 6c   points to a del
e780: 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20 64 65  ete marker. A de
e790: 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73 20 61  lete marker is a
e7a0: 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20 30  n entry with a 0
e7b0: 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69 6f   byte.** positio
e7c0: 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  n-list..*/.stati
e7d0: 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
e7e0: 74 65 72 49 73 45 6d 70 74 79 28 46 74 73 35 49  terIsEmpty(Fts5I
e7f0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65  ndex *p, Fts5Ite
e800: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
e810: 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
e820: 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49   &pIter->aSeg[pI
e830: 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
e840: 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e  First];.  return
e850: 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
e860: 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61  OK && pSeg->pLea
e870: 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d  f && pSeg->nPos=
e880: 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  =0);.}../*.** Ad
e890: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70  vance iterator p
e8a0: 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  Iter to the next
e8b0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
e8c0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 74  is version of ft
e8d0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29 20  s5SegIterNext() 
e8e0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
e8f0: 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72  reverse iterator
e900: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
e910: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
e920: 74 5f 52 65 76 65 72 73 65 28 0a 20 20 46 74 73  t_Reverse(.  Fts
e930: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e950: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
e960: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
e970: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
e980: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
e990: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
e9a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55 6e 75 73  */.  int *pbUnus
e9b0: 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ed              
e9c0: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a       /* Unused *
e9d0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
e9e0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
e9f0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
ea00: 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SE );.  assert( 
ea10: 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
ea20: 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==0 );.  UNUSED_
ea30: 50 41 52 41 4d 28 70 62 55 6e 75 73 65 64 29 3b  PARAM(pbUnused);
ea40: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  ..  if( pIter->i
ea50: 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29 7b  RowidOffset>0 ){
ea60: 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74  .    u8 *a = pIt
ea70: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
ea80: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
ea90: 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20  i64 iDelta;..   
eaa0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
eab0: 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49 74 65  fset--;.    pIte
eac0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
ead0: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
eae0: 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77  fset[pIter->iRow
eaf0: 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 66  idOffset];.    f
eb00: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
eb10: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
eb20: 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
eb30: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
eb40: 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
eb50: 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
eb60: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
eb70: 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 49 74 65      iOff += pIte
eb80: 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20  r->nPos;.    }. 
eb90: 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
eba0: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
ebb0: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70  )&iDelta);.    p
ebc0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20  Iter->iRowid -= 
ebd0: 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 7b  iDelta;.  }else{
ebe0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
ebf0: 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70  ReverseNewPage(p
ec00: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
ec10: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69  ./*.** Advance i
ec20: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f  terator pIter to
ec30: 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
ec40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  .**.** This vers
ec50: 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49 74  ion of fts5SegIt
ec60: 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c 79  erNext() is only
ec70: 20 75 73 65 64 20 69 66 20 64 65 74 61 69 6c 3d   used if detail=
ec80: 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20  none and the.** 
ec90: 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20  iterator is not 
eca0: 61 20 72 65 76 65 72 73 65 20 64 69 72 65 63 74  a reverse direct
ecb0: 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f  ion iterator..*/
ecc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ecd0: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e  5SegIterNext_Non
ece0: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
ecf0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
ed00: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
ed10: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
ed20: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
ed30: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
ed40: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
ed50: 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
ed60: 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20   *pbNewTerm     
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ed80: 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77  OUT: Set for new
ed90: 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e   term */.){.  in
eda0: 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72  t iOff;..  asser
edb0: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
edc0: 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
edd0: 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
ede0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
edf0: 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20 20 61  VERSE)==0 );.  a
ee00: 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69  ssert( p->pConfi
ee10: 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
ee20: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a  _DETAIL_NONE );.
ee30: 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46  .  ASSERT_SZLEAF
ee40: 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  _OK(pIter->pLeaf
ee50: 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49 74 65  );.  iOff = pIte
ee60: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
ee70: 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79  .  /* Next entry
ee80: 20 69 73 20 6f 6e 20 74 68 65 20 6e 65 78 74 20   is on the next 
ee90: 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 49  page */.  if( pI
eea0: 74 65 72 2d 3e 70 53 65 67 20 26 26 20 69 4f 66  ter->pSeg && iOf
eeb0: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
eec0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66  >szLeaf ){.    f
eed0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
eee0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
eef0: 20 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c 20 70    if( p->rc || p
ef00: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
ef10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 49 74   return;.    pIt
ef20: 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a  er->iRowid = 0;.
ef30: 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20      iOff = 4;.  
ef40: 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70 49  }..  if( iOff<pI
ef50: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
ef60: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 78  st ){.    /* Nex
ef70: 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68  t entry is on th
ef80: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a  e current page *
ef90: 2f 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  /.    i64 iDelta
efa0: 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71  ;.    iOff += sq
efb0: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
efc0: 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66  nt(&pIter->pLeaf
efd0: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
efe0: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70  )&iDelta);.    p
eff0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f000: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 70 49  t = iOff;.    pI
f010: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
f020: 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 20 69  Delta;.  }else i
f030: 66 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  f( (pIter->flags
f040: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
f050: 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29 7b 0a 20  ONETERM)==0 ){. 
f060: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53     if( pIter->pS
f070: 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  eg ){.      int 
f080: 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nKeep = 0;.     
f090: 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35 4c   if( iOff!=fts5L
f0a0: 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28  eafFirstTermOff(
f0b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 20 29 7b  pIter->pLeaf) ){
f0c0: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
f0d0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
f0e0: 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  (&pIter->pLeaf->
f0f0: 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b  p[iOff], nKeep);
f100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
f110: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f120: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
f130: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
f140: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b  erm(p, pIter, nK
f150: 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  eep);.    }else{
f160: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
f170: 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  *pList = 0;.    
f180: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
f190: 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  erm = 0;.      i
f1a0: 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20  nt nList;.      
f1b0: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
f1c0: 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68  canNext(p->pHash
f1d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f1e0: 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72  Fts5HashScanEntr
f1f0: 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65  y(p->pHash, &zTe
f200: 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  rm, &pList, &nLi
f210: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
f220: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  List==0 ) goto n
f230: 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20 20  ext_none_eof;.  
f240: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
f250: 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74  ->p = (u8*)pList
f260: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
f270: 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74  Leaf->nn = nList
f280: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
f290: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e  Leaf->szLeaf = n
f2a0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65  List;.      pIte
f2b0: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
f2c0: 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20   = nList;.      
f2d0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
f2e0: 72 53 65 74 28 26 70 2d 3e 72 63 2c 26 70 49 74  rSet(&p->rc,&pIt
f2f0: 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73  er->term, (int)s
f300: 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 75  trlen(zTerm), (u
f310: 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
f320: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f330: 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  set = fts5GetVar
f340: 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a  int(pList, (u64*
f350: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
f360: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
f370: 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62   pbNewTerm ) *pb
f380: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d  NewTerm = 1;.  }
f390: 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74 6f 20 6e  else{.    goto n
f3a0: 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20 20  ext_none_eof;.  
f3b0: 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  }..  fts5SegIter
f3c0: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
f3d0: 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20  r);..  return;. 
f3e0: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a 20  next_none_eof:. 
f3f0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
f400: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
f410: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
f420: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   0;.}.../*.** Ad
f430: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70  vance iterator p
f440: 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  Iter to the next
f450: 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49   entry. .**.** I
f460: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
f470: 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
f480: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
f490: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
f4a0: 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e  ode. It .** is n
f4b0: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e  ot considered an
f4c0: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69 74   error if the it
f4d0: 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45  erator reaches E
f4e0: 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  OF. If an error 
f4f0: 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
f500: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
f510: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
f520: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
f530: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
f540: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
f550: 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Next(.  Fts5Inde
f560: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
f570: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
f580: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
f590: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
f5a0: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
f5b0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
f5c0: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
f5d0: 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20  int *pbNewTerm  
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20  /* OUT: Set for 
f600: 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20  new term */.){. 
f610: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
f620: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
f630: 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 69  .  int iOff;.  i
f640: 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b  nt bNewTerm = 0;
f650: 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30  .  int nKeep = 0
f660: 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74  ;.  u8 *a;.  int
f670: 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   n;..  assert( p
f680: 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a  bNewTerm==0 || *
f690: 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a  pbNewTerm==0 );.
f6a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
f6b0: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46  nfig->eDetail!=F
f6c0: 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
f6d0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  );..  /* Search 
f6e0: 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
f6f0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
f700: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
f710: 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 61  ent page. */.  a
f720: 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 6e   = pLeaf->p;.  n
f730: 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
f740: 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  ;..  ASSERT_SZLE
f750: 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20  AF_OK(pLeaf);.  
f760: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
f770: 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49 74 65  eafOffset + pIte
f780: 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66 28 20  r->nPos;..  if( 
f790: 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 2f 2a  iOff<n ){.    /*
f7a0: 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   The next entry 
f7b0: 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  is on the curren
f7c0: 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  t page. */.    a
f7d0: 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 3d  ssert_nc( iOff<=
f7e0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
f7f0: 6c 69 73 74 20 29 3b 0a 20 20 20 20 69 66 28 20  list );.    if( 
f800: 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69 45 6e  iOff>=pIter->iEn
f810: 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  dofDoclist ){.  
f820: 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31      bNewTerm = 1
f830: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
f840: 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  !=fts5LeafFirstT
f850: 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29 7b  ermOff(pLeaf) ){
f860: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
f870: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
f880: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
f890: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f8a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 36 34 20  else{.      u64 
f8b0: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f  iDelta;.      iO
f8c0: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
f8d0: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
f8e0: 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20  ff], &iDelta);. 
f8f0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77       pIter->iRow
f900: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
f910: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
f920: 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20 7d  Delta>0 );.    }
f930: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
f940: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
f950: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74  .  }else if( pIt
f960: 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20  er->pSeg==0 ){. 
f970: 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69     const u8 *pLi
f980: 73 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  st = 0;.    cons
f990: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20  t char *zTerm = 
f9a0: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73 74  0;.    int nList
f9b0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
f9c0: 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  ( (pIter->flags 
f9d0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
f9e0: 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e 65 77  NETERM) || pbNew
f9f0: 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28 20  Term );.    if( 
fa00: 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  0==(pIter->flags
fa10: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
fa20: 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20 20  ONETERM) ){.    
fa30: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
fa40: 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61  hScanNext(p->pHa
fa50: 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sh);.      sqlit
fa60: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
fa70: 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a  try(p->pHash, &z
fa80: 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  Term, &pList, &n
fa90: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
faa0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
fab0: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
fac0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
fad0: 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65  eaf);.      pIte
fae0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
faf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
fb00: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d  Iter->pLeaf->p =
fb10: 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
fb20: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
fb30: 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  >nn = nList;.   
fb40: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
fb50: 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b  >szLeaf = nList;
fb60: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
fb70: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c  ndofDoclist = nL
fb80: 69 73 74 2b 31 3b 0a 20 20 20 20 20 20 73 71 6c  ist+1;.      sql
fb90: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
fba0: 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
fbb0: 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74 72  ->term, (int)str
fbc0: 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20 20  len(zTerm),.    
fbd0: 20 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72 6d        (u8*)zTerm
fbe0: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
fbf0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
fc00: 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73  s5GetVarint(pLis
fc10: 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  t, (u64*)&pIter-
fc20: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
fc30: 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a  *pbNewTerm = 1;.
fc40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
fc50: 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20     iOff = 0;.   
fc60: 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69   /* Next entry i
fc70: 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72  s not on the cur
fc80: 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20  rent page */.   
fc90: 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30 20   while( iOff==0 
fca0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
fcb0: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
fcc0: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70 4c  pIter);.      pL
fcd0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
fce0: 61 66 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  af;.      if( pL
fcf0: 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
fd00: 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c        ASSERT_SZL
fd10: 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
fd20: 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20 3d       if( (iOff =
fd30: 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
fd40: 77 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20 26  widOff(pLeaf)) &
fd50: 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a  & iOff<pLeaf->sz
fd60: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
fd70: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
fd80: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
fd90: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
fda0: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
fdb0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  id);.        pIt
fdc0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
fdd0: 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20  = iOff;..       
fde0: 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70   if( pLeaf->nn>p
fdf0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
fe00: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
fe10: 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65  >iPgidxOff = pLe
fe20: 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73  af->szLeaf + fts
fe30: 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20  5GetVarint32(.  
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65              &pLe
fe50: 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c  af->p[pLeaf->szL
fe60: 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45 6e  eaf], pIter->iEn
fe70: 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20  dofDoclist.     
fe80: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
fe90: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
fea0: 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d 3e  else if( pLeaf->
feb0: 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  nn>pLeaf->szLeaf
fec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
fed0: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70  r->iPgidxOff = p
fee0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66  Leaf->szLeaf + f
fef0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a  ts5GetVarint32(.
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65              &pLe
ff10: 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c  af->p[pLeaf->szL
ff20: 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20 20 20 20  eaf], iOff.     
ff30: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49     );.        pI
ff40: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ff50: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
ff60: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
ff70: 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b 0a 20 20  clist = iOff;.  
ff80: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
ff90: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
ffa0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
ffb0: 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f<pLeaf->szLeaf 
ffc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  );.      if( iOf
ffd0: 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f>pLeaf->szLeaf 
ffe0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
fff0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
10000 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
10010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10020 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
10030 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  f the iterator i
10040 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49 66  s now at EOF. If
10050 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72 6c   so, return earl
10060 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65  y. */.  if( pIte
10070 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
10080 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a  if( bNewTerm ){.
10090 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
100a0 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
100b0 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b  GITER_ONETERM ){
100c0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
100d0 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
100e0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
100f0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
10100 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10110 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
10120 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
10130 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ter, nKeep);.   
10140 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
10150 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
10160 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
10170 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e  pbNewTerm ) *pbN
10180 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
10190 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
101a0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
101b0 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62 65 20 64  owing could be d
101c0 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  one by calling f
101d0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
101e0 6f 73 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20  os(). But.      
101f0 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  ** this block is
10200 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20 70 65   particularly pe
10210 72 66 6f 72 6d 61 6e 63 65 20 63 72 69 74 69 63  rformance critic
10220 61 6c 2c 20 73 6f 20 65 71 75 69 76 61 6c 65 6e  al, so equivalen
10230 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20  t.      ** code 
10240 69 73 20 69 6e 6c 69 6e 65 64 2e 20 0a 20 20 20  is inlined. .   
10250 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4c     **.      ** L
10260 61 74 65 72 3a 20 53 77 69 74 63 68 65 64 20 62  ater: Switched b
10270 61 63 6b 20 74 6f 20 66 74 73 35 53 65 67 49 74  ack to fts5SegIt
10280 65 72 4c 6f 61 64 4e 50 6f 73 28 29 20 62 65 63  erLoadNPos() bec
10290 61 75 73 65 20 69 74 20 73 75 70 70 6f 72 74 73  ause it supports
102a0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c  .      ** detail
102b0 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20 4e 6f 74 20  =none mode. Not 
102c0 69 64 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ideal..      */.
102d0 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20        int nSz;. 
102e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
102f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
10300 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10310 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10320 74 3c 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  t<=pIter->pLeaf-
10330 3e 6e 6e 20 29 3b 0a 20 20 20 20 20 20 66 74 73  >nn );.      fts
10340 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
10350 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  (pIter->pLeaf->p
10360 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  , pIter->iLeafOf
10370 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20 20  fset, nSz);.    
10380 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20    pIter->bDel = 
10390 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a  (nSz & 0x0001);.
103a0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
103b0 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20  s = nSz>>1;.    
103c0 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74    assert_nc( pIt
103d0 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20  er->nPos>=0 );. 
103e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66     }.  }.}..#def
103f0 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61  ine SWAPVAL(T, a
10400 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d  , b) { T tmp; tm
10410 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b  p=a; a=b; b=tmp;
10420 20 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35   }..#define fts5
10430 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28  IndexSkipVarint(
10440 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20 20 20  a, iOff) {      
10450 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 69 45        \.  int iE
10460 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20 20  nd = iOff+9;    
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 77 68            \.  wh
10490 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d 20  ile( (a[iOff++] 
104a0 26 20 30 78 38 30 29 20 26 26 20 69 4f 66 66 3c  & 0x80) && iOff<
104b0 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20 5c 0a  iEnd );       \.
104c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
104d0 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
104e0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
104f0 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61  first rowid in a
10500 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a   doclist. This.*
10510 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  * function sets 
10520 74 68 65 20 69 74 65 72 61 74 6f 72 20 75 70 20  the iterator up 
10530 73 6f 20 74 68 61 74 20 69 74 65 72 61 74 65 73  so that iterates
10540 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
10550 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65  r through.** the
10560 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61   doclist..*/.sta
10570 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
10580 49 74 65 72 52 65 76 65 72 73 65 28 46 74 73 35  IterReverse(Fts5
10590 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
105a0 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
105b0 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
105c0 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  pDlidx = pIter->
105d0 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35 44 61  pDlidx;.  Fts5Da
105e0 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20  ta *pLast = 0;. 
105f0 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20   int pgnoLast = 
10600 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69 64 78  0;..  if( pDlidx
10610 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67   ){.    int iSeg
10620 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  id = pIter->pSeg
10630 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67  ->iSegid;.    pg
10640 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44 6c 69  noLast = fts5Dli
10650 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
10660 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20  x);.    pLast = 
10670 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
10680 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
10690 49 44 28 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c  ID(iSegid, pgnoL
106a0 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ast));.  }else{.
106b0 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
106c0 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
106d0 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  af;         /* C
106e0 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61  urrent leaf data
106f0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72   */..    /* Curr
10700 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74  ently, Fts5SegIt
10710 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
10720 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
10730 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 2a  st byte of.    *
10740 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  * position-list 
10750 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20  content for the 
10760 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42  current rowid. B
10770 61 63 6b 20 69 74 20 75 70 20 73 6f 20 74 68 61  ack it up so tha
10780 74 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  t it.    ** poin
10790 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ts to the start 
107a0 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  of the position-
107b0 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e  list size field.
107c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 6f 73   */.    int iPos
107d0 6c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 49  list;.    if( pI
107e0 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
107f0 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no==pIter->iLeaf
10800 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 69 50  Pgno ){.      iP
10810 6f 73 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e  oslist = pIter->
10820 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
10830 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10840 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 34 3b 0a    iPoslist = 4;.
10850 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e      }.    fts5In
10860 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28 70 4c  dexSkipVarint(pL
10870 65 61 66 2d 3e 70 2c 20 69 50 6f 73 6c 69 73 74  eaf->p, iPoslist
10880 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
10890 65 61 66 4f 66 66 73 65 74 20 3d 20 69 50 6f 73  eafOffset = iPos
108a0 6c 69 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  list;..    /* If
108b0 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
108c0 69 73 20 74 72 75 65 20 74 68 65 6e 20 74 68 65  is true then the
108d0 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66   largest rowid f
108e0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  or the current. 
108f0 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e     ** term may n
10900 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20  ot be stored on 
10910 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
10920 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77  . So search forw
10930 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65  ard to.    ** se
10940 65 20 77 68 65 72 65 20 73 61 69 64 20 72 6f 77  e where said row
10950 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a  id really is.  *
10960 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  /.    if( pIter-
10970 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3e 3d  >iEndofDoclist>=
10980 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
10990 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b  .      int pgno;
109a0 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
109b0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
109c0 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b  g = pIter->pSeg;
109d0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ..      /* The l
109e0 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  ast rowid in the
109f0 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74   doclist may not
10a00 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65   be on the curre
10a10 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a  nt page. Search.
10a20 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64        ** forward
10a30 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70 61 67   to find the pag
10a40 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
10a50 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f   last rowid.  */
10a60 0a 20 20 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d  .      for(pgno=
10a70 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
10a80 2b 31 3b 20 21 70 2d 3e 72 63 20 26 26 20 70 67  +1; !p->rc && pg
10a90 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  no<=pSeg->pgnoLa
10aa0 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20  st; pgno++){.   
10ab0 20 20 20 20 20 69 36 34 20 69 41 62 73 20 3d 20       i64 iAbs = 
10ac0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
10ad0 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
10ae0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
10af0 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d  Fts5Data *pNew =
10b00 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
10b10 20 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20   iAbs);.        
10b20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
10b30 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
10b40 2c 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20  , bTermless;.   
10b50 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20         iRowid = 
10b60 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
10b70 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20  idOff(pNew);.   
10b80 20 20 20 20 20 20 20 62 54 65 72 6d 6c 65 73 73         bTermless
10b90 20 3d 20 66 74 73 35 4c 65 61 66 49 73 54 65 72   = fts5LeafIsTer
10ba0 6d 6c 65 73 73 28 70 4e 65 77 29 3b 0a 20 20 20  mless(pNew);.   
10bb0 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
10bc0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
10bd0 20 53 57 41 50 56 41 4c 28 46 74 73 35 44 61 74   SWAPVAL(Fts5Dat
10be0 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74 29  a*, pNew, pLast)
10bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 67  ;.            pg
10c00 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20  noLast = pgno;. 
10c10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10c20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
10c30 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
10c40 20 20 20 20 20 20 69 66 28 20 62 54 65 72 6d 6c        if( bTerml
10c50 65 73 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ess==0 ) break;.
10c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10c70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
10c80 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55  * If pLast is NU
10c90 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  LL at this point
10ca0 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
10cb0 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 64  rowid for this d
10cc0 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73  oclist.  ** lies
10cd0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75 72   on the page cur
10ce0 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64  rently indicated
10cf0 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72   by the iterator
10d00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a  . In this case .
10d10 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61    ** pIter->iLea
10d20 66 4f 66 66 73 65 74 20 69 73 20 61 6c 72 65 61  fOffset is alrea
10d30 64 79 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  dy set to point 
10d40 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  to the position-
10d50 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66  list size.  ** f
10d60 69 65 6c 64 20 61 73 73 6f 63 69 61 74 65 64 20  ield associated 
10d70 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 72  with the first r
10d80 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e  elevant rowid on
10d90 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a   the page..  **.
10da0 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73    ** Or, if pLas
10db0 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
10dc0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 70 61  hen it is the pa
10dd0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
10de0 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72   the last.  ** r
10df0 6f 77 69 64 2e 20 49 6e 20 74 68 69 73 20 63 61  owid. In this ca
10e00 73 65 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65  se configure the
10e10 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61   iterator so tha
10e20 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
10e30 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 72 6f  he.  ** first ro
10e40 77 69 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  wid on this page
10e50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61  ..  */.  if( pLa
10e60 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  st ){.    int iO
10e70 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  ff;.    fts5Data
10e80 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
10e90 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72  Leaf);.    pIter
10ea0 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b  ->pLeaf = pLast;
10eb0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
10ec0 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74  fPgno = pgnoLast
10ed0 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73  ;.    iOff = fts
10ee0 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
10ef0 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 69  ff(pLast);.    i
10f00 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
10f10 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69  rint(&pLast->p[i
10f20 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
10f30 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
10f40 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
10f50 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20  set = iOff;..   
10f60 20 69 66 28 20 66 74 73 35 4c 65 61 66 49 73 54   if( fts5LeafIsT
10f70 65 72 6d 6c 65 73 73 28 70 4c 61 73 74 29 20 29  ermless(pLast) )
10f80 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
10f90 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
10fa0 4c 61 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20  Last->nn+1;.    
10fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
10fc0 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
10fd0 74 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  t = fts5LeafFirs
10fe0 74 54 65 72 6d 4f 66 66 28 70 4c 61 73 74 29 3b  tTermOff(pLast);
10ff0 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20 66  .    }..  }..  f
11000 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
11010 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
11020 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  er);.}../*.** It
11030 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
11040 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
11050 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
11060 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a   of a doclist..*
11070 2a 20 54 68 65 72 65 20 69 73 20 61 20 64 6f 63  * There is a doc
11080 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63  list-index assoc
11090 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
110a0 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65  inal term on the
110b0 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67   current .** pag
110c0 65 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  e. If the curren
110d0 74 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61  t term is the la
110e0 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70  st term on the p
110f0 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a  age, load the .*
11100 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * doclist-index 
11110 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e  from disk and in
11120 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72  itialize an iter
11130 61 74 6f 72 20 61 74 20 28 70 49 74 65 72 2d 3e  ator at (pIter->
11140 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74  pDlidx)..*/.stat
11150 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
11160 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73  terLoadDlidx(Fts
11170 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
11180 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
11190 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70 49 74    int iSeg = pIt
111a0 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
111b0 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28  ;.  int bRev = (
111c0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
111d0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
111e0 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61 74 61  RSE);.  Fts5Data
111f0 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d   *pLeaf = pIter-
11200 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72 65  >pLeaf; /* Curre
11210 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
11220 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
11230 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
11240 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
11250 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
11260 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a  r->pDlidx==0 );.
11270 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
11280 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
11290 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20  st ends on this 
112a0 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73  page. If it does
112b0 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61  , return.  ** ea
112c0 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64  rly without load
112d0 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  ing the doclist-
112e0 69 6e 64 65 78 20 28 61 73 20 69 74 20 62 65 6c  index (as it bel
112f0 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65 72  ongs to a differ
11300 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a  ent.  ** term. *
11310 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  /.  if( pIter->i
11320 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49  TermLeafPgno==pI
11330 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 0a  ter->iLeafPgno .
11340 20 20 20 26 26 20 70 49 74 65 72 2d 3e 69 45 6e     && pIter->iEn
11350 64 6f 66 44 6f 63 6c 69 73 74 3c 70 4c 65 61 66  dofDoclist<pLeaf
11360 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a 20  ->szLeaf .  ){. 
11370 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
11380 20 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20    pIter->pDlidx 
11390 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  = fts5DlidxIterI
113a0 6e 69 74 28 70 2c 20 62 52 65 76 2c 20 69 53 65  nit(p, bRev, iSe
113b0 67 2c 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  g, pIter->iTermL
113c0 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  eafPgno);.}../*.
113d0 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
113e0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
113f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
11400 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 63  ment currently c
11410 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61  ontains.** no va
11420 6c 69 64 20 76 61 6c 75 65 73 20 65 78 63 65 70  lid values excep
11430 74 20 66 6f 72 20 74 68 65 20 46 74 73 35 53 65  t for the Fts5Se
11440 67 49 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62  gIter.pLeaf memb
11450 65 72 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69  er variable. Thi
11460 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65  s.** function se
11470 61 72 63 68 65 73 20 74 68 65 20 6c 65 61 66 20  arches the leaf 
11480 70 61 67 65 20 66 6f 72 20 61 20 74 65 72 6d 20  page for a term 
11490 6d 61 74 63 68 69 6e 67 20 28 70 54 65 72 6d 2f  matching (pTerm/
114a0 6e 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nTerm)..**.** If
114b0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
114c0 65 72 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20  erm is found on 
114d0 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
114e0 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
114f0 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
11500 74 6f 20 69 74 2e 20 49 66 20 61 72 67 75 6d 65  to it. If argume
11510 6e 74 20 62 47 65 20 69 73 20 7a 65 72 6f 20 61  nt bGe is zero a
11520 6e 64 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  nd the term is n
11530 6f 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65  ot found,.** the
11540 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
11550 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f  t pointing at EO
11560 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20  F..**.** If bGe 
11570 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
11580 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
11590 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  rm is not found,
115a0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65   then the.** ite
115b0 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  rator is left po
115c0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 73 6d  inting to the sm
115d0 61 6c 6c 65 73 74 20 74 65 72 6d 20 69 6e 20 74  allest term in t
115e0 68 65 20 73 65 67 6d 65 6e 74 20 74 68 61 74 0a  he segment that.
115f0 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ** is larger tha
11600 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
11610 74 65 72 6d 2c 20 65 76 65 6e 20 69 66 20 74 68  term, even if th
11620 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f  is term is not o
11630 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  n the.** current
11640 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
11650 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66 53 65   void fts5LeafSe
11660 65 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ek(.  Fts5Index 
11670 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11680 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61        /* Leave a
11690 6e 79 20 65 72 72 6f 72 20 63 6f 64 65 20 68 65  ny error code he
116a0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c  re */.  int bGe,
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
116d0 66 6f 72 20 61 20 3e 3d 20 73 65 61 72 63 68 20  for a >= search 
116e0 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
116f0 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
11700 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11710 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f   to seek */.  co
11720 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
11730 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a  nt nTerm      /*
11740 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   Term to search 
11750 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  for */.){.  int 
11760 69 4f 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38  iOff;.  const u8
11770 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
11780 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 73 7a 4c  af->p;.  int szL
11790 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
117a0 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e  af->szLeaf;.  in
117b0 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  t n = pIter->pLe
117c0 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 69 6e 74 20 6e  af->nn;..  int n
117d0 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74  Match = 0;.  int
117e0 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 69 6e   nKeep = 0;.  in
117f0 74 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e  t nNew = 0;.  in
11800 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 6e  t iTermOff;.  in
11810 74 20 69 50 67 69 64 78 3b 20 20 20 20 20 20 20  t iPgidx;       
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11830 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   Current offset 
11840 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e  in pgidx */.  in
11850 74 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 30  t bEndOfPage = 0
11860 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
11870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
11880 0a 0a 20 20 69 50 67 69 64 78 20 3d 20 73 7a 4c  ..  iPgidx = szL
11890 65 61 66 3b 0a 20 20 69 50 67 69 64 78 20 2b 3d  eaf;.  iPgidx +=
118a0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
118b0 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 69 54 65  (&a[iPgidx], iTe
118c0 72 6d 4f 66 66 29 3b 0a 20 20 69 4f 66 66 20 3d  rmOff);.  iOff =
118d0 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 66 28   iTermOff;.  if(
118e0 20 69 4f 66 66 3e 6e 20 29 7b 0a 20 20 20 20 70   iOff>n ){.    p
118f0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
11900 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  UPT;.    return;
11910 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
11920 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   ){..    /* Figu
11930 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
11940 6e 65 77 20 62 79 74 65 73 20 61 72 65 20 69 6e  new bytes are in
11950 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
11960 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
11970 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
11980 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b  New);.    if( nK
11990 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20  eep<nMatch ){.  
119a0 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
119b0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
119c0 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65 70     assert( nKeep
119d0 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20 20  >=nMatch );.    
119e0 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63  if( nKeep==nMatc
119f0 68 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  h ){.      int n
11a00 43 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Cmp;.      int i
11a10 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d  ;.      nCmp = M
11a20 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e  IN(nNew, nTerm-n
11a30 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f  Match);.      fo
11a40 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69  r(i=0; i<nCmp; i
11a50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
11a60 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72   a[iOff+i]!=pTer
11a70 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72  m[nMatch+i] ) br
11a80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
11a90 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a     nMatch += i;.
11aa0 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d  .      if( nTerm
11ab0 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
11ac0 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20      if( i==nNew 
11ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
11ae0 6f 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73  o search_success
11af0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11b00 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11b10 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
11b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11b30 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20  else if( i<nNew 
11b40 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65  && a[iOff+i]>pTe
11b50 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20  rm[nMatch] ){.  
11b60 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
11b70 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
11b80 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
11b90 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20   iPgidx>=n ){.  
11ba0 20 20 20 20 62 45 6e 64 4f 66 50 61 67 65 20 3d      bEndOfPage =
11bb0 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
11bc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 50 67 69  .    }..    iPgi
11bd0 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
11be0 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
11bf0 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69 54  , nKeep);.    iT
11c00 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b  ermOff += nKeep;
11c10 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
11c20 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69  mOff;..    if( i
11c30 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Off>=n ){.      
11c40 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
11c50 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  RUPT;.      retu
11c60 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
11c70 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65 65 70  * Read the nKeep
11c80 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65   field of the ne
11c90 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  xt term. */.    
11ca0 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
11cb0 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4b 65  t32(a, iOff, nKe
11cc0 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  ep);.  }.. searc
11cd0 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  h_failed:.  if( 
11ce0 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  bGe==0 ){.    ft
11cf0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
11d00 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
11d10 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
11d20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  0;.    return;. 
11d30 20 7d 65 6c 73 65 20 69 66 28 20 62 45 6e 64 4f   }else if( bEndO
11d40 66 50 61 67 65 20 29 7b 0a 20 20 20 20 64 6f 20  fPage ){.    do 
11d50 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
11d60 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
11d70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Iter);.      if(
11d80 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
11d90 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
11da0 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   a = pIter->pLea
11db0 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66 28 20  f->p;.      if( 
11dc0 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
11dd0 73 73 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ss(pIter->pLeaf)
11de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
11df0 50 67 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Pgidx = pIter->p
11e00 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
11e10 20 20 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20        iPgidx += 
11e20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11e30 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
11e40 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66 66 29 3b  [iPgidx], iOff);
11e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
11e60 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70 49 74  f<4 || iOff>=pIt
11e70 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
11e80 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
11e90 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
11ea0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  UPT;.          r
11eb0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
11ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11ed0 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nKeep = 0;.     
11ee0 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
11ef0 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
11f00 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
11f10 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  ->nn;.          
11f20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
11f30 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
11f40 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
11f50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11f60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11f70 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d  }while( 1 );.  }
11f80 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63 65 73  .. search_succes
11f90 73 3a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  s:.  pIter->iLea
11fa0 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20 2b  fOffset = iOff +
11fb0 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 49 74   nNew;.  if( pIt
11fc0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3e  er->iLeafOffset>
11fd0 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  n ){.    p->rc =
11fe0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
11ff0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
12000 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
12010 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d  fOffset = pIter-
12020 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
12030 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
12040 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c  Pgno = pIter->iL
12050 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73 35  eafPgno;..  fts5
12060 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
12070 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
12080 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a 20  nKeep, pTerm);. 
12090 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
120a0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
120b0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77  Iter->term, nNew
120c0 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20  , &a[iOff]);..  
120d0 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b  if( iPgidx>=n ){
120e0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
120f0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65  ofDoclist = pIte
12100 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a  r->pLeaf->nn+1;.
12110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
12120 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 50 67   nExtra;.    iPg
12130 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
12140 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
12150 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
12160 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
12170 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f 66 66 20  list = iTermOff 
12180 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20 20  + nExtra;.  }.  
12190 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
121a0 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20 20 66 74   = iPgidx;..  ft
121b0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77  s5SegIterLoadRow
121c0 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  id(p, pIter);.  
121d0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
121e0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  Pos(p, pIter);.}
121f0 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ..static sqlite3
12200 5f 73 74 6d 74 20 2a 66 74 73 35 49 64 78 53 65  _stmt *fts5IdxSe
12210 6c 65 63 74 53 74 6d 74 28 46 74 73 35 49 6e 64  lectStmt(Fts5Ind
12220 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ex *p){.  if( p-
12230 3e 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29  >pIdxSelect==0 )
12240 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
12250 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
12260 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
12270 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
12280 28 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65  (p, &p->pIdxSele
12290 63 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ct, sqlite3_mpri
122a0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
122b0 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d  SELECT pgno FROM
122c0 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57   '%q'.'%q_idx' W
122d0 48 45 52 45 20 22 0a 20 20 20 20 20 20 20 20 20  HERE ".         
122e0 20 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65   "segid=? AND te
122f0 72 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74  rm<=? ORDER BY t
12300 65 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31  erm DESC LIMIT 1
12310 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
12320 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
12330 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29  ig->zName.    ))
12340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
12350 2d 3e 70 49 64 78 53 65 6c 65 63 74 3b 0a 7d 0a  ->pIdxSelect;.}.
12360 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
12370 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74  e the object pIt
12380 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
12390 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
123a0 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a  within segment.*
123b0 2a 20 70 53 65 67 2e 20 49 66 20 74 68 65 72 65  * pSeg. If there
123c0 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d   is no such term
123d0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74   in the index, t
123e0 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  he iterator is s
123f0 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
12400 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12410 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
12420 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
12430 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12440 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
12450 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
12460 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
12470 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12480 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
12490 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
124a0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
124b0 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46  terSeekInit(.  F
124c0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
124e0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
124f0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
12500 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
12510 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
12520 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
12530 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12550 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
12560 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
12570 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
12580 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
12590 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
125a0 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  f segment */.  F
125b0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
125c0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
125d0 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  * Object to popu
125e0 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  late */.){.  int
125f0 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20   iPg = 1;.  int 
12600 62 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46  bGe = (flags & F
12610 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
12620 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69  CAN);.  int bDli
12630 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dx = 0;         
12640 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12650 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f  if there is a do
12660 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20  clist-index */. 
12670 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12680 49 64 78 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  IdxSelect = 0;..
12690 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30    assert( bGe==0
126a0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
126b0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
126c0 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  C)==0 );.  asser
126d0 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72  t( pTerm && nTer
126e0 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  m );.  memset(pI
126f0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
12700 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
12710 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a  ->pSeg = pSeg;..
12720 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
12730 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61  sets stack varia
12740 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c  ble iPg to the l
12750 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
12760 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f  that may.  ** co
12770 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72  ntain term (pTer
12780 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20  m/nTerm), if it 
12790 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
127a0 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  e segment. */.  
127b0 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66 74 73  pIdxSelect = fts
127c0 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 70  5IdxSelectStmt(p
127d0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  );.  if( p->rc )
127e0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
127f0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78  e3_bind_int(pIdx
12800 53 65 6c 65 63 74 2c 20 31 2c 20 70 53 65 67 2d  Select, 1, pSeg-
12810 3e 69 53 65 67 69 64 29 3b 0a 20 20 73 71 6c 69  >iSegid);.  sqli
12820 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49  te3_bind_blob(pI
12830 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65  dxSelect, 2, pTe
12840 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54  rm, nTerm, SQLIT
12850 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  E_STATIC);.  if(
12860 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
12870 69 74 65 33 5f 73 74 65 70 28 70 49 64 78 53 65  ite3_step(pIdxSe
12880 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36 34  lect) ){.    i64
12890 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63   val = sqlite3_c
128a0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 64 78 53 65  olumn_int(pIdxSe
128b0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50  lect, 0);.    iP
128c0 67 20 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31  g = (int)(val>>1
128d0 29 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20  );.    bDlidx = 
128e0 28 76 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a  (val & 0x0001);.
128f0 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71    }.  p->rc = sq
12900 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 64 78  lite3_reset(pIdx
12910 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
12920 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 64  e3_bind_null(pId
12930 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a 0a 20 20  xSelect, 2);..  
12940 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70 67  if( iPg<pSeg->pg
12950 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69  noFirst ){.    i
12960 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  Pg = pSeg->pgnoF
12970 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64 78  irst;.    bDlidx
12980 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74   = 0;.  }..  pIt
12990 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
129a0 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35 53  iPg - 1;.  fts5S
129b0 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
129c0 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66 28  , pIter);..  if(
129d0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
129e0 0a 20 20 20 20 66 74 73 35 4c 65 61 66 53 65 65  .    fts5LeafSee
129f0 6b 28 70 2c 20 62 47 65 2c 20 70 49 74 65 72 2c  k(p, bGe, pIter,
12a00 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   pTerm, nTerm);.
12a10 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
12a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
12a30 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74  Ge==0 ){.    pIt
12a40 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
12a50 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
12a60 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  M;.    if( pIter
12a70 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
12a80 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
12a90 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
12aa0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  C ){.        pIt
12ab0 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
12ac0 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
12ad0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
12ae0 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20   if( bDlidx ){. 
12af0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
12b00 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 70  erLoadDlidx(p, p
12b10 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
12b20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
12b30 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
12b40 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
12b50 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
12b60 72 73 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  rse(p, pIter);. 
12b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12b80 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53  ..  fts5SegIterS
12b90 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
12ba0 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 3a 0a  ;..  /* Either:.
12bb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 61    **.  **   1) a
12bc0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
12bd0 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  rred, or.  **   
12be0 32 29 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  2) the iterator 
12bf0 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 2c 20 6f  points to EOF, o
12c00 72 0a 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20  r.  **   3) the 
12c10 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
12c20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68  to an entry with
12c30 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65   term (pTerm/nTe
12c40 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 34  rm), or.  **   4
12c50 29 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f  ) the FTS5INDEX_
12c60 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20  QUERY_SCAN flag 
12c70 77 61 73 20 73 65 74 20 61 6e 64 20 74 68 65 20  was set and the 
12c80 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a  iterator points.
12c90 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 61 6e 20    **      to an 
12ca0 65 6e 74 72 79 20 77 69 74 68 20 61 20 74 65 72  entry with a ter
12cb0 6d 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  m greater than o
12cc0 72 20 65 71 75 61 6c 20 74 6f 20 28 70 54 65 72  r equal to (pTer
12cd0 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20  m/nTerm)..  */. 
12ce0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
12cf0 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c     /* 1 */.   ||
12d30 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d70 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20 66 74 73  * 2 */.   || fts
12d80 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
12d90 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
12da0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d   pTerm, nTerm)==
12db0 30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20  0          /* 3 
12dc0 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65 20 26 26  */.   || (bGe &&
12dd0 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
12de0 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74  reBlob(&pIter->t
12df0 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
12e00 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a 2f 0a 20  m)>0)  /* 4 */. 
12e10 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   );.}../*.** Ini
12e20 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65  tialize the obje
12e30 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  ct pIter to poin
12e40 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f  t to term pTerm/
12e50 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  nTerm within the
12e60 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  .** in-memory ha
12e70 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65  sh table. If the
12e80 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65  re is no such te
12e90 72 6d 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74  rm in the hash-t
12ea0 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74  able, the .** it
12eb0 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  erator is set to
12ec0 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   EOF..**.** If a
12ed0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12ee0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
12ef0 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
12f00 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
12f10 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
12f20 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
12f30 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
12f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12f50 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
12f60 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
12f70 69 64 20 66 74 73 35 53 65 67 49 74 65 72 48 61  id fts5SegIterHa
12f80 73 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  shInit(.  Fts5In
12f90 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
12fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
12fb0 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63  5 backend */.  c
12fc0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
12fd0 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
12fe0 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
12ff0 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  o */.  int flags
13000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13010 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
13020 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20  f FTS5INDEX_XXX 
13030 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53  flags */.  Fts5S
13040 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
13050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
13060 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
13070 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
13080 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
13090 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20  int nList = 0;. 
130a0 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30   const u8 *z = 0
130b0 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a  ;.  int n = 0;..
130c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
130d0 73 68 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  sh );.  assert( 
130e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
130f0 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d   );..  if( pTerm
13100 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
13110 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
13120 53 43 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e  SCAN) ){.    p->
13130 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
13140 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e  HashScanInit(p->
13150 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
13160 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
13170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
13180 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
13190 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
131a0 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69   char**)&z, &pLi
131b0 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
131c0 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73   n = (z ? (int)s
131d0 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61  trlen((const cha
131e0 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65  r*)z) : 0);.  }e
131f0 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
13200 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
13210 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
13220 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
13230 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68  shQuery(p->pHash
13240 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  , (const char*)p
13250 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c  Term, nTerm, &pL
13260 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
13270 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20    z = pTerm;.   
13280 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a   n = nTerm;.  }.
13290 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
132a0 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
132b0 65 61 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eaf;.    sqlite3
132c0 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  Fts5BufferSet(&p
132d0 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
132e0 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70  rm, n, z);.    p
132f0 4c 65 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61  Leaf = fts5IdxMa
13300 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
13310 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69  ts5Data));.    i
13320 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  f( pLeaf==0 ) re
13330 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d  turn;.    pLeaf-
13340 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b  >p = (u8*)pList;
13350 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d  .    pLeaf->nn =
13360 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d   pLeaf->szLeaf =
13370 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65   nList;.    pIte
13380 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66  r->pLeaf = pLeaf
13390 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
133a0 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
133b0 65 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e  etVarint(pLeaf->
133c0 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  p, (u64*)&pIter-
133d0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49  >iRowid);.    pI
133e0 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
133f0 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  st = pLeaf->nn;.
13400 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
13410 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
13420 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70  _DESC ){.      p
13430 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
13440 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
13450 52 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53  RSE;.      fts5S
13460 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
13470 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
13480 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13490 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
134a0 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
134b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
134c0 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74  s5SegIterSetNext
134d0 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  (p, pIter);.}../
134e0 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74  *.** Zero the it
134f0 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
13500 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
13510 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
13520 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43 6c  id fts5SegIterCl
13530 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72 20  ear(Fts5SegIter 
13540 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42  *pIter){.  fts5B
13550 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
13560 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44  ->term);.  fts5D
13570 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
13580 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35  ->pLeaf);.  fts5
13590 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
135a0 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
135b0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
135c0 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  ee(pIter->pDlidx
135d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
135e0 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e(pIter->aRowidO
135f0 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74  ffset);.  memset
13600 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
13610 66 28 46 74 73 35 53 65 67 49 74 65 72 29 29 3b  f(Fts5SegIter));
13620 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
13630 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG../*.** T
13640 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13650 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
13660 74 68 65 20 62 69 67 20 61 73 73 65 72 74 28 29  the big assert()
13670 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65   procedure imple
13680 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73  mented by.** fts
13690 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
136a0 53 65 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75  Setup(). It ensu
136b0 72 65 73 20 74 68 61 74 20 74 68 65 20 72 65 73  res that the res
136c0 75 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ult currently st
136d0 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73  ored.** in *pRes
136e0 20 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20   is the correct 
136f0 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
13700 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
13710 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  positions of the
13720 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72  .** two iterator
13730 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
13740 64 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70  d fts5AssertComp
13750 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20  arisonResult(.  
13760 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
13770 20 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20   .  Fts5SegIter 
13780 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74  *p1,.  Fts5SegIt
13790 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52  er *p2,.  Fts5CR
137a0 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20  esult *pRes.){. 
137b0 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70   int i1 = p1 - p
137c0 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e  Iter->aSeg;.  in
137d0 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65  t i2 = p2 - pIte
137e0 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20  r->aSeg;..  if( 
137f0 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d  p1->pLeaf || p2-
13800 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66  >pLeaf ){.    if
13810 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
13820 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13830 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
13840 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
13850 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
13860 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13870 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
13880 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
13890 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20       int nMin = 
138a0 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20  MIN(p1->term.n, 
138b0 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  p2->term.n);.   
138c0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d     int res = mem
138d0 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20  cmp(p1->term.p, 
138e0 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e  p2->term.p, nMin
138f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
13900 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e  ==0 ) res = p1->
13910 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72  term.n - p2->ter
13920 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m.n;..      if( 
13930 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
13940 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13950 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20  bTermEq==1 );.  
13960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
13970 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52  ->iRowid!=p2->iR
13980 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
13990 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
139a0 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
139b0 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
139c0 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d   -1 : 1;.      }
139d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
139e0 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
139f0 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mEq==0 );.      
13a00 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  }..      if( res
13a10 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  <0 ){.        as
13a20 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
13a30 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20  st==i1 );.      
13a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
13a50 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
13a60 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20  rst==i2 );.     
13a70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
13a80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13a90 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
13aa0 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42  nless SQLITE_DEB
13ab0 55 47 20 69 73 20 64 65 66 69 6e 65 64 20 77 68  UG is defined wh
13ac0 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  en this module.*
13ad0 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49  * is compiled. I
13ae0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
13af0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73  s function is es
13b00 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73  sentially an ass
13b10 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
13b20 65 6e 74 20 75 73 65 64 20 74 6f 20 76 65 72 69  ent used to veri
13b30 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  fy that the cont
13b40 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65  ents of the pIte
13b50 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61  r->aFirst[] arra
13b60 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74  y.** are correct
13b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13b80 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
13b90 49 74 65 72 53 65 74 75 70 28 46 74 73 35 49 6e  IterSetup(Fts5In
13ba0 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72  dex *p, Fts5Iter
13bb0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
13bc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13bd0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
13be0 74 65 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70  ter *pFirst = &p
13bf0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
13c00 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
13c10 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69  rst ];.    int i
13c20 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ;..    assert( (
13c30 70 46 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30  pFirst->pLeaf==0
13c40 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62  )==pIter->base.b
13c50 45 6f 66 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  Eof );..    /* C
13c60 68 65 63 6b 20 74 68 61 74 20 70 49 74 65 72 2d  heck that pIter-
13c70 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 69 73  >iSwitchRowid is
13c80 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
13c90 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
13ca0 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
13cb0 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
13cc0 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
13cd0 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
13ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d      assert( p1==
13cf0 70 46 69 72 73 74 20 0a 20 20 20 20 20 20 20 20  pFirst .        
13d00 20 20 20 7c 7c 20 70 31 2d 3e 70 4c 65 61 66 3d     || p1->pLeaf=
13d10 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  =0 .           |
13d20 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  | fts5BufferComp
13d30 61 72 65 28 26 70 46 69 72 73 74 2d 3e 74 65 72  are(&pFirst->ter
13d40 6d 2c 20 26 70 31 2d 3e 74 65 72 6d 29 20 0a 20  m, &p1->term) . 
13d50 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d            || p1-
13d60 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e  >iRowid==pIter->
13d70 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20  iSwitchRowid.   
13d80 20 20 20 20 20 20 20 20 7c 7c 20 28 70 31 2d 3e          || (p1->
13d90 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53  iRowid<pIter->iS
13da0 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74  witchRowid)==pIt
13db0 65 72 2d 3e 62 52 65 76 0a 20 20 20 20 20 20 29  er->bRev.      )
13dc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
13dd0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
13de0 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  Seg; i+=2){.    
13df0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13e00 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
13e10 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53  [i];.      Fts5S
13e20 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49  egIter *p2 = &pI
13e30 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a  ter->aSeg[i+1];.
13e40 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
13e50 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
13e60 2d 3e 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d  ->aFirst[(pIter-
13e70 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b  >nSeg + i) / 2];
13e80 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
13e90 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
13ea0 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c  t(pIter, p1, p2,
13eb0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20   pRes);.    }.. 
13ec0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70     for(i=1; i<(p
13ed0 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b  Iter->nSeg / 2);
13ee0 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74   i+=2){.      Ft
13ef0 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
13f00 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
13f10 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d  ter->aFirst[i*2]
13f20 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20  .iFirst ];.     
13f30 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
13f40 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13f50 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
13f60 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  *2+1].iFirst ];.
13f70 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
13f80 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
13f90 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20  ->aFirst[i];.   
13fa0 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d     fts5AssertCom
13fb0 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49  parisonResult(pI
13fc0 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65  ter, p1, p2, pRe
13fd0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  s);.    }.  }.}.
13fe0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
13ff0 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
14000 65 72 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e  erSetup(x,y).#en
14010 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68  dif../*.** Do th
14020 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63  e comparison nec
14030 65 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61  essary to popula
14040 74 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  te pIter->aFirst
14050 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66  [iOut]..**.** If
14060 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
14070 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  lue is non-zero,
14080 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
14090 69 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72  index of an entr
140a0 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65  y.** in the pIte
140b0 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20  r->aSeg[] array 
140c0 74 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20  that is (a) not 
140d0 61 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20  at EOF, and (b) 
140e0 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
140f0 20 6b 65 79 20 74 68 61 74 20 69 73 20 61 20 64   key that is a d
14100 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
14110 68 65 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f  her, higher prio
14120 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e  rity, .** segmen
14130 74 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68  t-iterator in th
14140 65 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61  e pSeg->aSeg[] a
14150 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
14160 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
14170 72 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 49  rDoCompare(Fts5I
14180 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
14190 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b  iOut){.  int i1;
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
141c0 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46  x of left-hand F
141d0 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
141e0 69 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20 20  int i2;         
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
14210 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
14220 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73  er */.  int iRes
14230 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ;.  Fts5SegIter 
14240 2a 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  *p1;            
14250 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64      /* Left-hand
14260 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
14270 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14280 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
14290 20 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20    /* Right-hand 
142a0 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
142b0 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52   Fts5CResult *pR
142c0 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69  es = &pIter->aFi
142d0 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73  rst[iOut];..  as
142e0 73 65 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72  sert( iOut<pIter
142f0 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30  ->nSeg && iOut>0
14300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
14310 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20  ter->bRev==0 || 
14320 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29  pIter->bRev==1 )
14330 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28  ;..  if( iOut>=(
14340 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29  pIter->nSeg/2) )
14350 7b 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74  {.    i1 = (iOut
14360 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32   - pIter->nSeg/2
14370 29 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20  ) * 2;.    i2 = 
14380 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  i1 + 1;.  }else{
14390 0a 20 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d  .    i1 = pIter-
143a0 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e  >aFirst[iOut*2].
143b0 69 46 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d  iFirst;.    i2 =
143c0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
143d0 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b  Out*2+1].iFirst;
143e0 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74  .  }.  p1 = &pIt
143f0 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20  er->aSeg[i1];.  
14400 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p2 = &pIter->aSe
14410 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e  g[i2];..  pRes->
14420 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69  bTermEq = 0;.  i
14430 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p1->pLeaf==0 
14440 29 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){           /* 
14450 49 66 20 70 31 20 69 73 20 61 74 20 45 4f 46 20  If p1 is at EOF 
14460 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32  */.    iRes = i2
14470 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32  ;.  }else if( p2
14480 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20  ->pLeaf==0 ){   
14490 20 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74    /* If p2 is at
144a0 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73   EOF */.    iRes
144b0 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = i1;.  }else{.
144c0 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74      int res = ft
144d0 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
144e0 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e  &p1->term, &p2->
144f0 74 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  term);.    if( r
14500 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  es==0 ){.      a
14510 73 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a  ssert( i2>i1 );.
14520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32        assert( i2
14530 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65  !=0 );.      pRe
14540 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a  s->bTermEq = 1;.
14550 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52        if( p1->iR
14560 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64  owid==p2->iRowid
14570 20 29 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e   ){.        p1->
14580 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b  bDel = p2->bDel;
14590 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
145a0 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i2;.      }.    
145b0 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52    res = ((p1->iR
145c0 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69  owid > p2->iRowi
145d0 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29  d)==pIter->bRev)
145e0 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20   ? -1 : +1;.    
145f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65  }.    assert( re
14600 73 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  s!=0 );.    if( 
14610 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  res<0 ){.      i
14620 52 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65  Res = i1;.    }e
14630 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20  lse{.      iRes 
14640 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = i2;.    }.  }.
14650 0a 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20  .  pRes->iFirst 
14660 3d 20 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72  = (u16)iRes;.  r
14670 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
14680 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69  * Move the seg-i
14690 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
146a0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
146b0 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
146c0 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49   iLeafPgno..** I
146d0 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66  t is an error if
146e0 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20   leaf iLeafPgno 
146f0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
14700 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  r contains no ro
14710 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wids..*/.static 
14720 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
14730 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35  GotoPage(.  Fts5
14740 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
14750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14760 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
14770 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
14780 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
14790 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
147a0 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
147b0 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
147c0 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  o.){.  assert( i
147d0 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
147e0 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
147f0 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  if( iLeafPgno>pI
14800 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c  ter->pSeg->pgnoL
14810 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ast ){.    p->rc
14820 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
14830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
14840 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
14850 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b  ter->pNextLeaf);
14860 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78  .    pIter->pNex
14870 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  tLeaf = 0;.    p
14880 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
14890 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20  = iLeafPgno-1;. 
148a0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
148b0 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
148c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
148d0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
148e0 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  | pIter->iLeafPg
148f0 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b  no==iLeafPgno );
14900 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
14910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14920 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
14930 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65      u8 *a = pIte
14940 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
14950 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72     int n = pIter
14960 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  ->pLeaf->szLeaf;
14970 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66  ..      iOff = f
14980 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
14990 64 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61  dOff(pIter->pLea
149a0 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f  f);.      if( iO
149b0 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20  ff<4 || iOff>=n 
149c0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
149d0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
149e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
149f0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
14a00 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
14a10 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
14a20 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
14a30 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
14a40 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
14a50 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
14a60 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
14a70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
14a80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14a90 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
14aa0 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
14ab0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14ac0 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73  ment until it is
14ad0 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20   at or .** past 
14ae0 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67  rowid iFrom. Reg
14af0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
14b00 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74  alue of iFrom, t
14b10 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a  he iterator is.*
14b20 2a 20 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65  * always advance
14b30 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  d at least once.
14b40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14b50 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46  fts5SegIterNextF
14b60 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
14b70 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14b80 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
14b90 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
14ba0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
14bb0 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
14bc0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
14bd0 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
14be0 36 34 20 69 4d 61 74 63 68 20 20 20 20 20 20 20  64 iMatch       
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14c00 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74  * Advance iterat
14c10 6f 72 20 61 74 20 6c 65 61 73 74 20 74 68 69 73  or at least this
14c20 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   far */.){.  int
14c30 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e   bRev = (pIter->
14c40 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
14c50 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20  ITER_REVERSE);. 
14c60 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
14c70 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  pDlidx = pIter->
14c80 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c  pDlidx;.  int iL
14c90 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
14ca0 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  >iLeafPgno;.  in
14cb0 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20  t bMove = 1;..  
14cc0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
14cd0 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
14ce0 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20  TER_ONETERM );. 
14cf0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14d00 70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65  pDlidx );.  asse
14d10 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  rt( pIter->pLeaf
14d20 20 29 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d   );..  if( bRev=
14d30 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
14d40 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45   !fts5DlidxIterE
14d50 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26  of(p, pDlidx) &&
14d60 20 69 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64   iMatch>fts5Dlid
14d70 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
14d80 78 29 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61  x) ){.      iLea
14d90 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64  fPgno = fts5Dlid
14da0 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
14db0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
14dc0 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44  dxIterNext(p, pD
14dd0 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lidx);.    }.   
14de0 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61   assert_nc( iLea
14df0 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c  fPgno>=pIter->iL
14e00 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63  eafPgno || p->rc
14e10 20 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61   );.    if( iLea
14e20 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65  fPgno>pIter->iLe
14e30 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
14e40 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50  fts5SegIterGotoP
14e50 61 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  age(p, pIter, iL
14e60 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  eafPgno);.      
14e70 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  bMove = 0;.    }
14e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14e90 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65  sert( pIter->pNe
14ea0 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  xtLeaf==0 );.   
14eb0 20 61 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c   assert( iMatch<
14ec0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b  pIter->iRowid );
14ed0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73  .    while( !fts
14ee0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
14ef0 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74   pDlidx) && iMat
14f00 63 68 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72  ch<fts5DlidxIter
14f10 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b  Rowid(pDlidx) ){
14f20 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
14f30 49 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69  IterPrev(p, pDli
14f40 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dx);.    }.    i
14f50 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44  LeafPgno = fts5D
14f60 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
14f70 69 64 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  idx);..    asser
14f80 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  t( fts5DlidxIter
14f90 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c  Eof(p, pDlidx) |
14fa0 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74  | iLeafPgno<=pIt
14fb0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b  er->iLeafPgno );
14fc0 0a 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ..    if( iLeafP
14fd0 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno<pIter->iLeaf
14fe0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49  Pgno ){.      pI
14ff0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
15000 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20   iLeafPgno+1;.  
15010 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
15020 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c  everseNewPage(p,
15030 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62   pIter);.      b
15040 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
15050 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69    }..  do{.    i
15060 66 28 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72  f( bMove && p->r
15070 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
15080 49 74 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70  Iter->xNext(p, p
15090 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Iter, 0);.    if
150a0 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
150b0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
150c0 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49  f( bRev==0 && pI
150d0 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61  ter->iRowid>=iMa
150e0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
150f0 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26 20   if( bRev!=0 && 
15100 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69  pIter->iRowid<=i
15110 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
15120 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20     bMove = 1;.  
15130 7d 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53  }while( p->rc==S
15140 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a  QLITE_OK );.}...
15150 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69  /*.** Free the i
15160 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
15170 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
15180 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
15190 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
151a0 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46  5MultiIterFree(F
151b0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
151c0 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
151d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
151e0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
151f0 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
15200 20 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c     fts5SegIterCl
15210 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67  ear(&pIter->aSeg
15220 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
15230 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
15240 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72  ease(pIter->pStr
15250 75 63 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75  uct);.    fts5Bu
15260 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
15270 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73  >poslist);.    s
15280 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
15290 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
152a0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
152b0 49 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20  IterAdvanced(.  
152c0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
152f0 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
15300 6e 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20  n */.  Fts5Iter 
15310 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
15320 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
15330 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69  or to update aFi
15340 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  rst[] array for 
15350 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65  */.  int iChange
15360 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
15370 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
15380 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75   sub-iterator ju
15390 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20  st advanced */. 
153a0 20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20   int iMinset    
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72   /* Minimum entr
153d0 79 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f  y in aFirst[] to
153e0 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   set */.){.  int
153f0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74   i;.  for(i=(pIt
15400 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65  er->nSeg+iChange
15410 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74  d)/2; i>=iMinset
15420 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
15430 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  E_OK; i=i/2){.  
15440 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69    int iEq;.    i
15450 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75  f( (iEq = fts5Mu
15460 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
15470 28 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20  (pIter, i)) ){. 
15480 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
15490 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
154a0 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20  >aSeg[iEq];.    
154b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
154c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
154d0 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28      pSeg->xNext(
154e0 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20  p, pSeg, 0);.   
154f0 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53     i = pIter->nS
15500 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a  eg + iEq;.    }.
15510 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62    }.}../*.** Sub
15520 2d 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67  -iterator iChang
15530 65 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70  ed of iterator p
15540 49 74 65 72 20 68 61 73 20 6a 75 73 74 20 62 65  Iter has just be
15550 65 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20  en advanced. It 
15560 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20  still.** points 
15570 74 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d  to the same term
15580 20 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61   though - just a
15590 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64   different rowid
155a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
155b0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  ** attempts to u
155c0 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  pdate the conten
155d0 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d  ts of the pIter-
155e0 3e 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64  >aFirst[] accord
155f0 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20  ingly..** If it 
15600 64 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73 66  does so successf
15610 75 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72  ully, 0 is retur
15620 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31  ned. Otherwise 1
15630 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a  ..**.** If non-z
15640 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
15650 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   the caller shou
15660 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74  ld call fts5Mult
15670 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a  iIterAdvanced().
15680 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74  ** on the iterat
15690 6f 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74  or instead. That
156a0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
156b0 68 65 20 73 61 6d 65 20 61 73 20 74 68 69 73 20  he same as this 
156c0 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74  one, except.** t
156d0 68 61 74 20 69 74 20 64 65 61 6c 73 20 77 69 74  hat it deals wit
156e0 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74  h more complicat
156f0 65 64 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c  ed cases as well
15700 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
15710 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
15720 76 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74  vanceRowid(.  Ft
15730 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  s5Iter *pIter,  
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15750 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64   Iterator to upd
15760 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72  ate aFirst[] arr
15770 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ay for */.  int 
15780 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20  iChanged,       
15790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
157a0 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72  ndex of sub-iter
157b0 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63  ator just advanc
157c0 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ed */.  Fts5SegI
157d0 74 65 72 20 2a 2a 70 70 46 69 72 73 74 0a 29 7b  ter **ppFirst.){
157e0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
157f0 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61  pNew = &pIter->a
15800 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a  Seg[iChanged];..
15810 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
15820 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74  id==pIter->iSwit
15830 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70  chRowid.   || (p
15840 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65  New->iRowid<pIte
15850 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29  r->iSwitchRowid)
15860 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20  ==pIter->bRev.  
15870 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
15880 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15890 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  Other = &pIter->
158a0 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20  aSeg[iChanged ^ 
158b0 30 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74  0x0001];.    pIt
158c0 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
158d0 20 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f   = pIter->bRev ?
158e0 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
158f0 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  : LARGEST_INT64;
15900 0a 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65  .    for(i=(pIte
15910 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64  r->nSeg+iChanged
15920 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a  )/2; 1; i=i/2){.
15930 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
15940 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
15950 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20  ->aFirst[i];..  
15960 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
15970 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20  ->pLeaf );.     
15980 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
15990 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74  TermEq==0 || pOt
159a0 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20  her->pLeaf );.. 
159b0 20 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62       if( pRes->b
159c0 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20  TermEq ){.      
159d0 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
159e0 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77  id==pOther->iRow
159f0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
15a00 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
15a10 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74    }else if( (pOt
15a20 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77  her->iRowid>pNew
15a30 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
15a40 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
15a50 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74      pIter->iSwit
15a60 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72  chRowid = pOther
15a70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  ->iRowid;.      
15a80 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65      pNew = pOthe
15a90 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
15aa0 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52   if( (pOther->iR
15ab0 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69  owid>pIter->iSwi
15ac0 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  tchRowid)==pIter
15ad0 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
15ae0 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74      pIter->iSwit
15af0 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72  chRowid = pOther
15b00 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  ->iRowid;.      
15b10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15b20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d    pRes->iFirst =
15b30 20 28 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49   (u16)(pNew - pI
15b40 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20  ter->aSeg);.    
15b50 20 20 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65    if( i==1 ) bre
15b60 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65  ak;..      pOthe
15b70 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
15b80 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
15b90 69 20 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72  i ^ 0x0001].iFir
15ba0 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st ];.    }.  }.
15bb0 0a 20 20 2a 70 70 46 69 72 73 74 20 3d 20 70 4e  .  *ppFirst = pN
15bc0 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ew;.  return 0;.
15bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
15be0 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72   pIter->bEof var
15bf0 69 61 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74  iable based on t
15c00 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
15c10 73 75 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a  sub-iterators..*
15c20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
15c30 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
15c40 66 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  f(Fts5Iter *pIte
15c50 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  r){.  Fts5SegIte
15c60 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
15c70 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
15c80 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
15c90 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  ];.  pIter->base
15ca0 2e 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c  .bEof = pSeg->pL
15cb0 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d  eaf==0;.  pIter-
15cc0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
15cd0 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a  pSeg->iRowid;.}.
15ce0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
15cf0 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
15d00 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a  next entry. .**.
15d10 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
15d20 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
15d30 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
15d40 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74  Fts5Index.rc. It
15d50 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73   is not .** cons
15d60 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
15d70 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
15d80 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20  reaches EOF, or 
15d90 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
15da0 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e   at .** EOF when
15db0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
15dc0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
15dd0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
15de0 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  tiIterNext(.  Ft
15df0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
15e00 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a  ts5Iter *pIter,.
15e10 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20    int bFrom,    
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e30 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67    /* True if arg
15e40 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76  ument iFrom is v
15e50 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46  alid */.  i64 iF
15e60 72 6f 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  rom             
15e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76            /* Adv
15e80 61 6e 63 65 20 61 74 20 6c 65 61 73 74 20 61 73  ance at least as
15e90 20 66 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a   far as this */.
15ea0 29 7b 0a 20 20 69 6e 74 20 62 55 73 65 46 72 6f  ){.  int bUseFro
15eb0 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 61 73 73  m = bFrom;.  ass
15ec0 65 72 74 28 20 70 49 74 65 72 2d 3e 62 61 73 65  ert( pIter->base
15ed0 2e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 77 68  .bEof==0 );.  wh
15ee0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
15ef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
15f00 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
15f10 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15f20 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54  t;.    int bNewT
15f30 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  erm = 0;.    Fts
15f40 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
15f50 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46   &pIter->aSeg[iF
15f60 69 72 73 74 5d 3b 0a 20 20 20 20 61 73 73 65 72  irst];.    asser
15f70 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
15f80 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 62  _OK );.    if( b
15f90 55 73 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d  UseFrom && pSeg-
15fa0 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  >pDlidx ){.     
15fb0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
15fc0 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46  From(p, pSeg, iF
15fd0 72 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rom);.    }else{
15fe0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65  .      pSeg->xNe
15ff0 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65  xt(p, pSeg, &bNe
16000 77 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  wTerm);.    }.. 
16010 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
16020 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72  af==0 || bNewTer
16030 6d 20 0a 20 20 20 20 20 7c 7c 20 66 74 73 35 4d  m .     || fts5M
16040 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52  ultiIterAdvanceR
16050 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72  owid(pIter, iFir
16060 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 29  st, &pSeg).    )
16070 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  {.      fts5Mult
16080 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c  iIterAdvanced(p,
16090 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20   pIter, iFirst, 
160a0 31 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  1);.      fts5Mu
160b0 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49  ltiIterSetEof(pI
160c0 74 65 72 29 3b 0a 20 20 20 20 20 20 70 53 65 67  ter);.      pSeg
160d0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
160e0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
160f0 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  .iFirst];.      
16100 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
16110 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
16120 20 7d 0a 0a 20 20 20 20 66 74 73 35 41 73 73 65   }..    fts5Asse
16130 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
16140 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
16150 61 73 73 65 72 74 28 20 70 53 65 67 3d 3d 26 70  assert( pSeg==&p
16160 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
16170 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
16180 73 74 5d 20 26 26 20 70 53 65 67 2d 3e 70 4c 65  st] && pSeg->pLe
16190 61 66 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  af );.    if( pI
161a0 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 3d  ter->bSkipEmpty=
161b0 3d 30 20 7c 7c 20 70 53 65 67 2d 3e 6e 50 6f 73  =0 || pSeg->nPos
161c0 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
161d0 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 49 74  >xSetOutputs(pIt
161e0 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  er, pSeg);.     
161f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
16200 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b     bUseFrom = 0;
16210 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
16220 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
16230 72 4e 65 78 74 32 28 0a 20 20 46 74 73 35 49 6e  rNext2(.  Fts5In
16240 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
16250 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e  ter *pIter,.  in
16260 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16280 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 2a 6d   OUT: True if *m
16290 69 67 68 74 2a 20 62 65 20 6e 65 77 20 74 65 72  ight* be new ter
162a0 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  m */.){.  assert
162b0 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
162c0 70 74 79 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pty );.  if( p->
162d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
162e0 0a 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20  .    *pbNewTerm 
162f0 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  = 0;.    do{.   
16300 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20     int iFirst = 
16310 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
16320 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 46  .iFirst;.      F
16330 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
16340 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
16350 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69  iFirst];.      i
16360 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b  nt bNewTerm = 0;
16370 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
16380 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16390 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   );.      pSeg->
163a0 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26  xNext(p, pSeg, &
163b0 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20  bNewTerm);.     
163c0 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
163d0 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20  ==0 || bNewTerm 
163e0 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d  .       || fts5M
163f0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52  ultiIterAdvanceR
16400 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72  owid(pIter, iFir
16410 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 20  st, &pSeg).     
16420 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
16430 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
16440 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
16450 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
16460 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
16470 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20  Eof(pIter);.    
16480 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d      *pbNewTerm =
16490 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
164a0 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74    fts5AssertMult
164b0 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49  iIterSetup(p, pI
164c0 74 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c  ter);..    }whil
164d0 65 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  e( fts5MultiIter
164e0 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72  IsEmpty(p, pIter
164f0 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ) );.  }.}..stat
16500 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
16510 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28  SetOutputs_Noop(
16520 46 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65  Fts5Iter *pUnuse
16530 64 31 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  d1, Fts5SegIter 
16540 2a 70 55 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e  *pUnused2){.  UN
16550 55 53 45 44 5f 50 41 52 41 4d 32 28 70 55 6e 75  USED_PARAM2(pUnu
16560 73 65 64 31 2c 20 70 55 6e 75 73 65 64 32 29 3b  sed1, pUnused2);
16570 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49  .}..static Fts5I
16580 74 65 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74  ter *fts5MultiIt
16590 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49  erAlloc(.  Fts5I
165a0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
165b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
165c0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
165d0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
165e0 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20    int nSeg.){.  
165f0 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a  Fts5Iter *pNew;.
16600 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20    int nSlot;    
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16620 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77    /* Power of tw
16630 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20  o >= nSeg */..  
16640 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c  for(nSlot=2; nSl
16650 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e  ot<nSeg; nSlot=n
16660 53 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20  Slot*2);.  pNew 
16670 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  = fts5IdxMalloc(
16680 70 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  p, .      sizeof
16690 28 46 74 73 35 49 74 65 72 29 20 2b 20 20 20 20  (Fts5Iter) +    
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
166b0 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   pNew */.      s
166c0 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65  izeof(Fts5SegIte
166d0 72 29 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b  r) * (nSlot-1) +
166e0 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67     /* pNew->aSeg
166f0 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  [] */.      size
16700 6f 66 28 46 74 73 35 43 52 65 73 75 6c 74 29 20  of(Fts5CResult) 
16710 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20  * nSlot         
16720 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b  /* pNew->aFirst[
16730 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  ] */.  );.  if( 
16740 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77  pNew ){.    pNew
16750 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a  ->nSeg = nSlot;.
16760 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
16770 20 3d 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a   = (Fts5CResult*
16780 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c  )&pNew->aSeg[nSl
16790 6f 74 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ot];.    pNew->p
167a0 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 70  Index = p;.    p
167b0 4e 65 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  New->xSetOutputs
167c0 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
167d0 74 70 75 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a  tputs_Noop;.  }.
167e0 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
167f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16800 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  s5PoslistCallbac
16810 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
16820 70 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64  pUnused, .  void
16830 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63   *pContext, .  c
16840 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
16850 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
16860 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
16870 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  nused);.  assert
16880 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29  _nc( nChunk>=0 )
16890 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30  ;.  if( nChunk>0
168a0 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
168b0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
168c0 28 28 46 74 73 35 42 75 66 66 65 72 2a 29 70 43  ((Fts5Buffer*)pC
168d0 6f 6e 74 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20  ontext, pChunk, 
168e0 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  nChunk);.  }.}..
168f0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
16900 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16910 78 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  x PoslistCallbac
16920 6b 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73  kCtx;.struct Pos
16930 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
16940 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  {.  Fts5Buffer *
16950 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  pBuf;           
16960 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
16970 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
16980 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
16990 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  olset;          
169a0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
169b0 74 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f  tches to this co
169c0 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53  lumn */.  int eS
169d0 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
169e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
169f0 20 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79   above */.};..ty
16a00 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73  pedef struct Pos
16a10 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 50  listOffsetsCtx P
16a20 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
16a30 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  ;.struct Poslist
16a40 4f 66 66 73 65 74 73 43 74 78 20 7b 0a 20 20 46  OffsetsCtx {.  F
16a50 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b  ts5Buffer *pBuf;
16a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16a70 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
16a80 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73   buffer */.  Fts
16a90 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
16aa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16ab0 52 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73  Restrict matches
16ac0 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   to this column 
16ad0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 61 64 3b 0a  */.  int iRead;.
16ae0 20 20 69 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b    int iWrite;.};
16af0 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61  ../*.** TODO: Ma
16b00 6b 65 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66  ke this more eff
16b10 69 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69  icient!.*/.stati
16b20 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43  c int fts5IndexC
16b30 6f 6c 73 65 74 54 65 73 74 28 46 74 73 35 43 6f  olsetTest(Fts5Co
16b40 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69  lset *pColset, i
16b50 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt iCol){.  int 
16b60 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
16b70 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69  pColset->nCol; i
16b80 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  ++){.    if( pCo
16b90 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d  lset->aiCol[i]==
16ba0 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b  iCol ) return 1;
16bb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
16bc0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16bd0 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65  fts5PoslistOffse
16be0 74 73 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  tsCallback(.  Ft
16bf0 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64  s5Index *pUnused
16c00 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  , .  void *pCont
16c10 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ext, .  const u8
16c20 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
16c30 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73  hunk.){.  Poslis
16c40 74 4f 66 66 73 65 74 73 43 74 78 20 2a 70 43 74  tOffsetsCtx *pCt
16c50 78 20 3d 20 28 50 6f 73 6c 69 73 74 4f 66 66 73  x = (PoslistOffs
16c60 65 74 73 43 74 78 2a 29 70 43 6f 6e 74 65 78 74  etsCtx*)pContext
16c70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16c80 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73  (pUnused);.  ass
16c90 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
16ca0 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
16cb0 6b 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  k>0 ){.    int i
16cc0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
16cd0 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20   i<nChunk ){.   
16ce0 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20     int iVal;.   
16cf0 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
16d00 61 72 69 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b  arint32(&pChunk[
16d10 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20  i], iVal);.     
16d20 20 69 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69   iVal += pCtx->i
16d30 52 65 61 64 20 2d 20 32 3b 0a 20 20 20 20 20 20  Read - 2;.      
16d40 70 43 74 78 2d 3e 69 52 65 61 64 20 3d 20 69 56  pCtx->iRead = iV
16d50 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  al;.      if( ft
16d60 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
16d70 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c  t(pCtx->pColset,
16d80 20 69 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20   iVal) ){.      
16d90 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
16da0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74  AppendVarint(pCt
16db0 78 2d 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b 20  x->pBuf, iVal + 
16dc0 32 20 2d 20 70 43 74 78 2d 3e 69 57 72 69 74 65  2 - pCtx->iWrite
16dd0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  );.        pCtx-
16de0 3e 69 57 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a  >iWrite = iVal;.
16df0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16e00 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
16e10 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74   fts5PoslistFilt
16e20 65 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  erCallback(.  Ft
16e30 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64  s5Index *pUnused
16e40 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65  ,.  void *pConte
16e50 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  xt, .  const u8 
16e60 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
16e70 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74  unk.){.  Poslist
16e80 43 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74  CallbackCtx *pCt
16e90 78 20 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c  x = (PoslistCall
16ea0 62 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78  backCtx*)pContex
16eb0 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  t;.  UNUSED_PARA
16ec0 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73  M(pUnused);.  as
16ed0 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e  sert_nc( nChunk>
16ee0 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75  =0 );.  if( nChu
16ef0 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  nk>0 ){.    /* S
16f00 65 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f  earch through to
16f10 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
16f20 76 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75  varint with valu
16f30 65 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65  e 1. This is the
16f40 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  .    ** start of
16f50 20 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e   the next column
16f60 73 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69  s hits. */.    i
16f70 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e  nt i = 0;.    in
16f80 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20  t iStart = 0;.. 
16f90 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
16fa0 61 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ate==2 ){.      
16fb0 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
16fc0 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
16fd0 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69  t32(pChunk, i, i
16fe0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
16ff0 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
17000 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
17010 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  t, iCol) ){.    
17020 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
17030 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74   = 1;.        ft
17040 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
17050 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70  ndVarint(pCtx->p
17060 42 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Buf, 1);.      }
17070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
17080 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a  tx->eState = 0;.
17090 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
170a0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68     do {.      wh
170b0 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26  ile( i<nChunk &&
170c0 20 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31   pChunk[i]!=0x01
170d0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
170e0 65 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30  e( pChunk[i] & 0
170f0 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  x80 ) i++;.     
17100 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
17110 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
17120 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
17130 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
17140 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d  AppendBlob(pCtx-
17150 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69  >pBuf, &pChunk[i
17160 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74  Start], i-iStart
17170 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17180 20 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b   if( i<nChunk ){
17190 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
171a0 6c 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  l;.        iStar
171b0 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69  t = i;.        i
171c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
171d0 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20  i>=nChunk ){.   
171e0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
171f0 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
17200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17210 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
17220 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c  int32(pChunk, i,
17230 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
17240 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
17250 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74   fts5IndexColset
17260 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73  Test(pCtx->pCols
17270 65 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  et, iCol);.     
17280 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
17290 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
172a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
172b0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43  afeAppendBlob(pC
172c0 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e  tx->pBuf, &pChun
172d0 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74  k[iStart], i-iSt
172e0 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  art);.          
172f0 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20    iStart = i;.  
17300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17310 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17320 7d 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b  }while( i<nChunk
17330 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
17340 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
17350 49 74 65 72 61 74 65 28 0a 20 20 46 74 73 35 49  Iterate(.  Fts5I
17360 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
17370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17380 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
17390 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
173a0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
173b0 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68  /* Poslist of th
173c0 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
173d0 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e   /* Context poin
17400 74 65 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63  ter for xChunk c
17410 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69  allback */.  voi
17420 64 20 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35  d (*xChunk)(Fts5
17430 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63  Index*, void*, c
17440 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29  onst u8*, int).)
17450 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70  {.  int nRem = p
17460 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20  Seg->nPos;      
17470 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17480 20 62 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20   bytes still to 
17490 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  come */.  Fts5Da
174a0 74 61 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20  ta *pData = 0;. 
174b0 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70   u8 *pChunk = &p
174c0 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
174d0 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
174e0 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d  ;.  int nChunk =
174f0 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d   MIN(nRem, pSeg-
17500 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d  >pLeaf->szLeaf -
17510 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
17520 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20  et);.  int pgno 
17530 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e  = pSeg->iLeafPgn
17540 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76  o;.  int pgnoSav
17550 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  e = 0;..  /* Thi
17560 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
17570 6e 6f 74 6d 77 6f 72 6b 20 77 69 74 68 20 64 65  notmwork with de
17580 74 61 69 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61  tail=none databa
17590 73 65 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ses. */.  assert
175a0 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
175b0 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
175c0 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66  IL_NONE );..  if
175d0 28 20 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26  ( (pSeg->flags &
175e0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
175f0 56 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  VERSE)==0 ){.   
17600 20 70 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f   pgnoSave = pgno
17610 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  +1;.  }..  while
17620 28 20 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e  ( 1 ){.    xChun
17630 6b 28 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e  k(p, pCtx, pChun
17640 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20  k, nChunk);.    
17650 6e 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a  nRem -= nChunk;.
17660 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
17670 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
17680 69 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20  if( nRem<=0 ){. 
17690 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
176a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e  }else{.      pgn
176b0 6f 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61  o++;.      pData
176c0 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64 28   = fts5LeafRead(
176d0 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
176e0 52 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67  ROWID(pSeg->pSeg
176f0 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29  ->iSegid, pgno))
17700 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
17710 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  a==0 ) break;.  
17720 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44      pChunk = &pD
17730 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20  ata->p[4];.     
17740 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52   nChunk = MIN(nR
17750 65 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61  em, pData->szLea
17760 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66  f - 4);.      if
17770 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65  ( pgno==pgnoSave
17780 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
17790 72 74 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c  rt( pSeg->pNextL
177a0 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  eaf==0 );.      
177b0 20 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61    pSeg->pNextLea
177c0 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20  f = pData;.     
177d0 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20     pData = 0;.  
177e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
177f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
17800 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
17810 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61  y points to a va
17820 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45  lid entry (not E
17830 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  OF). This.** fun
17840 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68  ction appends th
17850 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
17860 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72  data for the cur
17870 72 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  rent entry to.**
17880 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74   buffer pBuf. It
17890 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
178a0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73   copy of the pos
178b0 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a  ition-list size.
178c0 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61  ** field..*/.sta
178d0 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
178e0 69 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46  iterPoslist(.  F
178f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
17900 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
17910 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  ,.  Fts5Colset *
17920 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42  pColset,.  Fts5B
17930 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
17940 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66   if( 0==fts5Buff
17950 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70  erGrow(&p->rc, p
17960 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29  Buf, pSeg->nPos)
17970 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   ){.    if( pCol
17980 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
17990 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
179a0 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a  (p, pSeg, (void*
179b0 29 70 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69  )pBuf, fts5Posli
179c0 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  stCallback);.   
179d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
179e0 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
179f0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
17a00 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20  IL_FULL ){.     
17a10 20 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61     PoslistCallba
17a20 63 6b 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20  ckCtx sCtx;.    
17a30 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20      sCtx.pBuf = 
17a40 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43  pBuf;.        sC
17a50 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f  tx.pColset = pCo
17a60 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 73 43  lset;.        sC
17a70 74 78 2e 65 53 74 61 74 65 20 3d 20 66 74 73 35  tx.eState = fts5
17a80 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
17a90 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20  pColset, 0);.   
17aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 43 74       assert( sCt
17ab0 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73  x.eState==0 || s
17ac0 43 74 78 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b  Ctx.eState==1 );
17ad0 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75  .        fts5Chu
17ae0 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
17af0 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c  g, (void*)&sCtx,
17b00 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74   fts5PoslistFilt
17b10 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  erCallback);.   
17b20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17b30 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73    PoslistOffsets
17b40 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20  Ctx sCtx;.      
17b50 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20    memset(&sCtx, 
17b60 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29  0, sizeof(sCtx))
17b70 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
17b80 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20  Buf = pBuf;.    
17b90 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74      sCtx.pColset
17ba0 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20   = pColset;.    
17bb0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
17bc0 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76  rate(p, pSeg, (v
17bd0 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35  oid*)&sCtx, fts5
17be0 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61  PoslistOffsetsCa
17bf0 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d  llback);.      }
17c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
17c10 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d  .** IN/OUT param
17c20 65 74 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74  eter (*pa) point
17c30 73 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20  s to a position 
17c40 6c 69 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20  list n bytes in 
17c50 73 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20  size. If.** the 
17c60 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
17c70 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66  ntains entries f
17c80 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
17c90 74 68 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65  then (*pa) is se
17ca0 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f  t.** to point to
17cb0 20 74 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f   the sub-positio
17cc0 6e 2d 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20  n-list for that 
17cd0 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e  column and the n
17ce0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65  umber of.** byte
17cf0 73 20 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64  s in it returned
17d00 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67  . Or, if the arg
17d10 75 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  ument position l
17d20 69 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ist does not.** 
17d30 63 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72  contain any entr
17d40 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69  ies for column i
17d50 43 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  Col, return 0..*
17d60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
17d70 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
17d80 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70  (.  const u8 **p
17d90 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
17da0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
17db0 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73  ointer to poslis
17dc0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  t */.  int n,   
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69         /* IN: Si
17df0 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e  ze of poslist in
17e00 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
17e10 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
17e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17e30 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
17e40 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f   from poslist */
17e50 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65  .){.  int iCurre
17e60 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
17e70 20 20 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e        /* Anythin
17e80 67 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  g before the fir
17e90 73 74 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30  st 0x01 is col 0
17ea0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
17eb0 70 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74  p = *pa;.  const
17ec0 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e   u8 *pEnd = &p[n
17ed0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ];         /* On
17ee0 65 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20  e byte past end 
17ef0 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  of position list
17f00 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 43   */..  while( iC
17f10 6f 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b 0a 20  ol>iCurrent ){. 
17f20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f     /* Advance po
17f30 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74  inter p until it
17f40 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20   points to pEnd 
17f50 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20  or an 0x01 byte 
17f60 74 68 61 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e  that is.    ** n
17f70 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72  ot part of a var
17f80 69 6e 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 69  int. Note that i
17f90 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
17fa0 65 20 66 6f 72 20 61 20 6e 65 67 61 74 69 76 65  e for a negative
17fb0 0a 20 20 20 20 2a 2a 20 6f 72 20 65 78 74 72 65  .    ** or extre
17fc0 6d 65 6c 79 20 6c 61 72 67 65 20 76 61 72 69 6e  mely large varin
17fd0 74 20 74 6f 20 6f 63 63 75 72 20 77 69 74 68 69  t to occur withi
17fe0 6e 20 61 6e 20 75 6e 63 6f 72 72 75 70 74 65 64  n an uncorrupted
17ff0 20 70 6f 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a   position .    *
18000 2a 20 6c 69 73 74 2e 20 53 6f 20 74 68 65 20 6c  * list. So the l
18010 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68  ast byte of each
18020 20 76 61 72 69 6e 74 20 6d 61 79 20 62 65 20 61   varint may be a
18030 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
18040 20 63 6c 65 61 72 0a 20 20 20 20 2a 2a 20 30 78   clear.    ** 0x
18050 38 30 20 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20  80 bit.  */.    
18060 77 68 69 6c 65 28 20 2a 70 21 3d 30 78 30 31 20  while( *p!=0x01 
18070 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
18080 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20  *p++ & 0x80 );. 
18090 20 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64       if( p>=pEnd
180a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
180b0 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b   }.    *pa = p++
180c0 3b 0a 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d  ;.    iCurrent =
180d0 20 2a 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69   *p++;.    if( i
180e0 43 75 72 72 65 6e 74 20 26 20 30 78 38 30 20 29  Current & 0x80 )
180f0 7b 0a 20 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20  {.      p--;.   
18100 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56     p += fts5GetV
18110 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72  arint32(p, iCurr
18120 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
18130 20 20 69 66 28 20 69 43 6f 6c 21 3d 69 43 75 72    if( iCol!=iCur
18140 72 65 6e 74 20 29 20 72 65 74 75 72 6e 20 30 3b  rent ) return 0;
18150 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70  ..  /* Advance p
18160 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69  ointer p until i
18170 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64  t points to pEnd
18180 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65   or an 0x01 byte
18190 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f   that is.  ** no
181a0 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69  t part of a vari
181b0 6e 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  nt */.  while( p
181c0 3c 70 45 6e 64 20 26 26 20 2a 70 21 3d 30 78 30  <pEnd && *p!=0x0
181d0 31 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  1 ){.    while( 
181e0 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20  *p++ & 0x80 );. 
181f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 20 2d   }..  return p -
18200 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69   (*pa);.}..stati
18210 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
18220 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28 0a 20  ExtractColset(. 
18230 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73   int *pRc,.  Fts
18240 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
18250 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18260 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72  Colset to filter
18270 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   on */.  const u
18280 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f  8 *pPos, int nPo
18290 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69  s,       /* Posi
182a0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46  tion list */.  F
182b0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 20  ts5Buffer *pBuf 
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
182d0 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
182e0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  */.){.  if( *pRc
182f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18300 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 74     int i;.    ft
18310 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75  s5BufferZero(pBu
18320 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  f);.    for(i=0;
18330 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c   i<pColset->nCol
18340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
18350 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70  nst u8 *pSub = p
18360 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Pos;.      int n
18370 53 75 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45  Sub = fts5IndexE
18380 78 74 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c  xtractCol(&pSub,
18390 20 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e   nPos, pColset->
183a0 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  aiCol[i]);.     
183b0 20 69 66 28 20 6e 53 75 62 20 29 7b 0a 20 20 20   if( nSub ){.   
183c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
183d0 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70  ppendBlob(pRc, p
183e0 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62 29  Buf, nSub, pSub)
183f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18400 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65    }.}../*.** xSe
18410 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
18420 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  k used by detail
18430 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f  =none tables..*/
18440 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18450 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18460 4e 6f 6e 65 28 46 74 73 35 49 74 65 72 20 2a 70  None(Fts5Iter *p
18470 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
18480 72 20 2a 70 53 65 67 29 7b 0a 20 20 61 73 73 65  r *pSeg){.  asse
18490 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
184a0 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
184b0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
184c0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65 72  _NONE );.  pIter
184d0 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
184e0 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pSeg->iRowid;.  
184f0 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
18500 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a  a = pSeg->nPos;.
18510 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
18520 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
18530 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c  ed by detail=ful
18540 6c 20 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c  l and detail=col
18550 20 74 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a   tables when no.
18560 2a 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72  ** column filter
18570 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2e  s are specified.
18580 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18590 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
185a0 74 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35  ts_Nocolset(Fts5
185b0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
185c0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
185d0 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69  .  pIter->base.i
185e0 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
185f0 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62  owid;.  pIter->b
18600 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67  ase.nData = pSeg
18610 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72  ->nPos;..  asser
18620 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18630 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18640 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
18650 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
18660 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  ( pIter->pColset
18670 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
18680 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
18690 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67  pSeg->nPos<=pSeg
186a0 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
186b0 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61  ){.    /* All da
186c0 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20  ta is stored on 
186d0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
186e0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
186f0 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61  utput .    ** va
18700 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74  riables to point
18710 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
18720 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  f the page objec
18730 74 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d  t. */.    pIter-
18740 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 26 70  >base.pData = &p
18750 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
18760 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
18770 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
18780 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69  * The data is di
18790 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74  stributed over t
187a0 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  wo or more pages
187b0 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74  . Copy it into t
187c0 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74  he.    ** Fts5It
187d0 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65  er.poslist buffe
187e0 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74  r and then set t
187f0 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65  he output pointe
18800 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a  r to point.    *
18810 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  * to this buffer
18820 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  .  */.    fts5Bu
18830 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
18840 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
18850 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
18860 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
18870 20 70 53 65 67 2c 20 30 2c 20 26 70 49 74 65 72   pSeg, 0, &pIter
18880 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
18890 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
188a0 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
188b0 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st.p;.  }.}../*.
188c0 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
188d0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65  allback used whe
188e0 6e 20 74 68 65 20 46 74 73 35 43 6f 6c 73 65 74  n the Fts5Colset
188f0 20 6f 62 6a 65 63 74 20 68 61 73 20 6e 43 6f 6c   object has nCol
18900 3d 3d 30 20 28 6d 61 74 63 68 0a 2a 2a 20 61 67  ==0 (match.** ag
18910 61 69 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d 6e 73  ainst no columns
18920 20 61 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73 74 61   at all)..*/.sta
18930 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
18940 72 53 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f  rSetOutputs_Zero
18950 43 6f 6c 73 65 74 28 46 74 73 35 49 74 65 72 20  Colset(Fts5Iter 
18960 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
18970 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 55 4e  ter *pSeg){.  UN
18980 55 53 45 44 5f 50 41 52 41 4d 28 70 53 65 67 29  USED_PARAM(pSeg)
18990 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
189a0 6e 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nData = 0;.}../*
189b0 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
189c0 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
189d0 20 64 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65 6e   detail=col when
189e0 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75   there is a colu
189f0 6d 6e 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e 64  mn filter.** and
18a00 20 74 68 65 72 65 20 61 72 65 20 31 30 30 20 6f   there are 100 o
18a10 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  r more columns. 
18a20 41 6c 73 6f 20 63 61 6c 6c 65 64 20 61 73 20 61  Also called as a
18a30 20 66 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a   fallback from.*
18a40 2a 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  * fts5IterSetOut
18a50 70 75 74 73 5f 43 6f 6c 31 30 30 20 69 66 20 74  puts_Col100 if t
18a60 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73  he column-list s
18a70 70 61 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  pans more than o
18a80 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ne page..*/.stat
18a90 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
18aa0 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 46  SetOutputs_Col(F
18ab0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
18ac0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
18ad0 67 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72  g){.  fts5Buffer
18ae0 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
18af0 6c 69 73 74 29 3b 0a 20 20 66 74 73 35 53 65 67  list);.  fts5Seg
18b00 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65  iterPoslist(pIte
18b10 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c  r->pIndex, pSeg,
18b20 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2c   pIter->pColset,
18b30 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
18b40 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  );.  pIter->base
18b50 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
18b60 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d  iRowid;.  pIter-
18b70 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
18b80 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
18b90 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
18ba0 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
18bb0 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  list.n;.}../*.**
18bc0 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c   xSetOutputs cal
18bd0 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e 3a  lback used when:
18be0 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74 61   .**.**   * deta
18bf0 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74  il=col,.**   * t
18c00 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  here is a column
18c10 20 66 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a 20   filter, and.** 
18c20 20 20 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f    * the table co
18c30 6e 74 61 69 6e 73 20 31 30 30 20 6f 72 20 66 65  ntains 100 or fe
18c40 77 65 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a  wer columns. .**
18c50 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69  .** The last poi
18c60 6e 74 20 69 73 20 74 6f 20 65 6e 73 75 72 65 20  nt is to ensure 
18c70 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  all column numbe
18c80 72 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 73  rs are stored as
18c90 20 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74 65   .** single-byte
18ca0 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61   varints..*/.sta
18cb0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
18cc0 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31  rSetOutputs_Col1
18cd0 30 30 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  00(Fts5Iter *pIt
18ce0 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  er, Fts5SegIter 
18cf0 2a 70 53 65 67 29 7b 0a 0a 20 20 61 73 73 65 72  *pSeg){..  asser
18d00 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18d10 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18d20 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
18d30 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73 73  COLUMNS );.  ass
18d40 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c  ert( pIter->pCol
18d50 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  set );..  if( pS
18d60 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
18d70 70 53 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d  pSeg->nPos>pSeg-
18d80 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
18d90 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53 65  {.    fts5IterSe
18da0 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 70 49 74  tOutputs_Col(pIt
18db0 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65 6c  er, pSeg);.  }el
18dc0 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20  se{.    u8 *a = 
18dd0 28 75 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65 61  (u8*)&pSeg->pLea
18de0 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
18df0 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 75 38 20  Offset];.    u8 
18e00 2a 70 45 6e 64 20 3d 20 28 75 38 2a 29 26 61 5b  *pEnd = (u8*)&a[
18e10 70 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20  pSeg->nPos]; .  
18e20 20 20 69 6e 74 20 69 50 72 65 76 20 3d 20 30 3b    int iPrev = 0;
18e30 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20  .    int *aiCol 
18e40 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  = pIter->pColset
18e50 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  ->aiCol;.    int
18e60 20 2a 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61 69   *aiColEnd = &ai
18e70 43 6f 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c 73  Col[pIter->pCols
18e80 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20  et->nCol];..    
18e90 75 38 20 2a 61 4f 75 74 20 3d 20 70 49 74 65 72  u8 *aOut = pIter
18ea0 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
18eb0 20 69 6e 74 20 69 50 72 65 76 4f 75 74 20 3d 20   int iPrevOut = 
18ec0 30 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  0;..    pIter->b
18ed0 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65  ase.iRowid = pSe
18ee0 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20  g->iRowid;..    
18ef0 77 68 69 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b  while( a<pEnd ){
18f00 0a 20 20 20 20 20 20 69 50 72 65 76 20 2b 3d 20  .      iPrev += 
18f10 28 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b  (int)a++[0] - 2;
18f20 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 61  .      while( *a
18f30 69 43 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20 20  iCol<iPrev ){.  
18f40 20 20 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20        aiCol++;. 
18f50 20 20 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c         if( aiCol
18f60 3d 3d 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f 74  ==aiColEnd ) got
18f70 6f 20 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c  o setoutputs_col
18f80 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
18f90 20 20 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d 3d      if( *aiCol==
18fa0 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
18fb0 20 2a 61 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28   *aOut++ = (u8)(
18fc0 28 69 50 72 65 76 20 2d 20 69 50 72 65 76 4f 75  (iPrev - iPrevOu
18fd0 74 29 20 2b 20 32 29 3b 0a 20 20 20 20 20 20 20  t) + 2);.       
18fe0 20 69 50 72 65 76 4f 75 74 20 3d 20 69 50 72 65   iPrevOut = iPre
18ff0 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  v;.      }.    }
19000 0a 0a 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c  ..setoutputs_col
19010 5f 6f 75 74 3a 0a 20 20 20 20 70 49 74 65 72 2d  _out:.    pIter-
19020 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
19030 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
19040 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
19050 6e 44 61 74 61 20 3d 20 61 4f 75 74 20 2d 20 70  nData = aOut - p
19060 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
19070 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  .  }.}../*.** xS
19080 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
19090 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69  ck used by detai
190a0 6c 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68 65 72  l=full when ther
190b0 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69  e is a column fi
190c0 6c 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lter..*/.static 
190d0 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
190e0 4f 75 74 70 75 74 73 5f 46 75 6c 6c 28 46 74 73  Outputs_Full(Fts
190f0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
19100 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
19110 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  {.  Fts5Colset *
19120 70 43 6f 6c 73 65 74 20 3d 20 70 49 74 65 72 2d  pColset = pIter-
19130 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65  >pColset;.  pIte
19140 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d  r->base.iRowid =
19150 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a   pSeg->iRowid;..
19160 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
19170 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
19180 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
19190 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20  DETAIL_FULL );. 
191a0 20 61 73 73 65 72 74 28 20 70 43 6f 6c 73 65 74   assert( pColset
191b0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d   );..  if( pSeg-
191c0 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65  >iLeafOffset+pSe
191d0 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70  g->nPos<=pSeg->p
191e0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
191f0 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20      /* All data 
19200 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  is stored on the
19210 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50   current page. P
19220 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70  opulate the outp
19230 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  ut .    ** varia
19240 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e  bles to point in
19250 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
19260 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20  he page object. 
19270 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  */.    const u8 
19280 2a 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61  *a = &pSeg->pLea
19290 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
192a0 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28  Offset];.    if(
192b0 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d   pColset->nCol==
192c0 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  1 ){.      pIter
192d0 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 66  ->base.nData = f
192e0 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
192f0 6f 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f  ol(&a, pSeg->nPo
19300 73 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  s,pColset->aiCol
19310 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  [0]);.      pIte
19320 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
19330 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  a;.    }else{.  
19340 20 20 20 20 69 6e 74 20 2a 70 52 63 20 3d 20 26      int *pRc = &
19350 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
19360 63 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  c;.      fts5Buf
19370 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
19380 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  poslist);.      
19390 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74  fts5IndexExtract
193a0 43 6f 6c 73 65 74 28 70 52 63 2c 20 70 43 6f 6c  Colset(pRc, pCol
193b0 73 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e 50  set, a, pSeg->nP
193c0 6f 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c  os, &pIter->posl
193d0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ist);.      pIte
193e0 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
193f0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
19400 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
19410 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65  ase.nData = pIte
19420 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20  r->poslist.n;.  
19430 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
19440 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20   /* The data is 
19450 64 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72  distributed over
19460 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67   two or more pag
19470 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f  es. Copy it into
19480 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35   the.    ** Fts5
19490 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66  Iter.poslist buf
194a0 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74  fer and then set
194b0 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e   the output poin
194c0 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20  ter to point.   
194d0 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66   ** to this buff
194e0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35  er.  */.    fts5
194f0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
19500 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
19510 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
19520 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
19530 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74  x, pSeg, pColset
19540 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
19550 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  t);.    pIter->b
19560 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
19570 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
19580 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
19590 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
195a0 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73  list.n;.  }.}..s
195b0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
195c0 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 69  terSetOutputCb(i
195d0 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 49 74 65  nt *pRc, Fts5Ite
195e0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
195f0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
19600 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
19610 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 49  ig *pConfig = pI
19620 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f  ter->pIndex->pCo
19630 6e 66 69 67 3b 0a 20 20 20 20 69 66 28 20 70 43  nfig;.    if( pC
19640 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
19650 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
19660 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
19670 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66  >xSetOutputs = f
19680 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
19690 73 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20  s_None;.    }.. 
196a0 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65     else if( pIte
196b0 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b  r->pColset==0 ){
196c0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53  .      pIter->xS
196d0 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
196e0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
196f0 6f 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a  ocolset;.    }..
19700 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74      else if( pIt
19710 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  er->pColset->nCo
19720 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  l==0 ){.      pI
19730 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
19740 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
19750 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74  tputs_ZeroColset
19760 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73  ;.    }..    els
19770 65 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65  e if( pConfig->e
19780 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
19790 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  AIL_FULL ){.    
197a0 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74    pIter->xSetOut
197b0 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
197c0 65 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 3b 0a  etOutputs_Full;.
197d0 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 7b      }..    else{
197e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
197f0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
19800 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c  =FTS5_DETAIL_COL
19810 55 4d 4e 53 20 29 3b 0a 20 20 20 20 20 20 69 66  UMNS );.      if
19820 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c  ( pConfig->nCol<
19830 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
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 43 6f 6c 31 30 30 3b 0a  Outputs_Col100;.
19870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
19880 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 70 52  ts5BufferSize(pR
19890 63 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  c, &pIter->posli
198a0 73 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  st, pConfig->nCo
198b0 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
198c0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
198d0 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
198e0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
198f0 5f 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _Col;.      }.  
19900 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
19910 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
19920 20 46 74 73 35 49 74 65 72 20 6f 62 6a 65 63 74   Fts5Iter object
19930 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
19940 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75  object will be u
19950 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
19960 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73  hrough data in s
19970 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
19980 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69  ..** If iLevel i
19990 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20  s -ve, then all 
199a0 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d  data in all segm
199b0 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20  ents is merged. 
199c0 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a  Or, if iLevel.**
199d0 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61   is zero or grea
199e0 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74  ter, data from t
199f0 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e  he first nSegmen
19a00 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65  t segments on le
19a10 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73  vel iLevel.** is
19a20 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   merged..**.** T
19a30 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74  he iterator init
19a40 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ially points to 
19a50 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72  the first term/r
19a60 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68  owid entry in th
19a70 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64  e .** iterated d
19a80 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
19a90 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
19aa0 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65  rNew(.  Fts5Inde
19ab0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
19ac0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
19ad0 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
19ae0 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
19af0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
19b00 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f  truct,         /
19b10 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66 20 73  * Structure of s
19b20 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f  pecific index */
19b30 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b50 20 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f     /* FTS5INDEX_
19b60 51 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20  QUERY_XXX flags 
19b70 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
19b80 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
19b90 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74       /* Colset t
19ba0 6f 20 66 69 6c 74 65 72 20 6f 6e 20 28 6f 72 20  o filter on (or 
19bb0 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  NULL) */.  const
19bc0 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
19bd0 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
19be0 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
19bf0 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
19c00 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19c20 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
19c30 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
19c40 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
19c50 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
19c60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19c70 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
19c80 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
19c90 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a  */.  Fts5Iter **
19ca0 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
19cb0 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
19cc0 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
19cd0 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Seg = 0;        
19ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19cf0 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d  mber of segment-
19d00 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a  iters in use */.
19d10 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b    int iIter = 0;
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53    /* */.  int iS
19d40 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
19d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
19d60 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
19d70 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
19d80 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
19d90 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46  Level *pLvl;.  F
19da0 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  ts5Iter *pNew;..
19db0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
19dc0 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
19dd0 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
19de0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
19df0 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
19e00 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
19e10 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tor. */.  if( p-
19e20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19e30 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c  {.    if( iLevel
19e40 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
19e50 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
19e60 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
19e70 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
19e80 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
19e90 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75      nSeg = pStru
19ea0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
19eb0 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e      nSeg += (p->
19ec0 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a  pHash ? 1 : 0);.
19ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ee0 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72   nSeg = MIN(pStr
19ef0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
19f00 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65  el].nSeg, nSegme
19f10 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nt);.    }.  }. 
19f20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d   *ppOut = pNew =
19f30 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c   fts5MultiIterAl
19f40 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20  loc(p, nSeg);.  
19f50 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
19f60 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52  turn;.  pNew->bR
19f70 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20  ev = (0!=(flags 
19f80 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
19f90 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77  Y_DESC));.  pNew
19fa0 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 28  ->bSkipEmpty = (
19fb0 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35  0!=(flags & FTS5
19fc0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50  INDEX_QUERY_SKIP
19fd0 45 4d 50 54 59 29 29 3b 0a 20 20 70 4e 65 77 2d  EMPTY));.  pNew-
19fe0 3e 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  >pStruct = pStru
19ff0 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 43 6f 6c  ct;.  pNew->pCol
1a000 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20  set = pColset;. 
1a010 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1a020 66 28 70 53 74 72 75 63 74 29 3b 0a 20 20 69 66  f(pStruct);.  if
1a030 28 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  ( (flags & FTS5I
1a040 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54  NDEX_QUERY_NOOUT
1a050 50 55 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  PUT)==0 ){.    f
1a060 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
1a070 43 62 28 26 70 2d 3e 72 63 2c 20 70 4e 65 77 29  Cb(&p->rc, pNew)
1a080 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
1a090 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74  ialize each of t
1a0a0 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67  he component seg
1a0b0 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20  ment iterators. 
1a0c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
1a0d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a0e0 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
1a0f0 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
1a100 74 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20  tureLevel *pEnd 
1a110 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1a120 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  el[pStruct->nLev
1a130 65 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  el];.      if( p
1a140 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20  ->pHash ){.     
1a150 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d     /* Add a segm
1a160 65 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ent iterator for
1a170 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
1a180 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73  tents of the has
1a190 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
1a1a0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1a1b0 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
1a1c0 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20  aSeg[iIter++];. 
1a1d0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1a1e0 65 72 48 61 73 68 49 6e 69 74 28 70 2c 20 70 54  erHashInit(p, pT
1a1f0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
1a200 73 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  s, pIter);.     
1a210 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 76   }.      for(pLv
1a220 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  l=&pStruct->aLev
1a230 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64  el[0]; pLvl<pEnd
1a240 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; pLvl++){.     
1a250 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c     for(iSeg=pLvl
1a260 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  ->nSeg-1; iSeg>=
1a270 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
1a280 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
1a290 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
1a2a0 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69   = &pLvl->aSeg[i
1a2b0 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Seg];.          
1a2c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
1a2d0 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
1a2e0 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
1a2f0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1a300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a310 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
1a320 28 70 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  (p, pSeg, pIter)
1a330 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1a340 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e{.            f
1a350 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
1a360 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65  it(p, pTerm, nTe
1a370 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c  rm, flags, pSeg,
1a380 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
1a390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1a3a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1a3b0 7b 0a 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26  {.      pLvl = &
1a3c0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1a3d0 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 66  iLevel];.      f
1a3e0 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20  or(iSeg=nSeg-1; 
1a3f0 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29  iSeg>=0; iSeg--)
1a400 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
1a410 67 49 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c  gIterInit(p, &pL
1a420 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20  vl->aSeg[iSeg], 
1a430 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
1a440 72 2b 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r++]);.      }. 
1a450 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1a460 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a   iIter==nSeg );.
1a470 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1a480 20 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65   above was succe
1a490 73 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70  ssful, each comp
1a4a0 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  onent iterators 
1a4b0 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a  now points .  **
1a4c0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1a4d0 74 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65  try in its segme
1a4e0 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nt. In this case
1a4f0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
1a500 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61  .  ** aFirst[] a
1a510 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20  rray. Or, if an 
1a520 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
1a530 65 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65  ed, free the ite
1a540 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63  rator.  ** objec
1a550 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75  t and set the ou
1a560 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
1a570 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28   NULL.  */.  if(
1a580 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a590 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74  K ){.    for(iIt
1a5a0 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b  er=pNew->nSeg-1;
1a5b0 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d   iIter>0; iIter-
1a5c0 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45  -){.      int iE
1a5d0 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 45  q;.      if( (iE
1a5e0 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
1a5f0 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c  rDoCompare(pNew,
1a600 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20   iIter)) ){.    
1a610 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1a620 2a 70 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61  *pSeg = &pNew->a
1a630 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20  Seg[iEq];.      
1a640 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a650 49 54 45 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78  ITE_OK ) pSeg->x
1a660 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29  Next(p, pSeg, 0)
1a670 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
1a680 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
1a690 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49  p, pNew, iEq, iI
1a6a0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
1a6b0 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74    }.    fts5Mult
1a6c0 69 49 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77  iIterSetEof(pNew
1a6d0 29 3b 0a 20 20 20 20 66 74 73 35 41 73 73 65 72  );.    fts5Asser
1a6e0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
1a6f0 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69  p, pNew);..    i
1a700 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  f( pNew->bSkipEm
1a710 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69  pty && fts5Multi
1a720 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
1a730 4e 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74  New) ){.      ft
1a740 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
1a750 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  p, pNew, 0, 0);.
1a760 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e      }else if( pN
1a770 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30  ew->base.bEof==0
1a780 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ){.      Fts5Se
1a790 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1a7a0 4e 65 77 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e  New->aSeg[pNew->
1a7b0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1a7c0 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  ];.      pNew->x
1a7d0 53 65 74 4f 75 74 70 75 74 73 28 70 4e 65 77 2c  SetOutputs(pNew,
1a7e0 20 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 0a 20   pSeg);.    }.. 
1a7f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
1a800 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 4e  MultiIterFree(pN
1a810 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20  ew);.    *ppOut 
1a820 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1a830 2a 20 43 72 65 61 74 65 20 61 6e 20 46 74 73 35  * Create an Fts5
1a840 49 74 65 72 20 74 68 61 74 20 69 74 65 72 61 74  Iter that iterat
1a850 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 64  es through the d
1a860 6f 63 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a  oclist provided.
1a870 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
1a880 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
1a890 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
1a8a0 6c 74 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46  ltiIterNew2(.  F
1a8b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a8d0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
1a8e0 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
1a8f0 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
1a900 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
1a910 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74        /* Doclist
1a920 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1a930 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  ugh */.  int bDe
1a940 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
1a950 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a960 20 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20   for descending 
1a970 72 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20  rowid order */. 
1a980 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75   Fts5Iter **ppOu
1a990 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1a9a0 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
1a9b0 2f 0a 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20  /.){.  Fts5Iter 
1a9c0 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
1a9d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c  fts5MultiIterAll
1a9e0 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20  oc(p, 2);.  if( 
1a9f0 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35  pNew ){.    Fts5
1aa00 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
1aa10 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b   &pNew->aSeg[1];
1aa20 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61  ..    pIter->fla
1aa30 67 73 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45  gs = FTS5_SEGITE
1aa40 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
1aa50 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  f( pData->szLeaf
1aa60 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  >0 ){.      pIte
1aa70 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61  r->pLeaf = pData
1aa80 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
1aa90 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
1aaa0 35 47 65 74 56 61 72 69 6e 74 28 70 44 61 74 61  5GetVarint(pData
1aab0 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ->p, (u64*)&pIte
1aac0 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
1aad0 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
1aae0 6f 63 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e  oclist = pData->
1aaf0 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nn;.      pNew->
1ab00 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1ab10 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
1ab20 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20  bDesc ){.       
1ab30 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b   pNew->bRev = 1;
1ab40 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
1ab50 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
1ab60 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
1ab70 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1ab80 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
1ab90 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
1aba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1abb0 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
1abc0 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
1abd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1abe0 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Data = 0;.    }e
1abf0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
1ac00 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a  >base.bEof = 1;.
1ac10 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65      }.    fts5Se
1ac20 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
1ac30 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70  pIter);..    *pp
1ac40 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  Out = pNew;.  }.
1ac50 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
1ac60 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  se(pData);.}../*
1ac70 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1ac80 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
1ac90 69 73 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20  is at EOF or if 
1aca0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1acb0 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65  urred. .** False
1acc0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1acd0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
1ace0 6c 74 69 49 74 65 72 45 6f 66 28 46 74 73 35 49  ltiIterEof(Fts5I
1acf0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65  ndex *p, Fts5Ite
1ad00 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
1ad10 65 72 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20  ert( p->rc .    
1ad20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65    || (pIter->aSe
1ad30 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1ad40 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65  [1].iFirst ].pLe
1ad50 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62  af==0)==pIter->b
1ad60 61 73 65 2e 62 45 6f 66 20 0a 20 20 29 3b 0a 20  ase.bEof .  );. 
1ad70 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c   return (p->rc |
1ad80 7c 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45  | pIter->base.bE
1ad90 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  of);.}../*.** Re
1ada0 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f  turn the rowid o
1adb0 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  f the entry that
1adc0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75   the iterator cu
1add0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a  rrently points.*
1ade0 2a 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65  * to. If the ite
1adf0 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  rator points to 
1ae00 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66 75  EOF when this fu
1ae10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ae20 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
1ae30 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  are undefined..*
1ae40 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  /.static i64 fts
1ae50 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
1ae60 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
1ae70 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
1ae80 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
1ae90 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1aea0 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65   ].pLeaf );.  re
1aeb0 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67  turn pIter->aSeg
1aec0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
1aed0 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77  1].iFirst ].iRow
1aee0 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  id;.}../*.** Mov
1aef0 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  e the iterator t
1af00 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
1af10 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67   at or following
1af20 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74   iMatch..*/.stat
1af30 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
1af40 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20  iIterNextFrom(. 
1af50 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1af60 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
1af70 72 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68  r, .  i64 iMatch
1af80 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  .){.  while( 1 )
1af90 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
1afa0 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
1afb0 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
1afc0 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  , 1, iMatch);.  
1afd0 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
1afe0 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1aff0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52   ) break;.    iR
1b000 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
1b010 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
1b020 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
1b030 3e 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77  >bRev==0 && iRow
1b040 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id>=iMatch ) bre
1b050 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ak;.    if( pIte
1b060 72 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52  r->bRev!=0 && iR
1b070 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62  owid<=iMatch ) b
1b080 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  reak;.  }.}../*.
1b090 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1b0a0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
1b0b0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1b0c0 65 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77  erm associated w
1b0d0 69 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72  ith the .** entr
1b0e0 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  y that the itera
1b0f0 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  tor currently po
1b100 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
1b110 69 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73  ic const u8 *fts
1b120 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46  5MultiIterTerm(F
1b130 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
1b140 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35  int *pn){.  Fts5
1b150 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49  SegIter *p = &pI
1b160 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
1b170 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1b180 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d  st ];.  *pn = p-
1b190 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72  >term.n;.  retur
1b1a0 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a  n p->term.p;.}..
1b1b0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1b1c0 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20   new segment-id 
1b1d0 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
1b1e0 65 20 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e  e pStruct. The n
1b1f0 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64  ew segment.** id
1b200 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
1b210 20 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63   1 and 65335 inc
1b220 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74  lusive, and must
1b230 20 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79 20   not be used by 
1b240 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c  .** any currentl
1b250 79 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65  y existing segme
1b260 6e 74 2e 20 49 66 20 61 20 66 72 65 65 20 73 65  nt. If a free se
1b270 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20  gment id cannot 
1b280 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  be found,.** SQL
1b290 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75  ITE_FULL is retu
1b2a0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
1b2b0 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
1b2c0 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1b2d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1b2e0 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a   no-op. 0 is .**
1b2f0 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69   returned in thi
1b300 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
1b310 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61  c int fts5Alloca
1b320 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64 65  teSegid(Fts5Inde
1b330 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
1b340 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
1b350 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 30 3b   int iSegid = 0;
1b360 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
1b370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b380 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  if( pStruct->nSe
1b390 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f  gment>=FTS5_MAX_
1b3a0 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20  SEGMENT ){.     
1b3b0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1b3c0 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  FULL;.    }else{
1b3d0 0a 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 4d  .      /* FTS5_M
1b3e0 41 58 5f 53 45 47 4d 45 4e 54 20 69 73 20 63 75  AX_SEGMENT is cu
1b3f0 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
1b400 61 73 20 32 30 30 30 2e 20 53 6f 20 74 68 65 20  as 2000. So the 
1b410 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
1b420 2a 2a 20 61 72 72 61 79 20 69 73 20 36 33 20 65  ** array is 63 e
1b430 6c 65 6d 65 6e 74 73 2c 20 6f 72 20 32 35 32 20  lements, or 252 
1b440 62 79 74 65 73 2c 20 69 6e 20 73 69 7a 65 2e 20  bytes, in size. 
1b450 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 61 55   */.      u32 aU
1b460 73 65 64 5b 28 46 54 53 35 5f 4d 41 58 5f 53 45  sed[(FTS5_MAX_SE
1b470 47 4d 45 4e 54 2b 33 31 29 20 2f 20 33 32 5d 3b  GMENT+31) / 32];
1b480 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c  .      int iLvl,
1b490 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74   iSeg;.      int
1b4a0 20 69 3b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   i;.      u32 ma
1b4b0 73 6b 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  sk;.      memset
1b4c0 28 61 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f  (aUsed, 0, sizeo
1b4d0 66 28 61 55 73 65 64 29 29 3b 0a 20 20 20 20 20  f(aUsed));.     
1b4e0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1b4f0 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1b500 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1b510 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
1b520 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
1b530 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
1b540 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
1b550 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53      int iId = pS
1b560 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1b570 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl].aSeg[iSeg].i
1b580 53 65 67 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Segid;.         
1b590 20 69 66 28 20 69 49 64 3c 3d 46 54 53 35 5f 4d   if( iId<=FTS5_M
1b5a0 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
1b5b0 20 20 20 20 20 20 20 20 20 20 61 55 73 65 64 5b            aUsed[
1b5c0 28 69 49 64 2d 31 29 20 2f 20 33 32 5d 20 7c 3d  (iId-1) / 32] |=
1b5d0 20 28 75 33 32 29 31 20 3c 3c 20 28 28 69 49 64   (u32)1 << ((iId
1b5e0 2d 31 29 20 25 20 33 32 29 3b 0a 20 20 20 20 20  -1) % 32);.     
1b5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1b600 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1b610 66 6f 72 28 69 3d 30 3b 20 61 55 73 65 64 5b 69  for(i=0; aUsed[i
1b620 5d 3d 3d 30 78 46 46 46 46 46 46 46 46 3b 20 69  ]==0xFFFFFFFF; i
1b630 2b 2b 29 3b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++);.      mask 
1b640 3d 20 61 55 73 65 64 5b 69 5d 3b 0a 20 20 20 20  = aUsed[i];.    
1b650 20 20 66 6f 72 28 69 53 65 67 69 64 3d 30 3b 20    for(iSegid=0; 
1b660 6d 61 73 6b 20 26 20 28 28 75 33 32 29 31 20 3c  mask & ((u32)1 <
1b670 3c 20 69 53 65 67 69 64 29 3b 20 69 53 65 67 69  < iSegid); iSegi
1b680 64 2b 2b 29 3b 0a 20 20 20 20 20 20 69 53 65 67  d++);.      iSeg
1b690 69 64 20 2b 3d 20 31 20 2b 20 69 2a 33 32 3b 0a  id += 1 + i*32;.
1b6a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1b6b0 45 42 55 47 0a 20 20 20 20 20 20 66 6f 72 28 69  EBUG.      for(i
1b6c0 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
1b6d0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
1b6e0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l++){.        fo
1b6f0 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
1b700 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1b710 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
1b720 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
1b730 73 65 72 74 5f 6e 63 28 20 69 53 65 67 69 64 21  sert_nc( iSegid!
1b740 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  =pStruct->aLevel
1b750 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
1b760 5d 2e 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20  ].iSegid );.    
1b770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b780 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
1b790 53 65 67 69 64 3e 30 20 26 26 20 69 53 65 67 69  Segid>0 && iSegi
1b7a0 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  d<=FTS5_MAX_SEGM
1b7b0 45 4e 54 20 29 3b 0a 0a 20 20 20 20 20 20 7b 0a  ENT );..      {.
1b7c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b7d0 73 74 6d 74 20 2a 70 49 64 78 53 65 6c 65 63 74  stmt *pIdxSelect
1b7e0 20 3d 20 66 74 73 35 49 64 78 53 65 6c 65 63 74   = fts5IdxSelect
1b7f0 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 20  Stmt(p);.       
1b800 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1b810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b820 20 20 20 75 38 20 61 42 6c 6f 62 5b 32 5d 20 3d     u8 aBlob[2] =
1b830 20 7b 30 78 66 66 2c 20 30 78 66 66 7d 3b 0a 20   {0xff, 0xff};. 
1b840 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b850 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78 53 65  _bind_int(pIdxSe
1b860 6c 65 63 74 2c 20 31 2c 20 69 53 65 67 69 64 29  lect, 1, iSegid)
1b870 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1b880 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49  te3_bind_blob(pI
1b890 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 61 42 6c  dxSelect, 2, aBl
1b8a0 6f 62 2c 20 32 2c 20 53 51 4c 49 54 45 5f 53 54  ob, 2, SQLITE_ST
1b8b0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
1b8c0 20 61 73 73 65 72 74 5f 6e 63 28 20 73 71 6c 69   assert_nc( sqli
1b8d0 74 65 33 5f 73 74 65 70 28 70 49 64 78 53 65 6c  te3_step(pIdxSel
1b8e0 65 63 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ect)!=SQLITE_ROW
1b8f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
1b900 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
1b910 73 65 74 28 70 49 64 78 53 65 6c 65 63 74 29 3b  set(pIdxSelect);
1b920 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1b930 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 64  e3_bind_null(pId
1b940 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a 20 20 20  xSelect, 2);.   
1b950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1b960 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1b970 0a 20 20 72 65 74 75 72 6e 20 69 53 65 67 69 64  .  return iSegid
1b980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
1b990 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72  rd all data curr
1b9a0 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20  ently cached in 
1b9b0 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e  the hash-tables.
1b9c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b9d0 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
1b9e0 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a  Data(Fts5Index *
1b9f0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
1ba00 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65  >pHash || p->nPe
1ba10 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a  ndingData==0 );.
1ba20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29    if( p->pHash )
1ba30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1ba40 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48  5HashClear(p->pH
1ba50 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  ash);.    p->nPe
1ba60 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
1ba70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1ba80 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
1ba90 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79  he prefix, in by
1baa0 74 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72  tes, that buffer
1bab0 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e 67   .** (pNew/<leng
1bac0 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61  th-unknown>) sha
1bad0 72 65 73 20 77 69 74 68 20 62 75 66 66 65 72 20  res with buffer 
1bae0 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a  (pOld/nOld)..**.
1baf0 2a 2a 20 42 75 66 66 65 72 20 28 70 4e 65 77 2f  ** Buffer (pNew/
1bb00 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e  <length-unknown>
1bb10 29 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  ) is guaranteed 
1bb20 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 0a 2a  to be greater .*
1bb30 2a 20 74 68 61 6e 20 62 75 66 66 65 72 20 28 70  * than buffer (p
1bb40 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74  Old/nOld)..*/.st
1bb50 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 72 65  atic int fts5Pre
1bb60 66 69 78 43 6f 6d 70 72 65 73 73 28 69 6e 74 20  fixCompress(int 
1bb70 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nOld, const u8 *
1bb80 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pOld, const u8 *
1bb90 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pNew){.  int i;.
1bba0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
1bbb0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1bbc0 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69   pOld[i]!=pNew[i
1bbd0 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ] ) break;.  }. 
1bbe0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74   return i;.}..st
1bbf0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1bc00 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20  iteDlidxClear(. 
1bc10 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1bc20 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1bc30 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
1bc40 62 46 6c 75 73 68 20 20 20 20 20 20 20 20 20 20  bFlush          
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1bc60 66 20 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c  f true, write dl
1bc70 69 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29  idx to disk */.)
1bc80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
1bc90 65 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c  ert( bFlush==0 |
1bca0 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  | (pWriter->nDli
1bcb0 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  dx>0 && pWriter-
1bcc0 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
1bcd0 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  >0) );.  for(i=0
1bce0 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c  ; i<pWriter->nDl
1bcf0 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  idx; i++){.    F
1bd00 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
1bd10 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
1bd20 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20  r->aDlidx[i];.  
1bd30 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
1bd40 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  f.n==0 ) break;.
1bd50 20 20 20 20 69 66 28 20 62 46 6c 75 73 68 20 29      if( bFlush )
1bd60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bd70 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20  pDlidx->pgno!=0 
1bd80 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  );.      fts5Dat
1bd90 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20  aWrite(p, .     
1bda0 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
1bdb0 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
1bdc0 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78  Segid, i, pDlidx
1bdd0 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20  ->pgno),.       
1bde0 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
1bdf0 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a  , pDlidx->buf.n.
1be00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1be10 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1be20 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
1be30 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69  ->buf);.    pDli
1be40 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
1be50 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1be60 20 47 72 6f 77 20 74 68 65 20 70 57 72 69 74 65   Grow the pWrite
1be70 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61  r->aDlidx[] arra
1be80 79 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c  y to at least nL
1be90 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73  vl elements in s
1bea0 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20  ize..** Any new 
1beb0 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61  array elements a
1bec0 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65  re zeroed before
1bed0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1bee0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72  tatic int fts5Wr
1bef0 69 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20  iteDlidxGrow(.  
1bf00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
1bf10 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1bf20 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c  Writer,.  int nL
1bf30 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  vl.){.  if( p->r
1bf40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bf50 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e  nLvl>=pWriter->n
1bf60 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
1bf70 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
1bf80 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64  lidx = (Fts5Dlid
1bf90 78 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33  xWriter*)sqlite3
1bfa0 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
1bfb0 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
1bfc0 78 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  x, sizeof(Fts5Dl
1bfd0 69 64 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76  idxWriter) * nLv
1bfe0 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
1bff0 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20   aDlidx==0 ){.  
1c000 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1c010 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1c020 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1c030 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
1c040 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
1c050 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72   (nLvl - pWriter
1c060 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  ->nDlidx);.     
1c070 20 6d 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b   memset(&aDlidx[
1c080 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d  pWriter->nDlidx]
1c090 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
1c0a0 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69     pWriter->aDli
1c0b0 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20  dx = aDlidx;.   
1c0c0 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69     pWriter->nDli
1c0d0 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d  dx = nLvl;.    }
1c0e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
1c0f0 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  >rc;.}../*.** If
1c100 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
1c110 6c 69 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d  list-index accum
1c120 75 6c 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74  ulating in pWrit
1c130 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20  er->aDlidx[] is 
1c140 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c  large.** enough,
1c150 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
1c160 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  k and return 1. 
1c170 4f 74 68 65 72 77 69 73 65 20 64 69 73 63 61 72  Otherwise discar
1c180 64 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a  d it and return.
1c190 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  ** zero..*/.stat
1c1a0 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65  ic int fts5Write
1c1b0 46 6c 75 73 68 44 6c 69 64 78 28 46 74 73 35 49  FlushDlidx(Fts5I
1c1c0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
1c1d0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
1c1e0 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20  {.  int bFlag = 
1c1f0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  0;..  /* If ther
1c200 65 20 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f  e were FTS5_MIN_
1c210 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f  DLIDX_SIZE or mo
1c220 72 65 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61  re empty leaf pa
1c230 67 65 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  ges written.  **
1c240 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1c250 2c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  , also write the
1c260 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74   doclist-index t
1c270 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66  o disk.  */.  if
1c280 28 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  ( pWriter->aDlid
1c290 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20  x[0].buf.n>0 && 
1c2a0 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e  pWriter->nEmpty>
1c2b0 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f  =FTS5_MIN_DLIDX_
1c2c0 53 49 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61  SIZE ){.    bFla
1c2d0 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73  g = 1;.  }.  fts
1c2e0 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
1c2f0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c  (p, pWriter, bFl
1c300 61 67 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ag);.  pWriter->
1c310 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65  nEmpty = 0;.  re
1c320 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f  turn bFlag;.}../
1c330 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c340 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
1c350 6e 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67  never processing
1c360 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
1c370 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74  for the .** last
1c380 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61   term on leaf pa
1c390 67 65 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74  ge (pWriter->iBt
1c3a0 50 61 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74  Page) is complet
1c3b0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ed. .**.** The d
1c3c0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
1c3d0 20 74 68 61 74 20 74 65 72 6d 20 69 73 20 63 75   that term is cu
1c3e0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1c3f0 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20  n-memory within 
1c400 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72  the.** Fts5SegWr
1c410 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72  iter.aDlidx[] ar
1c420 72 61 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61  ray. If it is la
1c430 72 67 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73  rge enough, this
1c440 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69   function.** wri
1c450 74 65 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69  tes it out to di
1c460 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73  sk. Or, if it is
1c470 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f   too small to bo
1c480 74 68 65 72 20 77 69 74 68 2c 20 64 69 73 63 61  ther with, disca
1c490 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a  rds.** it..**.**
1c4a0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 62   Fts5SegWriter.b
1c4b0 74 74 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20  tterm currently 
1c4c0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72  contains the fir
1c4d0 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  st term on page 
1c4e0 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  iBtPage..*/.stat
1c4f0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1c500 65 46 6c 75 73 68 42 74 72 65 65 28 46 74 73 35  eFlushBtree(Fts5
1c510 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
1c520 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1c530 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a  ){.  int bFlag;.
1c540 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
1c550 65 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70  er->iBtPage || p
1c560 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d  Writer->nEmpty==
1c570 30 20 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74  0 );.  if( pWrit
1c580 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29  er->iBtPage==0 )
1c590 20 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67   return;.  bFlag
1c5a0 20 3d 20 66 74 73 35 57 72 69 74 65 46 6c 75 73   = fts5WriteFlus
1c5b0 68 44 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65  hDlidx(p, pWrite
1c5c0 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  r);..  if( p->rc
1c5d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c5e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c5f0 20 3d 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74   = (pWriter->btt
1c600 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63  erm.n>0?(const c
1c610 68 61 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74  har*)pWriter->bt
1c620 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20  term.p:"");.    
1c630 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1c640 20 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e   was already don
1c650 65 20 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e  e in fts5WriteIn
1c660 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20  it(): */.    /* 
1c670 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1c680 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1c690 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
1c6a0 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  id); */.    sqli
1c6b0 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d  te3_bind_blob(p-
1c6c0 3e 70 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20  >pIdxWriter, 2, 
1c6d0 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65  z, pWriter->btte
1c6e0 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  rm.n, SQLITE_STA
1c6f0 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
1c700 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
1c710 70 49 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62  pIdxWriter, 3, b
1c720 46 6c 61 67 20 2b 20 28 28 69 36 34 29 70 57 72  Flag + ((i64)pWr
1c730 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31  iter->iBtPage<<1
1c740 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
1c750 73 74 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74  step(p->pIdxWrit
1c760 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  er);.    p->rc =
1c770 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1c780 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20  ->pIdxWriter);. 
1c790 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1c7a0 6e 75 6c 6c 28 70 2d 3e 70 49 64 78 57 72 69 74  null(p->pIdxWrit
1c7b0 65 72 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 70 57  er, 2);.  }.  pW
1c7c0 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d  riter->iBtPage =
1c7d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1c7e0 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  s is called once
1c7f0 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70   for each leaf p
1c800 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66  age except the f
1c810 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69  irst that contai
1c820 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  ns.** at least o
1c830 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e  ne term. Argumen
1c840 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20  t (nTerm/pTerm) 
1c850 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  is the split-key
1c860 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a   - a term that.*
1c870 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
1c880 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74   all terms writt
1c890 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65  en to earlier le
1c8a0 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20  aves, and equal 
1c8b0 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72  to or.** smaller
1c8c0 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20   than the first 
1c8d0 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20  term on the new 
1c8e0 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  leaf..**.** If a
1c8f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1c900 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1c910 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64   left in Fts5Ind
1c920 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  ex.rc. If an err
1c930 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  or.** has alread
1c940 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
1c950 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1c960 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
1c970 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1c980 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1c990 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73  BtreeTerm(.  Fts
1c9a0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9c0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1c9d0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
1c9e0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1c9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1ca00 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1ca10 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20  nt nTerm, const 
1ca20 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f  u8 *pTerm      /
1ca30 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  * First term on 
1ca40 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  new page */.){. 
1ca50 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42   fts5WriteFlushB
1ca60 74 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29  tree(p, pWriter)
1ca70 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
1ca80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ca90 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
1caa0 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e  ->rc, &pWriter->
1cab0 62 74 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70  btterm, nTerm, p
1cac0 54 65 72 6d 29 3b 0a 20 20 20 20 70 57 72 69 74  Term);.    pWrit
1cad0 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 70 57  er->iBtPage = pW
1cae0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67  riter->writer.pg
1caf0 6e 6f 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  no;.  }.}../*.**
1cb00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1cb10 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c  s called when fl
1cb20 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61  ushing a leaf pa
1cb30 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1cb40 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20   no.** terms at 
1cb50 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  all to disk..*/.
1cb60 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1cb70 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d  WriteBtreeNoTerm
1cb80 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1cb90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cba0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1cbb0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1cbc0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1cbd0 57 72 69 74 65 72 20 20 20 20 20 20 20 20 20 20  Writer          
1cbe0 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1cbf0 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
1cc00 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77  here were no row
1cc10 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20  ids on the leaf 
1cc20 70 61 67 65 20 65 69 74 68 65 72 20 61 6e 64 20  page either and 
1cc30 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
1cc40 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61  x.  ** has alrea
1cc50 64 79 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c  dy been started,
1cc60 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20   append an 0x00 
1cc70 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a  byte to it.  */.
1cc80 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
1cc90 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1cca0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   && pWriter->aDl
1ccb0 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29  idx[0].buf.n>0 )
1ccc0 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57  {.    Fts5DlidxW
1ccd0 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  riter *pDlidx = 
1cce0 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
1ccf0 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
1cd00 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
1cd10 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  lid );.    sqlit
1cd20 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1cd30 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1cd40 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30   &pDlidx->buf, 0
1cd50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
1cd60 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62  rement the "numb
1cd70 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c  er of sequential
1cd80 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75 74 20   leaves without 
1cd90 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e  a term" counter.
1cda0 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e   */.  pWriter->n
1cdb0 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74  Empty++;.}..stat
1cdc0 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78  ic i64 fts5Dlidx
1cdd0 45 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69  ExtractFirstRowi
1cde0 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  d(Fts5Buffer *pB
1cdf0 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69  uf){.  i64 iRowi
1ce00 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  d;.  int iOff;..
1ce10 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73    iOff = 1 + fts
1ce20 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66  5GetVarint(&pBuf
1ce30 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69  ->p[1], (u64*)&i
1ce40 52 6f 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65  Rowid);.  fts5Ge
1ce50 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
1ce60 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
1ce70 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e  Rowid);.  return
1ce80 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a   iRowid;.}../*.*
1ce90 2a 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68  * Rowid iRowid h
1cea0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70  as just been app
1ceb0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72  ended to the cur
1cec0 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20  rent leaf page. 
1ced0 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72  It is the.** fir
1cee0 73 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  st on the page. 
1cef0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70  This function ap
1cf00 70 65 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72  pends an appropr
1cf10 69 61 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68  iate entry to th
1cf20 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63  e current.** doc
1cf30 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73  list-index..*/.s
1cf40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1cf50 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28  riteDlidxAppend(
1cf60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1cf70 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1cf80 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
1cf90 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69  64 iRowid.){.  i
1cfa0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e  nt i;.  int bDon
1cfb0 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  e = 0;..  for(i=
1cfc0 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
1cfd0 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b  _OK && bDone==0;
1cfe0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69   i++){.    i64 i
1cff0 56 61 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  Val;.    Fts5Dli
1d000 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78  dxWriter *pDlidx
1d010 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
1d020 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28  idx[i];..    if(
1d030 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d   pDlidx->buf.n>=
1d040 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1d050 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1d060 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
1d070 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 66  -index page is f
1d080 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f  ull. Write it to
1d090 20 64 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20   disk and push. 
1d0a0 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f       ** a copy o
1d0b0 66 20 69 52 6f 77 69 64 20 28 77 68 69 63 68 20  f iRowid (which 
1d0c0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
1d0d0 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74  first rowid on t
1d0e0 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a  he next.      **
1d0f0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c   doclist-index l
1d100 65 61 66 20 70 61 67 65 29 20 75 70 20 69 6e 74  eaf page) up int
1d110 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c  o the next level
1d120 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a   of the b-tree .
1d130 20 20 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63        ** hierarc
1d140 68 79 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20  hy. If the node 
1d150 62 65 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73  being flushed is
1d160 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72   currently the r
1d170 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20  oot node,.      
1d180 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73  ** also push its
1d190 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 77   first rowid upw
1d1a0 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ards. */.      p
1d1b0 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20  Dlidx->buf.p[0] 
1d1c0 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f  = 0x01;    /* No
1d1d0 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  t the root node 
1d1e0 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  */.      fts5Dat
1d1f0 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20  aWrite(p, .     
1d200 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
1d210 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
1d220 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78  Segid, i, pDlidx
1d230 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20  ->pgno),.       
1d240 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
1d250 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a  , pDlidx->buf.n.
1d260 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66        );.      f
1d270 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
1d280 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b  w(p, pWriter, i+
1d290 32 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78  2);.      pDlidx
1d2a0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
1d2b0 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  idx[i];.      if
1d2c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1d2d0 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e  OK && pDlidx[1].
1d2e0 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  buf.n==0 ){.    
1d2f0 20 20 20 20 69 36 34 20 69 46 69 72 73 74 20 3d      i64 iFirst =
1d300 20 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63   fts5DlidxExtrac
1d310 74 46 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c  tFirstRowid(&pDl
1d320 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20  idx->buf);..    
1d330 20 20 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20      /* This was 
1d340 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50  the root node. P
1d350 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f  ush its first ro
1d360 77 69 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65  wid up to the ne
1d370 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  w root. */.     
1d380 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e     pDlidx[1].pgn
1d390 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f  o = pDlidx->pgno
1d3a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d3b0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1d3c0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1d3d0 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20  &pDlidx[1].buf, 
1d3e0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1d3f0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1d400 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d410 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  , &pDlidx[1].buf
1d420 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b  , pDlidx->pgno);
1d430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d440 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1d450 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1d460 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69  pDlidx[1].buf, i
1d470 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
1d480 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56  pDlidx[1].bPrevV
1d490 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
1d4a0 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65    pDlidx[1].iPre
1d4b0 76 20 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20  v = iFirst;.    
1d4c0 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
1d4d0 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f  e3Fts5BufferZero
1d4e0 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a  (&pDlidx->buf);.
1d4f0 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50        pDlidx->bP
1d500 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  revValid = 0;.  
1d510 20 20 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f      pDlidx->pgno
1d520 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
1d530 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a       bDone = 1;.
1d540 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
1d550 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1d560 64 20 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20  d ){.      iVal 
1d570 3d 20 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64  = iRowid - pDlid
1d580 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65  x->iPrev;.    }e
1d590 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69  lse{.      i64 i
1d5a0 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70  Pgno = (i==0 ? p
1d5b0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1d5c0 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d  gno : pDlidx[-1]
1d5d0 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73  .pgno);.      as
1d5e0 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75  sert( pDlidx->bu
1d5f0 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  f.n==0 );.      
1d600 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d610 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1d620 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
1d630 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20  uf, !bDone);.   
1d640 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d650 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1d660 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1d670 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20  ->buf, iPgno);. 
1d680 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77       iVal = iRow
1d690 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  id;.    }..    s
1d6a0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d6b0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d6c0 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
1d6d0 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44  f, iVal);.    pD
1d6e0 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
1d6f0 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78   = 1;.    pDlidx
1d700 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64  ->iPrev = iRowid
1d710 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1d720 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c  void fts5WriteFl
1d730 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65  ushLeaf(Fts5Inde
1d740 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
1d750 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
1d760 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1d770 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30   zero[] = { 0x00
1d780 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1d790 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65  00 };.  Fts5Page
1d7a0 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
1d7b0 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1d7c0 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  ;.  i64 iRowid;.
1d7d0 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
1d7e0 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d  e->pgidx.n==0)==
1d7f0 28 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74  (pWriter->bFirst
1d800 54 65 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a  TermInPage) );..
1d810 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c    /* Set the szL
1d820 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64  eaf header field
1d830 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  . */.  assert( 0
1d840 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 50  ==fts5GetU16(&pP
1d850 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29  age->buf.p[2]) )
1d860 3b 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26  ;.  fts5PutU16(&
1d870 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c  pPage->buf.p[2],
1d880 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66   (u16)pPage->buf
1d890 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69  .n);..  if( pWri
1d8a0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1d8b0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nPage ){.    /* 
1d8c0 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72 69 74  No term was writ
1d8d0 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65  ten to this page
1d8e0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1d8f0 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d   pPage->pgidx.n=
1d900 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72  =0 );.    fts5Wr
1d910 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70  iteBtreeNoTerm(p
1d920 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65  , pWriter);.  }e
1d930 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65  lse{.    /* Appe
1d940 6e 64 20 74 68 65 20 70 67 69 64 78 20 74 6f 20  nd the pgidx to 
1d950 74 68 65 20 70 61 67 65 20 62 75 66 66 65 72 2e  the page buffer.
1d960 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20   Set the szLeaf 
1d970 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f  header field. */
1d980 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1d990 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1d9a0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70  , &pPage->buf, p
1d9b0 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70  Page->pgidx.n, p
1d9c0 50 61 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a  Page->pgidx.p);.
1d9d0 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
1d9e0 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
1d9f0 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64  disk */.  iRowid
1da00 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1da10 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
1da20 53 65 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67  Segid, pPage->pg
1da30 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57  no);.  fts5DataW
1da40 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20  rite(p, iRowid, 
1da50 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50  pPage->buf.p, pP
1da60 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20  age->buf.n);..  
1da70 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1da80 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a  e next page. */.
1da90 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
1daa0 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20  (&pPage->buf);. 
1dab0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1dac0 26 70 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a  &pPage->pgidx);.
1dad0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1dae0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1daf0 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a  pPage->buf, 4, z
1db00 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69  ero);.  pPage->i
1db10 50 72 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20  PrevPgidx = 0;. 
1db20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a   pPage->pgno++;.
1db30 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74  .  /* Increase t
1db40 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  he leaves writte
1db50 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70  n counter */.  p
1db60 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69  Writer->nLeafWri
1db70 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  tten++;..  /* Th
1db80 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73  e new leaf holds
1db90 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77   no terms or row
1dba0 69 64 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72  ids */.  pWriter
1dbb0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1dbc0 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65  ge = 1;.  pWrite
1dbd0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1dbe0 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Page = 1;.}../*.
1dbf0 2a 2a 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70  ** Append term p
1dc00 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68  Term/nTerm to th
1dc10 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20  e segment being 
1dc20 77 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 77  written by the w
1dc30 72 69 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20  riter passed.** 
1dc40 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1dc50 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
1dc60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1dc70 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
1dc80 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
1dc90 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
1dca0 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
1dcb0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
1dcc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1dcd0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1dce0 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
1dcf0 64 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  dTerm(.  Fts5Ind
1dd00 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
1dd10 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1dd20 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63  ,.  int nTerm, c
1dd30 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a  onst u8 *pTerm .
1dd40 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  ){.  int nPrefix
1dd50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dd60 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
1dd70 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73   prefix compress
1dd80 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a  ion for term */.
1dd90 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1dda0 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
1ddb0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74  er->writer;.  Ft
1ddc0 73 35 42 75 66 66 65 72 20 2a 70 50 67 69 64 78  s5Buffer *pPgidx
1ddd0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1dde0 74 65 72 2e 70 67 69 64 78 3b 0a 20 20 69 6e 74  ter.pgidx;.  int
1ddf0 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 50 61 67   nMin = MIN(pPag
1de00 65 2d 3e 74 65 72 6d 2e 6e 2c 20 6e 54 65 72 6d  e->term.n, nTerm
1de10 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  );..  assert( p-
1de20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1de30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1de40 65 2d 3e 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20  e->buf.n>=4 );. 
1de50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1de60 62 75 66 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74  buf.n>4 || pWrit
1de70 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1de80 50 61 67 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Page );..  /* If
1de90 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1dea0 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20  f page is full, 
1deb0 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b  flush it to disk
1dec0 2e 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 67  . */.  if( (pPag
1ded0 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 67 69 64  e->buf.n + pPgid
1dee0 78 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32  x->n + nTerm + 2
1def0 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  )>=p->pConfig->p
1df00 67 73 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  gsz ){.    if( p
1df10 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b  Page->buf.n>4 ){
1df20 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1df30 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1df40 69 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  iter);.      if(
1df50 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1df60 4b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  K ) return;.    
1df70 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
1df80 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70 50  Grow(&p->rc, &pP
1df90 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2b  age->buf, nTerm+
1dfa0 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
1dfb0 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  G);.  }.  .  /* 
1dfc0 54 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e 67 20  TODO1: Updating 
1dfd0 70 67 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a 20  pgidx here. */. 
1dfe0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73 71   pPgidx->n += sq
1dff0 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
1e000 6e 74 28 0a 20 20 20 20 20 20 26 70 50 67 69 64  nt(.      &pPgid
1e010 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c  x->p[pPgidx->n],
1e020 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20   pPage->buf.n - 
1e030 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
1e040 78 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  x.  );.  pPage->
1e050 69 50 72 65 76 50 67 69 64 78 20 3d 20 70 50 61  iPrevPgidx = pPa
1e060 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20 30  ge->buf.n;.#if 0
1e070 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70  .  fts5PutU16(&p
1e080 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d  Pgidx->p[pPgidx-
1e090 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  >n], pPage->buf.
1e0a0 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20  n);.  pPgidx->n 
1e0b0 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  += 2;.#endif..  
1e0c0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1e0d0 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
1e0e0 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30  .    nPrefix = 0
1e0f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1e100 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20  >pgno!=1 ){.    
1e110 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
1e120 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 61   first term on a
1e130 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 6e 6f   leaf that is no
1e140 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c  t the leftmost l
1e150 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  eaf in.      ** 
1e160 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  the segment b-tr
1e170 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
1e180 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
1e190 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d 20 74   to add a term t
1e1a0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 62  o.      ** the b
1e1b0 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
1e1c0 74 68 61 74 20 69 73 20 28 61 29 20 6c 61 72 67  that is (a) larg
1e1d0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
1e1e0 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20 20 20  est term .      
1e1f0 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  ** already writt
1e200 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e  en to the segmen
1e210 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65  t and (b) smalle
1e220 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1e230 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  to.      ** this
1e240 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20   term. In other 
1e250 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69 78 20  words, a prefix 
1e260 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  of (pTerm/nTerm)
1e270 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20 20 20   that is one.   
1e280 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65     ** byte longe
1e290 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65  r than the longe
1e2a0 73 74 20 70 72 65 66 69 78 20 28 70 54 65 72 6d  st prefix (pTerm
1e2b0 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73 20 77  /nTerm) shares w
1e2c0 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ith the.      **
1e2d0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20   previous term. 
1e2e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1e2f0 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20  ** Usually, the 
1e300 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73  previous term is
1e310 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 50   available in pP
1e320 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65  age->term. The e
1e330 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a  xception.      *
1e340 2a 20 69 73 20 69 66 20 74 68 69 73 20 69 73 20  * is if this is 
1e350 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 77  the first term w
1e360 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63  ritten in an inc
1e370 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73  remental-merge s
1e380 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  tep..      ** In
1e390 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
1e3a0 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20  revious term is 
1e3b0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 73  not available, s
1e3c0 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61 0a 20  o just write a. 
1e3d0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
1e3e0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e  (pTerm/nTerm) in
1e3f0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f  to the parent no
1e400 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  de. This is slig
1e410 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e  htly.      ** in
1e420 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20 73  efficient, but s
1e430 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a  till correct.  *
1e440 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  /.      int n = 
1e450 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  nTerm;.      if(
1e460 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29   pPage->term.n )
1e470 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 31 20  {.        n = 1 
1e480 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  + fts5PrefixComp
1e490 72 65 73 73 28 6e 4d 69 6e 2c 20 70 50 61 67 65  ress(nMin, pPage
1e4a0 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29  ->term.p, pTerm)
1e4b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e4c0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65  fts5WriteBtreeTe
1e4d0 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e  rm(p, pWriter, n
1e4e0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1e4f0 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
1e500 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 20  E_OK ) return;. 
1e510 20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57       pPage = &pW
1e520 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1e530 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1e540 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35    nPrefix = fts5
1e550 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 6e  PrefixCompress(n
1e560 4d 69 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  Min, pPage->term
1e570 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  .p, pTerm);.    
1e580 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1e590 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1e5a0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65  pPage->buf, nPre
1e5b0 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  fix);.  }..  /* 
1e5c0 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65  Append the numbe
1e5d0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
1e5e0 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65  w data, then the
1e5f0 20 74 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c   term data itsel
1e600 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61  f.  ** to the pa
1e610 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ge. */.  fts5Buf
1e620 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1e630 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1e640 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
1e650 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66  efix);.  fts5Buf
1e660 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1e670 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1e680 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
1e690 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66  ix, &pTerm[nPref
1e6a0 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  ix]);..  /* Upda
1e6b0 74 65 20 74 68 65 20 46 74 73 35 50 61 67 65 57  te the Fts5PageW
1e6c0 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64  riter.term field
1e6d0 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1e6e0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rSet(&p->rc, &pP
1e6f0 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d  age->term, nTerm
1e700 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69  , pTerm);.  pWri
1e710 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1e720 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57  nPage = 0;..  pW
1e730 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1e740 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
1e750 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1e760 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
1e770 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  1;..  assert( p-
1e780 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d  >rc || (pWriter-
1e790 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72  >nDlidx>0 && pWr
1e7a0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
1e7b0 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70  buf.n==0) );.  p
1e7c0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1e7d0 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  ].pgno = pPage->
1e7e0 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pgno;.}../*.** A
1e7f0 70 70 65 6e 64 20 61 20 72 6f 77 69 64 20 61 6e  ppend a rowid an
1e800 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  d position-list 
1e810 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68  size field to th
1e820 65 20 77 72 69 74 65 72 73 20 6f 75 74 70 75 74  e writers output
1e830 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
1e840 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
1e850 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e  dRowid(.  Fts5In
1e860 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1e870 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1e880 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a  r,.  i64 iRowid.
1e890 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
1e8a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e8b0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
1e8c0 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
1e8d0 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20  r->writer;..    
1e8e0 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e  if( (pPage->buf.
1e8f0 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n + pPage->pgidx
1e900 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  .n)>=p->pConfig-
1e910 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66  >pgsz ){.      f
1e920 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1e930 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
1e940 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1e950 74 68 69 73 20 69 73 20 74 6f 20 62 65 20 74 68  this is to be th
1e960 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 77 72  e first rowid wr
1e970 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67  itten to the pag
1e980 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20 20 20  e, set the .    
1e990 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72  ** rowid-pointer
1e9a0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61   in the page-hea
1e9b0 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64  der. Also append
1e9c0 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20   a value to the 
1e9d0 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66  dlidx.    ** buf
1e9e0 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64  fer, in case a d
1e9f0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20  oclist-index is 
1ea00 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
1ea10 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
1ea20 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1ea30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75   ){.      fts5Pu
1ea40 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e  tU16(pPage->buf.
1ea50 70 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62  p, (u16)pPage->b
1ea60 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  uf.n);.      fts
1ea70 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e  5WriteDlidxAppen
1ea80 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52  d(p, pWriter, iR
1ea90 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  owid);.    }..  
1eaa0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
1eab0 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  owid. */.    if(
1eac0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1ead0 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c  RowidInDoclist |
1eae0 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  | pWriter->bFirs
1eaf0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
1eb00 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1eb10 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1eb20 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1eb30 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , iRowid);.    }
1eb40 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1eb50 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f  rt( p->rc || iRo
1eb60 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72  wid>pWriter->iPr
1eb70 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  evRowid );.     
1eb80 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1eb90 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1eba0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f  &pPage->buf, iRo
1ebb0 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69  wid - pWriter->i
1ebc0 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20  PrevRowid);.    
1ebd0 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69  }.    pWriter->i
1ebe0 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77  PrevRowid = iRow
1ebf0 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  id;.    pWriter-
1ec00 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
1ec10 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70  clist = 0;.    p
1ec20 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1ec30 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20  widInPage = 0;. 
1ec40 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1ec50 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
1ec60 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20  dPoslistData(.  
1ec70 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1ec80 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1ec90 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73  pWriter, .  cons
1eca0 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20  t u8 *aData, .  
1ecb0 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46  int nData.){.  F
1ecc0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1ecd0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
1ece0 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74  >writer;.  const
1ecf0 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a   u8 *a = aData;.
1ed00 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b    int n = nData;
1ed10 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d  .  .  assert( p-
1ed20 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30  >pConfig->pgsz>0
1ed30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
1ed40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
1ed50 20 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e 62      && (pPage->b
1ed60 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67  uf.n + pPage->pg
1ed70 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70  idx.n + n)>=p->p
1ed80 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20  Config->pgsz .  
1ed90 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20  ){.    int nReq 
1eda0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
1edb0 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e  sz - pPage->buf.
1edc0 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n - pPage->pgidx
1edd0 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70  .n;.    int nCop
1ede0 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  y = 0;.    while
1edf0 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a  ( nCopy<nReq ){.
1ee00 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b        i64 dummy;
1ee10 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20  .      nCopy += 
1ee20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
1ee30 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26  [nCopy], (u64*)&
1ee40 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20  dummy);.    }.  
1ee50 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1ee60 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1ee70 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70  pPage->buf, nCop
1ee80 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20  y, a);.    a += 
1ee90 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20  nCopy;.    n -= 
1eea0 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57  nCopy;.    fts5W
1eeb0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
1eec0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20   pWriter);.  }. 
1eed0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
1eee0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1eef0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1ef00 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b  age->buf, n, a);
1ef10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  .  }.}../*.** Fl
1ef20 75 73 68 20 61 6e 79 20 64 61 74 61 20 63 61 63  ush any data cac
1ef30 68 65 64 20 62 79 20 74 68 65 20 77 72 69 74 65  hed by the write
1ef40 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
1ef50 64 61 74 61 62 61 73 65 2e 20 46 72 65 65 20 61  database. Free a
1ef60 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ny.** allocation
1ef70 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1ef80 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f  h the writer..*/
1ef90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1efa0 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20 20  5WriteFinish(.  
1efb0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1efc0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1efd0 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
1efe0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1eff0 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65  t */.  int *pnLe
1f000 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
1f010 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1f020 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
1f030 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f  ges in b-tree */
1f040 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46  .){.  int i;.  F
1f050 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1f060 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d  Leaf = &pWriter-
1f070 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20 70  >writer;.  if( p
1f080 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1f090 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1f0a0 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b  Leaf->pgno>=1 );
1f0b0 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e  .    if( pLeaf->
1f0c0 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20  buf.n>4 ){.     
1f0d0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1f0e0 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1f0f0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c 65  .    }.    *pnLe
1f100 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f  af = pLeaf->pgno
1f110 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61  -1;.    if( pLea
1f120 66 2d 3e 70 67 6e 6f 3e 31 20 29 7b 0a 20 20 20  f->pgno>1 ){.   
1f130 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1f140 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74 65  hBtree(p, pWrite
1f150 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1f160 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1f170 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20  pLeaf->term);.  
1f180 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1f190 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66  pLeaf->buf);.  f
1f1a0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1f1b0 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20 20  Leaf->pgidx);.  
1f1c0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1f1d0 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29  pWriter->btterm)
1f1e0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1f1f0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b  pWriter->nDlidx;
1f200 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1f210 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65  e3Fts5BufferFree
1f220 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  (&pWriter->aDlid
1f230 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20  x[i].buf);.  }. 
1f240 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57   sqlite3_free(pW
1f250 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a  riter->aDlidx);.
1f260 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1f270 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20  ts5WriteInit(.  
1f280 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1f290 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1f2a0 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20  pWriter, .  int 
1f2b0 69 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e 73  iSegid.){.  cons
1f2c0 74 20 69 6e 74 20 6e 42 75 66 66 65 72 20 3d 20  t int nBuffer = 
1f2d0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1f2e0 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44   + FTS5_DATA_PAD
1f2f0 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  DING;..  memset(
1f300 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  pWriter, 0, size
1f310 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
1f320 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  ));.  pWriter->i
1f330 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
1f340 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  .  fts5WriteDlid
1f350 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72  xGrow(p, pWriter
1f360 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  , 1);.  pWriter-
1f370 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 31  >writer.pgno = 1
1f380 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
1f390 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1f3a0 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42  1;.  pWriter->iB
1f3b0 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61 73  tPage = 1;..  as
1f3c0 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77  sert( pWriter->w
1f3d0 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20 29  riter.buf.n==0 )
1f3e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69  ;.  assert( pWri
1f3f0 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64  ter->writer.pgid
1f400 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  x.n==0 );..  /* 
1f410 47 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75 66  Grow the two buf
1f420 66 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20 70  fers to pgsz + p
1f430 61 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e 20  adding bytes in 
1f440 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  size. */.  sqlit
1f450 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
1f460 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
1f470 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2c  r->writer.pgidx,
1f480 20 6e 42 75 66 66 65 72 29 3b 0a 20 20 73 71 6c   nBuffer);.  sql
1f490 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
1f4a0 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  ze(&p->rc, &pWri
1f4b0 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c  ter->writer.buf,
1f4c0 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69 66   nBuffer);..  if
1f4d0 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72 3d  ( p->pIdxWriter=
1f4e0 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  =0 ){.    Fts5Co
1f4f0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
1f500 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
1f510 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
1f520 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78  Stmt(p, &p->pIdx
1f530 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f  Writer, sqlite3_
1f540 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
1f550 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
1f560 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73 65  '%q'.'%q_idx'(se
1f570 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56  gid,term,pgno) V
1f580 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a  ALUES(?,?,?)", .
1f590 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
1f5a0 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
1f5b0 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20  >zName.    ));. 
1f5c0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
1f5d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f5e0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1f5f0 74 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66 2d  the 4-byte leaf-
1f600 70 61 67 65 20 68 65 61 64 65 72 20 74 6f 20 30  page header to 0
1f610 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  x00. */.    mems
1f620 65 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69 74  et(pWriter->writ
1f630 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29 3b  er.buf.p, 0, 4);
1f640 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77 72  .    pWriter->wr
1f650 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a  iter.buf.n = 4;.
1f660 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65  .    /* Bind the
1f670 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20   current output 
1f680 73 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74 68  segment id to th
1f690 65 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e 20  e index-writer. 
1f6a0 54 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20 2a  This is an.    *
1f6b0 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  * optimization o
1f6c0 76 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20  ver binding the 
1f6d0 73 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72 20  same value over 
1f6e0 61 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77 73  and over as rows
1f6f0 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65   are.    ** inse
1f700 72 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78 20  rted into %_idx 
1f710 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  by the current w
1f720 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 73  riter.  */.    s
1f730 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
1f740 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31  p->pIdxWriter, 1
1f750 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  , pWriter->iSegi
1f760 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
1f770 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
1f780 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65 72  was used to iter
1f790 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
1f7a0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
1f7b0 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65  f on an.** incre
1f7c0 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
1f7d0 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e  ration. This fun
1f7e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f7f0 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  if the increment
1f800 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70  al.** merge step
1f810 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62 75   has finished bu
1f820 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73 20  t the input has 
1f830 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  not been complet
1f840 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a  ely exhausted..*
1f850 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1f860 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46  s5TrimSegments(F
1f870 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
1f880 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  5Iter *pIter){. 
1f890 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42 75   int i;.  Fts5Bu
1f8a0 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73  ffer buf;.  mems
1f8b0 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
1f8c0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
1f8d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
1f8e0 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
1f8f0 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
1f900 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
1f910 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66  >aSeg[i];.    if
1f920 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20  ( pSeg->pSeg==0 
1f930 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f  ){.      /* no-o
1f940 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  p */.    }else i
1f950 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d  f( pSeg->pLeaf==
1f960 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  0 ){.      /* Al
1f970 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 69 73  l keys from this
1f980 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 68   input segment h
1f990 61 76 65 20 62 65 65 6e 20 74 72 61 6e 73 66 65  ave been transfe
1f9a0 72 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  red to the outpu
1f9b0 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65 74 20  t..      ** Set 
1f9c0 62 6f 74 68 20 74 68 65 20 66 69 72 73 74 20 61  both the first a
1f9d0 6e 64 20 6c 61 73 74 20 70 61 67 65 2d 6e 75 6d  nd last page-num
1f9e0 62 65 72 73 20 74 6f 20 30 20 74 6f 20 69 6e 64  bers to 0 to ind
1f9f0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  icate that the. 
1fa00 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
1fa10 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a 2f  is now empty. */
1fa20 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65  .      pSeg->pSe
1fa30 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  g->pgnoLast = 0;
1fa40 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65  .      pSeg->pSe
1fa50 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30  g->pgnoFirst = 0
1fa60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fa70 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53     int iOff = pS
1fa80 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  eg->iTermLeafOff
1fa90 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73  set;     /* Offs
1faa0 65 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20  et on new first 
1fab0 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20  leaf page */.   
1fac0 20 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69     i64 iLeafRowi
1fad0 64 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74  d;.      Fts5Dat
1fae0 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20  a *pData;.      
1faf0 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e  int iId = pSeg->
1fb00 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
1fb10 20 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d      u8 aHdr[4] =
1fb20 20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78   {0x00, 0x00, 0x
1fb30 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20 20  00, 0x00};..    
1fb40 20 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46    iLeafRowid = F
1fb50 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1fb60 44 28 69 49 64 2c 20 70 53 65 67 2d 3e 69 54 65  D(iId, pSeg->iTe
1fb70 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20  rmLeafPgno);.   
1fb80 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44     pData = fts5D
1fb90 61 74 61 52 65 61 64 28 70 2c 20 69 4c 65 61 66  ataRead(p, iLeaf
1fba0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
1fbb0 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( pData ){.     
1fbc0 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
1fbd0 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20  o(&buf);.       
1fbe0 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28   fts5BufferGrow(
1fbf0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44  &p->rc, &buf, pD
1fc00 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20 20 20  ata->nn);.      
1fc10 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fc20 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1fc30 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48 64 72  buf, sizeof(aHdr
1fc40 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20 20 20  ), aHdr);.      
1fc50 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fc60 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1fc70 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
1fc80 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74  m.n);.        ft
1fc90 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1fca0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1fcb0 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70   pSeg->term.n, p
1fcc0 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20  Seg->term.p);.  
1fcd0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fce0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1fcf0 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e  c, &buf, pData->
1fd00 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20 26 70 44  szLeaf-iOff, &pD
1fd10 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20  ata->p[iOff]);. 
1fd20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1fd30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fd40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
1fd50 74 68 65 20 73 7a 4c 65 61 66 20 66 69 65 6c 64  the szLeaf field
1fd60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74   */.          ft
1fd70 73 35 50 75 74 55 31 36 28 26 62 75 66 2e 70 5b  s5PutU16(&buf.p[
1fd80 32 5d 2c 20 28 75 31 36 29 62 75 66 2e 6e 29 3b  2], (u16)buf.n);
1fd90 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1fda0 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68      /* Set up th
1fdb0 65 20 6e 65 77 20 70 61 67 65 2d 69 6e 64 65 78  e new page-index
1fdc0 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
1fdd0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fde0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1fdf0 20 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20   &buf, 4);.     
1fe00 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65     if( pSeg->iLe
1fe10 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54  afPgno==pSeg->iT
1fe20 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20  ermLeafPgno .   
1fe30 20 20 20 20 20 20 26 26 20 70 53 65 67 2d 3e 69        && pSeg->i
1fe40 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44 61  EndofDoclist<pDa
1fe50 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20  ta->szLeaf .    
1fe60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1fe70 20 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61   int nDiff = pDa
1fe80 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65  ta->szLeaf - pSe
1fe90 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  g->iEndofDoclist
1fea0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1feb0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1fec0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
1fed0 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44 69   buf.n - 1 - nDi
1fee0 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20  ff - 4);.       
1fef0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1ff00 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1ff10 26 62 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20  &buf, .         
1ff20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 2d       pData->nn -
1ff30 20 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66   pSeg->iPgidxOff
1ff40 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70 53 65 67  , &pData->p[pSeg
1ff50 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20 20 20  ->iPgidxOff].   
1ff60 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1ff70 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73    }..        fts
1ff80 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
1ff90 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  ta);.        pSe
1ffa0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  g->pSeg->pgnoFir
1ffb0 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d  st = pSeg->iTerm
1ffc0 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20  LeafPgno;.      
1ffd0 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
1ffe0 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
1fff0 5f 52 4f 57 49 44 28 69 49 64 2c 20 31 29 2c 20  _ROWID(iId, 1), 
20000 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
20010 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
20020 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64  te(p, iLeafRowid
20030 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b  , buf.p, buf.n);
20040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20050 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
20060 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74  ree(&buf);.}..st
20070 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
20080 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b  rgeChunkCallback
20090 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
200a0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  , .  void *pCtx,
200b0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
200c0 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
200d0 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72 69  .){.  Fts5SegWri
200e0 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 28  ter *pWriter = (
200f0 46 74 73 35 53 65 67 57 72 69 74 65 72 2a 29 70  Fts5SegWriter*)p
20100 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74 65  Ctx;.  fts5Write
20110 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74  AppendPoslistDat
20120 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43  a(p, pWriter, pC
20130 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d  hunk, nChunk);.}
20140 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
20150 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
20160 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74  MergeLevel(.  Ft
20170 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20190 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
201a0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
201b0 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
201c0 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct,       /* IN/
201d0 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66  OUT: Stucture of
201e0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
201f0 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iLvl,           
20200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
20210 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70  evel to read inp
20220 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ut from */.  int
20230 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20   *pnRem         
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20250 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69 73  Write up to this
20260 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61   many output lea
20270 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ves */.){.  Fts5
20280 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
20290 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
202a0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
202b0 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
202c0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
202d0 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63  vl];.  Fts5Struc
202e0 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f  tureLevel *pLvlO
202f0 75 74 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  ut;.  Fts5Iter *
20300 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  pIter = 0;      
20310 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
20320 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20  read input data 
20330 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  */.  int nRem = 
20340 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a  pnRem ? *pnRem :
20350 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c   0;  /* Output l
20360 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74  eaf pages left t
20370 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
20380 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20   nInput;        
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
203a0 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  Number of input 
203b0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74  segments */.  Ft
203c0 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
203d0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
203e0 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
203f0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
20400 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
20410 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65      /* Output se
20420 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42  gment */.  Fts5B
20430 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e  uffer term;.  in
20440 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20 20  t bOldest;      
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20460 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   True if the out
20470 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20 74  put segment is t
20480 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 20 20 69  he oldest */.  i
20490 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e  nt eDetail = p->
204a0 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
204b0 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  ;.  const int fl
204c0 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f  ags = FTS5INDEX_
204d0 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a  QUERY_NOOUTPUT;.
204e0 20 20 69 6e 74 20 62 54 65 72 6d 57 72 69 74 74    int bTermWritt
204f0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
20500 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 75 72    /* True if cur
20510 72 65 6e 74 20 74 65 72 6d 20 61 6c 72 65 61 64  rent term alread
20520 79 20 6f 75 74 70 75 74 20 2a 2f 0a 0a 20 20 61  y output */..  a
20530 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72  ssert( iLvl<pStr
20540 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20  uct->nLevel );. 
20550 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e   assert( pLvl->n
20560 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65  Merge<=pLvl->nSe
20570 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  g );..  memset(&
20580 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  writer, 0, sizeo
20590 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
205a0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72  );.  memset(&ter
205b0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
205c0 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 66 28  5Buffer));.  if(
205d0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b   pLvl->nMerge ){
205e0 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26  .    pLvlOut = &
205f0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
20600 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73  iLvl+1];.    ass
20610 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53  ert( pLvlOut->nS
20620 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70  eg>0 );.    nInp
20630 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ut = pLvl->nMerg
20640 65 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  e;.    pSeg = &p
20650 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76  LvlOut->aSeg[pLv
20660 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a  lOut->nSeg-1];..
20670 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
20680 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 70 53  t(p, &writer, pS
20690 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg->iSegid);.   
206a0 20 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70   writer.writer.p
206b0 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
206c0 4c 61 73 74 2b 31 3b 0a 20 20 20 20 77 72 69 74  Last+1;.    writ
206d0 65 72 2e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a  er.iBtPage = 0;.
206e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
206f0 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c   iSegid = fts5Al
20700 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70  locateSegid(p, p
20710 53 74 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a  Struct);..    /*
20720 20 45 78 74 65 6e 64 20 74 68 65 20 46 74 73 35   Extend the Fts5
20730 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
20740 20 61 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   as required to 
20750 65 6e 73 75 72 65 20 74 68 65 20 6f 75 74 70 75  ensure the outpu
20760 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74  t.    ** segment
20770 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20   exists. */.    
20780 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63  if( iLvl==pStruc
20790 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20  t->nLevel-1 ){. 
207a0 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
207b0 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72  reAddLevel(&p->r
207c0 63 2c 20 70 70 53 74 72 75 63 74 29 3b 0a 20 20  c, ppStruct);.  
207d0 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 2a 70      pStruct = *p
207e0 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20  pStruct;.    }. 
207f0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
20800 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
20810 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 4c 76  rc, pStruct, iLv
20820 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  l+1, 1, 0);.    
20830 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
20840 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26  rn;.    pLvl = &
20850 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
20860 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f  iLvl];.    pLvlO
20870 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
20880 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a  Level[iLvl+1];..
20890 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
208a0 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53  t(p, &writer, iS
208b0 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  egid);..    /* A
208c0 64 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65  dd the new segme
208d0 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  nt to the output
208e0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 70 53   level */.    pS
208f0 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
20900 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
20910 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d  g];.    pLvlOut-
20920 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65  >nSeg++;.    pSe
20930 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31  g->pgnoFirst = 1
20940 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67  ;.    pSeg->iSeg
20950 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
20960 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
20970 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  nt++;..    /* Re
20980 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c  ad input from al
20990 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
209a0 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f  e input level */
209b0 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c  .    nInput = pL
209c0 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20  vl->nSeg;.  }.  
209d0 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f  bOldest = (pLvlO
209e0 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70  ut->nSeg==1 && p
209f0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d  Struct->nLevel==
20a00 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61 73 73 65  iLvl+2);..  asse
20a10 72 74 28 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20  rt( iLvl>=0 );. 
20a20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
20a30 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
20a40 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30  , flags, 0, 0, 0
20a50 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20  , iLvl, nInput, 
20a60 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66  &pIter);.      f
20a70 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
20a80 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20  p, pIter)==0;.  
20a90 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
20aa0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
20ab0 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46  0, 0).  ){.    F
20ac0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
20ad0 49 74 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  Iter = &pIter->a
20ae0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
20af0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
20b00 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20      int nPos;   
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69    /* position-li
20b30 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61  st size field va
20b40 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  lue */.    int n
20b50 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Term;.    const 
20b60 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20  u8 *pTerm;..    
20b70 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74  pTerm = fts5Mult
20b80 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c  iIterTerm(pIter,
20b90 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66   &nTerm);.    if
20ba0 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20  ( nTerm!=term.n 
20bb0 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c  || memcmp(pTerm,
20bc0 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20   term.p, nTerm) 
20bd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 6e 52  ){.      if( pnR
20be0 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65  em && writer.nLe
20bf0 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29  afWritten>nRem )
20c00 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
20c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
20c20 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
20c30 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72  >rc, &term, nTer
20c40 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
20c50 20 62 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 30   bTermWritten =0
20c60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20c70 43 68 65 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e  Check for key an
20c80 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20  nihilation. */. 
20c90 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72 2d     if( pSegIter-
20ca0 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c  >nPos==0 && (bOl
20cb0 64 65 73 74 20 7c 7c 20 70 53 65 67 49 74 65 72  dest || pSegIter
20cc0 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e  ->bDel==0) ) con
20cd0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 69 66 28 20  tinue;..    if( 
20ce0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
20cf0 20 26 26 20 62 54 65 72 6d 57 72 69 74 74 65 6e   && bTermWritten
20d00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
20d10 54 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65  This is a new te
20d20 72 6d 2e 20 41 70 70 65 6e 64 20 61 20 74 65 72  rm. Append a ter
20d30 6d 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  m to the output 
20d40 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  segment. */.    
20d50 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
20d60 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72  dTerm(p, &writer
20d70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
20d80 0a 20 20 20 20 20 20 62 54 65 72 6d 57 72 69 74  .      bTermWrit
20d90 74 65 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ten = 1;.    }..
20da0 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
20db0 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f  e rowid to the o
20dc0 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20  utput */.    /* 
20dd0 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
20de0 20 2a 2f 0a 20 20 20 20 66 74 73 35 57 72 69 74   */.    fts5Writ
20df0 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20  eAppendRowid(p, 
20e00 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c  &writer, fts5Mul
20e10 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65  tiIterRowid(pIte
20e20 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44  r));..    if( eD
20e30 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
20e40 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
20e50 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 62   if( pSegIter->b
20e60 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Del ){.        f
20e70 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
20e80 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77  arint(&p->rc, &w
20e90 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
20ea0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
20eb0 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73  ( pSegIter->nPos
20ec0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
20ed0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
20ee0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
20ef0 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75  writer.writer.bu
20f00 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  f, 0);.        }
20f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
20f20 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 70 70  se{.      /* App
20f30 65 6e 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  end the position
20f40 2d 6c 69 73 74 20 64 61 74 61 20 74 6f 20 74 68  -list data to th
20f50 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
20f60 20 20 6e 50 6f 73 20 3d 20 70 53 65 67 49 74 65    nPos = pSegIte
20f70 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 53 65 67  r->nPos*2 + pSeg
20f80 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20 20 20 20  Iter->bDel;.    
20f90 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
20fa0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
20fb0 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
20fc0 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20  buf, nPos);.    
20fd0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61    fts5ChunkItera
20fe0 74 65 28 70 2c 20 70 53 65 67 49 74 65 72 2c 20  te(p, pSegIter, 
20ff0 28 76 6f 69 64 2a 29 26 77 72 69 74 65 72 2c 20  (void*)&writer, 
21000 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61  fts5MergeChunkCa
21010 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20  llback);.    }. 
21020 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74   }..  /* Flush t
21030 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  he last leaf pag
21040 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74  e to disk. Set t
21050 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
21060 74 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a  t b-tree height.
21070 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65    ** and last le
21080 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  af page number a
21090 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
210a0 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65    */.  fts5Write
210b0 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65  Finish(p, &write
210c0 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  r, &pSeg->pgnoLa
210d0 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35  st);..  if( fts5
210e0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
210f0 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e  pIter) ){.    in
21100 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  t i;..    /* Rem
21110 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e  ove the redundan
21120 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  t segments from 
21130 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
21140 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
21150 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b   i<nInput; i++){
21160 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
21170 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20  emoveSegment(p, 
21180 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53  pLvl->aSeg[i].iS
21190 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  egid);.    }..  
211a0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
211b0 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e  redundant segmen
211c0 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ts from the inpu
211d0 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  t level */.    i
211e0 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e  f( pLvl->nSeg!=n
211f0 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69  Input ){.      i
21200 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c  nt nMove = (pLvl
21210 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29  ->nSeg - nInput)
21220 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
21230 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
21240 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  .      memmove(p
21250 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c  Lvl->aSeg, &pLvl
21260 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20  ->aSeg[nInput], 
21270 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMove);.    }.  
21280 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d    pStruct->nSegm
21290 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20  ent -= nInput;. 
212a0 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d     pLvl->nSeg -=
212b0 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76   nInput;.    pLv
212c0 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20  l->nMerge = 0;. 
212d0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e     if( pSeg->pgn
212e0 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oLast==0 ){.    
212f0 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d    pLvlOut->nSeg-
21300 2d 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  -;.      pStruct
21310 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20  ->nSegment--;.  
21320 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
21330 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70   assert( pSeg->p
21340 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20  gnoLast>0 );.   
21350 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
21360 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
21370 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
21380 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66  nInput;.  }..  f
21390 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
213a0 28 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42  (pIter);.  fts5B
213b0 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29  ufferFree(&term)
213c0 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20  ;.  if( pnRem ) 
213d0 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72  *pnRem -= writer
213e0 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d  .nLeafWritten;.}
213f0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f  ../*.** Do up to
21400 20 6e 50 67 20 70 61 67 65 73 20 6f 66 20 61 75   nPg pages of au
21410 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20  tomerge work on 
21420 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  the index..**.**
21430 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
21440 61 6e 79 20 63 68 61 6e 67 65 73 20 77 65 72 65  any changes were
21450 20 61 63 74 75 61 6c 6c 79 20 6d 61 64 65 2c 20   actually made, 
21460 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
21470 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
21480 74 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65  t fts5IndexMerge
21490 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
214a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
214b0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
214c0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
214d0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
214e0 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  ppStruct,       
214f0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65  /* IN/OUT: Curre
21500 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  nt structure of 
21510 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
21520 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
21530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
21540 67 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64  ges of work to d
21550 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 69 6e 20  o */.  int nMin 
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
21580 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  m number of segm
21590 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f  ents to merge */
215a0 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d  .){.  int nRem =
215b0 20 6e 50 67 3b 0a 20 20 69 6e 74 20 62 52 65 74   nPg;.  int bRet
215c0 20 3d 20 30 3b 0a 20 20 46 74 73 35 53 74 72 75   = 0;.  Fts5Stru
215d0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
215e0 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68   *ppStruct;.  wh
215f0 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70  ile( nRem>0 && p
21600 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
21610 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65     /* To iterate
21640 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
21650 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74  */.    int iBest
21660 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Lvl = 0;        
21670 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65     /* Level offe
21680 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e  ring the most in
21690 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
216a0 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20      int nBest = 
216b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
216c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
216d0 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62  ut segments on b
216e0 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20  est level */..  
216f0 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76    /* Set iBestLv
21700 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74  l to the level t
21710 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73 65 67  o read input seg
21720 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20  ments from. */. 
21730 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
21740 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a  ct->nLevel>0 );.
21750 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
21760 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
21770 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
21780 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
21790 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
217a0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
217b0 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66  [iLvl];.      if
217c0 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  ( pLvl->nMerge )
217d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  {.        if( pL
217e0 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74  vl->nMerge>nBest
217f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42   ){.          iB
21800 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20  estLvl = iLvl;. 
21810 20 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d           nBest =
21820 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20   pLvl->nMerge;. 
21830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21840 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
21850 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
21860 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20  nSeg>nBest ){.  
21870 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c        nBest = pL
21880 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20  vl->nSeg;.      
21890 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76    iBestLvl = iLv
218a0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
218b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73  ..    /* If nBes
218c0 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68  t is still 0, th
218d0 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73  en the index mus
218e0 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23  t be empty. */.#
218f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
21900 55 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  UG.    for(iLvl=
21910 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69  0; nBest==0 && i
21920 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
21930 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
21940 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
21950 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
21960 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20  ].nSeg==0 );.   
21970 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
21980 66 28 20 6e 42 65 73 74 3c 6e 4d 69 6e 20 26 26  f( nBest<nMin &&
21990 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
219a0 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67  [iBestLvl].nMerg
219b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  e==0 ){.      br
219c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  eak;.    }.    b
219d0 52 65 74 20 3d 20 31 3b 0a 20 20 20 20 66 74 73  Ret = 1;.    fts
219e0 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
219f0 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42  (p, &pStruct, iB
21a00 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a  estLvl, &nRem);.
21a10 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
21a20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72  QLITE_OK && pStr
21a30 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73  uct->aLevel[iBes
21a40 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20  tLvl].nMerge==0 
21a50 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
21a60 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c  ucturePromote(p,
21a70 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74   iBestLvl+1, pSt
21a80 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ruct);.    }.  }
21a90 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70  .  *ppStruct = p
21aa0 53 74 72 75 63 74 3b 0a 20 20 72 65 74 75 72 6e  Struct;.  return
21ab0 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   bRet;.}../*.** 
21ac0 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66  A total of nLeaf
21ad0 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 64   leaf pages of d
21ae0 61 74 61 20 68 61 73 20 6a 75 73 74 20 62 65 65  ata has just bee
21af0 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c  n flushed to a l
21b00 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e  evel-0.** segmen
21b10 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
21b20 20 75 70 64 61 74 65 73 20 74 68 65 20 77 72 69   updates the wri
21b30 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72  te-counter accor
21b40 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a  dingly and, if.*
21b50 2a 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72  * necessary, per
21b60 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61  forms incrementa
21b70 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a  l merge work..**
21b80 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
21b90 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
21ba0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
21bb0 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
21bc0 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
21bd0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
21be0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
21bf0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
21c00 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
21c10 78 41 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74  xAutomerge(.  Ft
21c20 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c40 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
21c50 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
21c60 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
21c70 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct,       /* IN/
21c80 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
21c90 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
21ca0 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20  */.  int nLeaf  
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21cd0 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20  f output leaves 
21ce0 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
21cf0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
21d00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
21d10 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65  pConfig->nAutome
21d20 72 67 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73  rge>0 ){.    Fts
21d30 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
21d40 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
21d50 0a 20 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b  .    u64 nWrite;
21d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d70 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
21d80 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75  lue of write-cou
21d90 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
21da0 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20  nWork;          
21db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21dc0 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e  ber of work-quan
21dd0 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f  ta to perform */
21de0 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20  .    int nRem;  
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21e10 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20  leaf pages left 
21e20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20  to write */..   
21e30 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 77   /* Update the w
21e40 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68  rite-counter. Wh
21e50 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65  ile doing so, se
21e60 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20  t nWork. */.    
21e70 6e 57 72 69 74 65 20 3d 20 70 53 74 72 75 63 74  nWrite = pStruct
21e80 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  ->nWriteCounter;
21e90 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e  .    nWork = (in
21ea0 74 29 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c  t)(((nWrite + nL
21eb0 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55  eaf) / p->nWorkU
21ec0 6e 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f  nit) - (nWrite /
21ed0 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b   p->nWorkUnit));
21ee0 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57  .    pStruct->nW
21ef0 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e  riteCounter += n
21f00 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d  Leaf;.    nRem =
21f10 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55   (int)(p->nWorkU
21f20 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53  nit * nWork * pS
21f30 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a  truct->nLevel);.
21f40 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65  .    fts5IndexMe
21f50 72 67 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c  rge(p, ppStruct,
21f60 20 6e 52 65 6d 2c 20 70 2d 3e 70 43 6f 6e 66 69   nRem, p->pConfi
21f70 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 29 3b 0a  g->nAutomerge);.
21f80 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
21f90 69 64 20 66 74 73 35 49 6e 64 65 78 43 72 69 73  id fts5IndexCris
21fa0 69 73 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49  ismerge(.  Fts5I
21fb0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
21fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
21fd0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
21fe0 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
21ff0 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20  ture **ppStruct 
22000 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
22010 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74  : Current struct
22020 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
22030 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  ){.  const int n
22040 43 72 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e  Crisis = p->pCon
22050 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67  fig->nCrisisMerg
22060 65 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  e;.  Fts5Structu
22070 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
22080 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69  pStruct;.  int i
22090 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Lvl = 0;..  asse
220a0 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
220b0 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d  E_OK || pStruct-
220c0 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77  >nLevel>0 );.  w
220d0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
220e0 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63  ITE_OK && pStruc
220f0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
22100 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b  nSeg>=nCrisis ){
22110 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65  .    fts5IndexMe
22120 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74  rgeLevel(p, &pSt
22130 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a  ruct, iLvl, 0);.
22140 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
22150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
22160 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e  pStruct->nLevel>
22170 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (iLvl+1) );.    
22180 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
22190 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20  mote(p, iLvl+1, 
221a0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c  pStruct);.    iL
221b0 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53  vl++;.  }.  *ppS
221c0 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b  truct = pStruct;
221d0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
221e0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46  ts5IndexReturn(F
221f0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
22200 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
22210 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
22220 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  _OK;.  return rc
22230 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
22240 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
22250 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73   Fts5FlushCtx;.s
22260 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
22270 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  tx {.  Fts5Index
22280 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65   *pIdx;.  Fts5Se
22290 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
222a0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  .};../*.** Buffe
222b0 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e  r aBuf[] contain
222c0 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69  s a list of vari
222d0 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65  nts, all small e
222e0 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20  nough to fit.** 
222f0 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
22300 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ger. Return the 
22310 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67  size of the larg
22320 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74 68  est prefix of th
22330 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78  is .** list nMax
22340 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69   bytes or less i
22350 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
22360 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73  c int fts5Poslis
22370 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38  tPrefix(const u8
22380 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78   *aBuf, int nMax
22390 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
223a0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74  u32 dummy;.  ret
223b0 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
223c0 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b  32(aBuf, dummy);
223d0 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d 61 78 20  .  if( ret<nMax 
223e0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  ){.    while( 1 
223f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d  ){.      int i =
22400 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
22410 28 26 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d  (&aBuf[ret], dum
22420 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  my);.      if( (
22430 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20  ret + i) > nMax 
22440 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72  ) break;.      r
22450 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20  et += i;.    }. 
22460 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
22470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
22480 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
22490 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
224a0 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20  able iHash to a 
224b0 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20  new level-0 .** 
224c0 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e  segment on disk.
224d0 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65   Also update the
224e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73   corresponding s
224f0 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
22500 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
22510 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
22520 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
22530 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
22540 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
22550 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
22560 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
22570 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
22580 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 46  tatic void fts5F
22590 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35  lushOneHash(Fts5
225a0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
225b0 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70  5Hash *pHash = p
225c0 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73 35 53  ->pHash;.  Fts5S
225d0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
225e0 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b  t;.  int iSegid;
225f0 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
22600 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22610 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61       /* Last lea
22620 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  f page number in
22630 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f   segment */..  /
22640 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
22650 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65  ence to the inde
22660 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  x structure and 
22670 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  allocate a new s
22680 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66  egment-id.  ** f
22690 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c  or the new level
226a0 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a  -0 segment.  */.
226b0 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
226c0 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
226d0 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74 73  ;.  iSegid = fts
226e0 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70  5AllocateSegid(p
226f0 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74  , pStruct);.  ft
22700 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
22710 69 64 61 74 65 28 70 29 3b 0a 0a 20 20 69 66 28  idate(p);..  if(
22720 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63   iSegid ){.    c
22730 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
22740 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
22750 3b 0a 20 20 20 20 69 6e 74 20 65 44 65 74 61 69  ;.    int eDetai
22760 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
22770 65 44 65 74 61 69 6c 3b 0a 20 20 20 20 46 74 73  eDetail;.    Fts
22780 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
22790 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65  t *pSeg;   /* Ne
227a0 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e  w segment within
227b0 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20   pStruct */.    
227c0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
227d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
227e0 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   Buffer in which
227f0 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61   to assemble lea
22800 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 46 74  f page */.    Ft
22810 73 35 42 75 66 66 65 72 20 2a 70 50 67 69 64 78  s5Buffer *pPgidx
22820 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
22830 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
22840 6f 20 61 73 73 65 6d 62 6c 65 20 70 67 69 64 78  o assemble pgidx
22850 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35 53 65 67   */..    Fts5Seg
22860 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20  Writer writer;. 
22870 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
22880 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65  (p, &writer, iSe
22890 67 69 64 29 3b 0a 0a 20 20 20 20 70 42 75 66 20  gid);..    pBuf 
228a0 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  = &writer.writer
228b0 2e 62 75 66 3b 0a 20 20 20 20 70 50 67 69 64 78  .buf;.    pPgidx
228c0 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74 65   = &writer.write
228d0 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20 20 2f 2a  r.pgidx;..    /*
228e0 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 29   fts5WriteInit()
228f0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 69 6e 69   should have ini
22900 74 69 61 6c 69 7a 65 64 20 74 68 65 20 62 75 66  tialized the buf
22910 66 65 72 73 20 74 6f 20 28 6d 6f 73 74 20 6c 69  fers to (most li
22920 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20 74 68 65  kely).    ** the
22930 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72   maximum space r
22940 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
22950 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c  assert( p->rc ||
22960 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28   pBuf->nSpace>=(
22970 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41  pgsz + FTS5_DATA
22980 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 20 20 20  _PADDING) );.   
22990 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
229a0 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70 61 63 65  | pPgidx->nSpace
229b0 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44  >=(pgsz + FTS5_D
229c0 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a  ATA_PADDING) );.
229d0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 73 63  .    /* Begin sc
229e0 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 68  anning through h
229f0 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ash table entrie
22a00 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e  s. This loop run
22a10 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a  s once for each.
22a20 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c      ** term/docl
22a30 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ist currently st
22a40 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ored within the 
22a50 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  hash table. */. 
22a60 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
22a70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22a80 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
22a90 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74  Fts5HashScanInit
22aa0 28 70 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20  (pHash, 0, 0);. 
22ab0 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
22ac0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
22ad0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74   && 0==sqlite3Ft
22ae0 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70 48  s5HashScanEof(pH
22af0 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  ash) ){.      co
22b00 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b  nst char *zTerm;
22b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
22b20 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
22b30 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  erm */.      con
22b40 73 74 20 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b  st u8 *pDoclist;
22b50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
22b60 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 66  ter to doclist f
22b70 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  or this term */.
22b80 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69        int nDocli
22b90 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
22ba0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63    /* Size of doc
22bb0 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
22bc0 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
22bd0 20 74 68 65 20 74 65 72 6d 20 66 6f 72 20 74 68   the term for th
22be0 69 73 20 65 6e 74 72 79 20 74 6f 20 64 69 73 6b  is entry to disk
22bf0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
22c00 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
22c10 74 72 79 28 70 48 61 73 68 2c 20 26 7a 54 65 72  try(pHash, &zTer
22c20 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e  m, &pDoclist, &n
22c30 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Doclist);.      
22c40 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
22c50 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20  erm(p, &writer, 
22c60 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72  (int)strlen(zTer
22c70 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a  m), (const u8*)z
22c80 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Term);.      if(
22c90 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
22ca0 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  K ) break;..    
22cb0 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65 72    assert( writer
22cc0 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  .bFirstRowidInPa
22cd0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ge==0 );.      i
22ce0 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e  f( pgsz>=(pBuf->
22cf0 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20  n + pPgidx->n + 
22d00 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b  nDoclist + 1) ){
22d10 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
22d20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77  entire doclist w
22d30 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63  ill fit on the c
22d40 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a  urrent leaf. */.
22d50 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
22d60 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
22d70 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c  (pBuf, pDoclist,
22d80 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20   nDoclist);.    
22d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22da0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b   i64 iRowid = 0;
22db0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65  .        i64 iDe
22dc0 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lta = 0;.       
22dd0 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a   int iOff = 0;..
22de0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
22df0 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69  ntire doclist wi
22e00 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68  ll not fit on th
22e10 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c  is leaf. The fol
22e20 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20 20 20  lowing .        
22e30 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74 65 73  ** loop iterates
22e40 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73   through the pos
22e50 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b 65 20  lists that make 
22e60 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  up the current .
22e70 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69          ** docli
22e80 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
22e90 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
22ea0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c  LITE_OK && iOff<
22eb0 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  nDoclist ){.    
22ec0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
22ed0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 6f  s5GetVarint(&pDo
22ee0 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36  clist[iOff], (u6
22ef0 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
22f00 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b 3d         iRowid +=
22f10 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20   iDelta;.       
22f20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66     .          if
22f30 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52  ( writer.bFirstR
22f40 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20  owidInPage ){.  
22f50 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75            fts5Pu
22f60 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d  tU16(&pBuf->p[0]
22f70 2c 20 28 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b  , (u16)pBuf->n);
22f80 20 20 20 2f 2a 20 66 69 72 73 74 20 72 6f 77 69     /* first rowi
22f90 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20  d on page */.   
22fa0 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e           pBuf->n
22fb0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50   += sqlite3Fts5P
22fc0 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  utVarint(&pBuf->
22fd0 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77  p[pBuf->n], iRow
22fe0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
22ff0 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f   writer.bFirstRo
23000 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20  widInPage = 0;. 
23010 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57             fts5W
23020 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28  riteDlidxAppend(
23030 70 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77  p, &writer, iRow
23040 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  id);.          }
23050 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23060 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c    pBuf->n += sql
23070 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e  ite3Fts5PutVarin
23080 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  t(&pBuf->p[pBuf-
23090 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20  >n], iDelta);.  
230a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
230b0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66      assert( pBuf
230c0 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63  ->n<=pBuf->nSpac
230d0 65 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  e );..          
230e0 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53  if( eDetail==FTS
230f0 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
23100 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23110 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26   iOff<nDoclist &
23120 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d  & pDoclist[iOff]
23130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
23140 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75       pBuf->p[pBu
23150 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  f->n++] = 0;.   
23160 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b             iOff+
23170 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
23180 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69   if( iOff<nDocli
23190 73 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69  st && pDoclist[i
231a0 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Off]==0 ){.     
231b0 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d             pBuf-
231c0 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20  >p[pBuf->n++] = 
231d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
231e0 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20     iOff++;.     
231f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23210 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e       if( (pBuf->
23220 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d  n + pPgidx->n)>=
23230 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
23240 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
23250 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69  lushLeaf(p, &wri
23260 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
23270 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
23280 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23290 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
232a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f           int nPo
232b0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  s;.            i
232c0 6e 74 20 6e 43 6f 70 79 20 3d 20 66 74 73 35 47  nt nCopy = fts5G
232d0 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70  etPoslistSize(&p
232e0 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26  Doclist[iOff], &
232f0 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  nPos, &bDummy);.
23300 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70              nCop
23310 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20  y += nPos;.     
23320 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66         if( (pBuf
23330 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20  ->n + pPgidx->n 
23340 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a  + nCopy) <= pgsz
23350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23360 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
23370 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74  poslist will fit
23380 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
23390 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20  leaf. So copy.  
233a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
233b0 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a  t in one go. */.
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
233d0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
233e0 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44  ndBlob(pBuf, &pD
233f0 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43  oclist[iOff], nC
23400 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opy);.          
23410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23420 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
23430 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c  tire poslist wil
23440 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69  l not fit on thi
23450 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65  s leaf. So it ne
23460 65 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  eds.            
23470 20 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65    ** to be broke
23480 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e  n into sections.
23490 20 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66   The only qualif
234a0 69 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20  ication being.  
234b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
234c0 68 61 74 20 65 61 63 68 20 76 61 72 69 6e 74 20  hat each varint 
234d0 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64 20 63  must be stored c
234e0 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f  ontiguously.  */
234f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
23500 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69 73  onst u8 *pPoslis
23510 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f  t = &pDoclist[iO
23520 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ff];.           
23530 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b     int iPos = 0;
23540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
23550 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
23560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23570 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53            int nS
23580 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42  pace = pgsz - pB
23590 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e  uf->n - pPgidx->
235a0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
235b0 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
235d0 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29  ( (nCopy - iPos)
235e0 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20  <=nSpace ){.    
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
23600 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a  = nCopy - iPos;.
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23630 20 20 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73           n = fts
23640 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26  5PoslistPrefix(&
23650 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20  pPoslist[iPos], 
23660 6e 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  nSpace);.       
23670 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23680 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
23690 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( n>0 );.      
236a0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
236b0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
236c0 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69  ob(pBuf, &pPosli
236d0 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20  st[iPos], n);.  
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
236f0 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  os += n;.       
23700 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42           if( (pB
23710 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  uf->n + pPgidx->
23720 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20  n)>=pgsz ){.    
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
23740 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
23750 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20  (p, &writer);.  
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20  if( iPos>=nCopy 
23790 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
237a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
237b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
237c0 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79     iOff += nCopy
237d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
237e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
237f0 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a  .      /* TODO2:
23800 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61   Doclist termina
23810 74 6f 72 20 77 72 69 74 74 65 6e 20 68 65 72 65  tor written here
23820 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42  . */.      /* pB
23830 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d  uf->p[pBuf->n++]
23840 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20   = '\0'; */.    
23850 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
23860 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20  n<=pBuf->nSpace 
23870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
23880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
23890 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
238a0 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b 0a  canNext(pHash);.
238b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
238c0 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70  3Fts5HashClear(p
238d0 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35 57  Hash);.    fts5W
238e0 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77  riteFinish(p, &w
238f0 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73 74  riter, &pgnoLast
23900 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
23910 65 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74  e the Fts5Struct
23920 75 72 65 2e 20 49 74 20 69 73 20 77 72 69 74 74  ure. It is writt
23930 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
23940 61 74 61 62 61 73 65 20 62 79 20 74 68 65 0a 20  atabase by the. 
23950 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63 74     ** fts5Struct
23960 75 72 65 52 65 6c 65 61 73 65 28 29 20 63 61 6c  ureRelease() cal
23970 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  l below.  */.   
23980 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c   if( pStruct->nL
23990 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  evel==0 ){.     
239a0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64   fts5StructureAd
239b0 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26  dLevel(&p->rc, &
239c0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
239d0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
239e0 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d  eExtendLevel(&p-
239f0 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c  >rc, pStruct, 0,
23a00 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
23a10 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
23a20 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d   ){.      pSeg =
23a30 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
23a40 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75  l[0].aSeg[ pStru
23a50 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53  ct->aLevel[0].nS
23a60 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53  eg++ ];.      pS
23a70 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  eg->iSegid = iSe
23a80 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  gid;.      pSeg-
23a90 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a  >pgnoFirst = 1;.
23aa0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
23ab0 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b  Last = pgnoLast;
23ac0 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
23ad0 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20  nSegment++;.    
23ae0 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
23af0 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c  urePromote(p, 0,
23b00 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a   pStruct);.  }..
23b10 20 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d    fts5IndexAutom
23b20 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
23b30 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66  , pgnoLast);.  f
23b40 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65  ts5IndexCrisisme
23b50 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 29  rge(p, &pStruct)
23b60 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
23b70 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63  eWrite(p, pStruc
23b80 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
23b90 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
23ba0 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  ct);.}../*.** Fl
23bb0 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ush any data sto
23bc0 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
23bd0 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
23be0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
23bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23c00 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
23c10 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
23c20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20 69 73   /* Unless it is
23c30 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20 74 68   empty, flush th
23c40 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  e hash table to 
23c50 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d  disk */.  if( p-
23c60 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 29 7b  >nPendingData ){
23c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
23c80 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e  pHash );.    p->
23c90 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30  nPendingData = 0
23ca0 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f  ;.    fts5FlushO
23cb0 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d  neHash(p);.  }.}
23cc0 0a 0a 73 74 61 74 69 63 20 46 74 73 35 53 74 72  ..static Fts5Str
23cd0 75 63 74 75 72 65 20 2a 66 74 73 35 49 6e 64 65  ucture *fts5Inde
23ce0 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28  xOptimizeStruct(
23cf0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
23d00 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72   .  Fts5Structur
23d10 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20  e *pStruct.){.  
23d20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
23d30 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  New = 0;.  int n
23d40 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
23d50 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20  s5Structure);.  
23d60 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72 75  int nSeg = pStru
23d70 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
23d80 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 69 67  int i;..  /* Fig
23d90 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20  ure out if this 
23da0 73 74 72 75 63 74 75 72 65 20 72 65 71 75 69 72  structure requir
23db0 65 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  es optimization.
23dc0 20 41 20 73 74 72 75 63 74 75 72 65 20 64 6f 65   A structure doe
23dd0 73 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 71 75 69  s.  ** not requi
23de0 72 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  re optimization 
23df0 69 66 20 65 69 74 68 65 72 3a 0a 20 20 2a 2a 0a  if either:.  **.
23e00 20 20 2a 2a 20 20 2b 20 69 74 20 63 6f 6e 73 69    **  + it consi
23e10 73 74 73 20 6f 66 20 66 65 77 65 72 20 74 68 61  sts of fewer tha
23e20 6e 20 74 77 6f 20 73 65 67 6d 65 6e 74 73 2c 20  n two segments, 
23e30 6f 72 20 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20  or .  **  + all 
23e40 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6f 6e 20  segments are on 
23e50 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 2c 20  the same level, 
23e60 6f 72 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20 73  or.  **  + all s
23e70 65 67 6d 65 6e 74 73 20 65 78 63 65 70 74 20 6f  egments except o
23e80 6e 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  ne are currently
23e90 20 69 6e 70 75 74 73 20 74 6f 20 61 20 6d 65 72   inputs to a mer
23ea0 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  ge operation..  
23eb0 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 66  **.  ** In the f
23ec0 69 72 73 74 20 63 61 73 65 2c 20 72 65 74 75 72  irst case, retur
23ed0 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74 68 65 20 73  n NULL. In the s
23ee0 65 63 6f 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  econd, increment
23ef0 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 0a 20   the ref-count. 
23f00 20 2a 2a 20 6f 6e 20 2a 70 53 74 72 75 63 74 20   ** on *pStruct 
23f10 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 6f 70  and return a cop
23f20 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
23f30 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
23f40 66 28 20 6e 53 65 67 3c 32 20 29 20 72 65 74 75  f( nSeg<2 ) retu
23f50 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
23f60 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   i<pStruct->nLev
23f70 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  el; i++){.    in
23f80 74 20 6e 54 68 69 73 20 3d 20 70 53 74 72 75 63  t nThis = pStruc
23f90 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65  t->aLevel[i].nSe
23fa0 67 3b 0a 20 20 20 20 69 66 28 20 6e 54 68 69 73  g;.    if( nThis
23fb0 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e 54 68 69 73  ==nSeg || (nThis
23fc0 3d 3d 6e 53 65 67 2d 31 20 26 26 20 70 53 74 72  ==nSeg-1 && pStr
23fd0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e  uct->aLevel[i].n
23fe0 4d 65 72 67 65 3d 3d 6e 54 68 69 73 29 20 29 7b  Merge==nThis) ){
23ff0 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
24000 74 75 72 65 52 65 66 28 70 53 74 72 75 63 74 29  tureRef(pStruct)
24010 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
24020 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20  Struct;.    }.  
24030 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
24040 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
24050 72 67 65 3c 3d 6e 54 68 69 73 20 29 3b 0a 20 20  rge<=nThis );.  
24060 7d 0a 0a 20 20 6e 42 79 74 65 20 2b 3d 20 28 70  }..  nByte += (p
24070 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31  Struct->nLevel+1
24080 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  ) * sizeof(Fts5S
24090 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a  tructureLevel);.
240a0 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74    pNew = (Fts5St
240b0 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33  ructure*)sqlite3
240c0 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
240d0 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a  p->rc, nByte);..
240e0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
240f0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
24100 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
24110 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73  nByte = nSeg * s
24120 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
24130 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
24140 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pNew->nLevel = 
24150 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
24160 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65  1;.    pNew->nRe
24170 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d  f = 1;.    pNew-
24180 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d  >nWriteCounter =
24190 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
241a0 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76  Counter;.    pLv
241b0 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65  l = &pNew->aLeve
241c0 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l[pStruct->nLeve
241d0 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53  l];.    pLvl->aS
241e0 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  eg = (Fts5Struct
241f0 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69  ureSegment*)sqli
24200 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
24210 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
24220 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  ;.    if( pLvl->
24230 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e  aSeg ){.      in
24240 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20  t iLvl, iSeg;.  
24250 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20      int iSegOut 
24260 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49 74  = 0;.      /* It
24270 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
24280 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66 72 6f 6d  l segments, from
24290 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73   oldest to newes
242a0 74 2e 20 41 64 64 20 74 68 65 6d 20 74 6f 0a 20  t. Add them to. 
242b0 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
242c0 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a 65 63 74  Fts5Level object
242d0 20 73 6f 20 74 68 61 74 20 70 4c 76 6c 2d 3e 61   so that pLvl->a
242e0 53 65 67 5b 30 5d 20 69 73 20 74 68 65 20 6f 6c  Seg[0] is the ol
242f0 64 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  dest.      ** se
24300 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  gment in the dat
24310 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f  a structure.  */
24320 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  .      for(iLvl=
24330 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d  pStruct->nLevel-
24340 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69 4c 76 6c  1; iLvl>=0; iLvl
24350 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  --){.        for
24360 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
24370 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
24380 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
24390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  ){.          pLv
243a0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d  l->aSeg[iSegOut]
243b0 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
243c0 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
243d0 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
243e0 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20  SegOut++;.      
243f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24400 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74    pNew->nSegment
24410 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20   = pLvl->nSeg = 
24420 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nSeg;.    }else{
24430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24440 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
24450 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d   pNew = 0;.    }
24460 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
24470 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  New;.}..int sqli
24480 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69  te3Fts5IndexOpti
24490 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a  mize(Fts5Index *
244a0 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
244b0 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
244c0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
244d0 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  New = 0;..  asse
244e0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
244f0 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e  E_OK );.  fts5In
24500 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 70  dexFlush(p);.  p
24510 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
24520 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
24530 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
24540 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20  validate(p);..  
24550 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
24560 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 6e     pNew = fts5In
24570 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63  dexOptimizeStruc
24580 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  t(p, pStruct);. 
24590 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74 75   }.  fts5Structu
245a0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
245b0 74 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  t);..  assert( p
245c0 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65 77 2d 3e  New==0 || pNew->
245d0 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  nSegment>0 );.  
245e0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
245f0 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20 20 66 6f  int iLvl;.    fo
24600 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65 77 2d 3e  r(iLvl=0; pNew->
24610 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
24620 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29 7b 7d 0a  g==0; iLvl++){}.
24630 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
24640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
24650 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  New->aLevel[iLvl
24660 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20  ].nSeg>0 ){.    
24670 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53    int nRem = FTS
24680 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b  5_OPT_WORK_UNIT;
24690 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78  .      fts5Index
246a0 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70  MergeLevel(p, &p
246b0 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d  New, iLvl, &nRem
246c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  );.    }..    ft
246d0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
246e0 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66  (p, pNew);.    f
246f0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
24700 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  ase(pNew);.  }..
24710 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
24720 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a  exReturn(p); .}.
24730 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
24740 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  alled to impleme
24750 6e 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 22  nt the special "
24760 56 41 4c 55 45 53 28 27 6d 65 72 67 65 27 2c 20  VALUES('merge', 
24770 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20 49 4e 53  $nMerge)".** INS
24780 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ERT command..*/.
24790 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
247a0 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e  ndexMerge(Fts5In
247b0 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72  dex *p, int nMer
247c0 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  ge){.  Fts5Struc
247d0 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
247e0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
247f0 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74 72  d(p);.  if( pStr
24800 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  uct ){.    int n
24810 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  Min = p->pConfig
24820 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b 0a 20 20  ->nUsermerge;.  
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 20 20  nvalidate(p);.  
24850 20 20 69 66 28 20 6e 4d 65 72 67 65 3c 30 20 29    if( nMerge<0 )
24860 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
24870 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 66 74  cture *pNew = ft
24880 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53  s5IndexOptimizeS
24890 74 72 75 63 74 28 70 2c 20 70 53 74 72 75 63 74  truct(p, pStruct
248a0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  );.      fts5Str
248b0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
248c0 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
248d0 74 72 75 63 74 20 3d 20 70 4e 65 77 3b 0a 20 20  truct = pNew;.  
248e0 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b 0a 20 20      nMin = 2;.  
248f0 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 6e 4d 65      nMerge = nMe
24900 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  rge*-1;.    }.  
24910 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
24920 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
24930 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 74   ){.      if( ft
24940 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20  s5IndexMerge(p, 
24950 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67 65  &pStruct, nMerge
24960 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20 20 20 20  , nMin) ){.     
24970 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24980 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74  Write(p, pStruct
24990 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
249a0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
249b0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
249c0 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
249d0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
249e0 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  (p);.}..static v
249f0 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64 52 6f  oid fts5AppendRo
24a00 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
24a10 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74   *p,.  i64 iDelt
24a20 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  a,.  Fts5Iter *p
24a30 55 6e 75 73 65 64 2c 0a 20 20 46 74 73 35 42 75  Unused,.  Fts5Bu
24a40 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
24a50 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e  UNUSED_PARAM(pUn
24a60 75 73 65 64 29 3b 0a 20 20 66 74 73 35 42 75 66  used);.  fts5Buf
24a70 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
24a80 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 44  &p->rc, pBuf, iD
24a90 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  elta);.}..static
24aa0 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64   void fts5Append
24ab0 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49  Poslist(.  Fts5I
24ac0 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69  ndex *p,.  i64 i
24ad0 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74 65  Delta,.  Fts5Ite
24ae0 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74 73  r *pMulti,.  Fts
24af0 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
24b00 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70  .  int nData = p
24b10 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e 44 61 74  Multi->base.nDat
24b20 61 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61  a;.  assert( nDa
24b30 74 61 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ta>0 );.  if( p-
24b40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
24b50 26 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47  & 0==fts5BufferG
24b60 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  row(&p->rc, pBuf
24b70 2c 20 6e 44 61 74 61 2b 39 2b 39 29 20 29 7b 0a  , nData+9+9) ){.
24b80 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24b90 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
24ba0 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20  Buf, iDelta);.  
24bb0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24bc0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
24bd0 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a 20 20 20  f, nData*2);.   
24be0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
24bf0 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
24c00 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 70 44 61  pMulti->base.pDa
24c10 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a  ta, nData);.  }.
24c20 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }...static void 
24c30 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
24c40 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49  ext(Fts5DoclistI
24c50 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75  ter *pIter){.  u
24c60 38 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 61 50  8 *p = pIter->aP
24c70 6f 73 6c 69 73 74 20 2b 20 70 49 74 65 72 2d 3e  oslist + pIter->
24c80 6e 53 69 7a 65 20 2b 20 70 49 74 65 72 2d 3e 6e  nSize + pIter->n
24c90 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61 73 73 65  Poslist;..  asse
24ca0 72 74 28 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  rt( pIter->aPosl
24cb0 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 3e 3d  ist );.  if( p>=
24cc0 70 49 74 65 72 2d 3e 61 45 6f 66 20 29 7b 0a 20  pIter->aEof ){. 
24cd0 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69     pIter->aPosli
24ce0 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  st = 0;.  }else{
24cf0 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b  .    i64 iDelta;
24d00 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47  ..    p += fts5G
24d10 65 74 56 61 72 69 6e 74 28 70 2c 20 28 75 36 34  etVarint(p, (u64
24d20 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
24d30 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
24d40 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a   iDelta;..    /*
24d50 20 52 65 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c   Read position l
24d60 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ist size */.    
24d70 69 66 28 20 70 5b 30 5d 20 26 20 30 78 38 30 20  if( p[0] & 0x80 
24d80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  ){.      int nPo
24d90 73 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  s;.      pIter->
24da0 6e 53 69 7a 65 20 3d 20 66 74 73 35 47 65 74 56  nSize = fts5GetV
24db0 61 72 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29  arint32(p, nPos)
24dc0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
24dd0 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e  Poslist = (nPos>
24de0 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >1);.    }else{.
24df0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
24e00 73 6c 69 73 74 20 3d 20 28 28 69 6e 74 29 28 70  slist = ((int)(p
24e10 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20  [0])) >> 1;.    
24e20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d    pIter->nSize =
24e30 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   1;.    }..    p
24e40 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
24e50 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   p;.  }.}..stati
24e60 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
24e70 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  stIterInit(.  Ft
24e80 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
24e90 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  .  Fts5DoclistIt
24ea0 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d  er *pIter.){.  m
24eb0 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
24ec0 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
24ed0 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69  .  pIter->aPosli
24ee0 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20  st = pBuf->p;.  
24ef0 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26 70  pIter->aEof = &p
24f00 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b  Buf->p[pBuf->n];
24f10 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  .  fts5DoclistIt
24f20 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 7d  erNext(pIter);.}
24f30 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70  ..#if 0./*.** Ap
24f40 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74  pend a doclist t
24f50 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  o buffer pBuf..*
24f60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24f70 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
24f80 73 70 61 63 65 20 77 69 74 68 69 6e 20 74 68 65  space within the
24f90 20 62 75 66 66 65 72 20 68 61 73 20 61 6c 72 65   buffer has alre
24fa0 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f  ady been.** allo
24fb0 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cated..*/.static
24fc0 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41   void fts5MergeA
24fd0 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 46 74  ppendDocid(.  Ft
24fe0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25000 20 42 75 66 66 65 72 20 74 6f 20 77 72 69 74 65   Buffer to write
25010 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69   to */.  i64 *pi
25020 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20  LastRowid,      
25030 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
25040 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77  UT: Previous row
25050 69 64 20 77 72 69 74 74 65 6e 20 28 69 66 20 61  id written (if a
25060 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  ny) */.  i64 iRo
25070 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
25080 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
25090 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29  d to append */.)
250a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 66  {.  assert( pBuf
250b0 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c 61  ->n!=0 || (*piLa
250c0 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a 20  stRowid)==0 );. 
250d0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
250e0 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
250f0 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61  , iRowid - *piLa
25100 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69 4c  stRowid);.  *piL
25110 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  astRowid = iRowi
25120 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65  d;.}.#endif..#de
25130 66 69 6e 65 20 66 74 73 35 4d 65 72 67 65 41 70  fine fts5MergeAp
25140 70 65 6e 64 44 6f 63 69 64 28 70 42 75 66 2c 20  pendDocid(pBuf, 
25150 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f 77  iLastRowid, iRow
25160 69 64 29 20 7b 20 20 20 20 20 20 20 5c 0a 20 20  id) {       \.  
25170 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e  assert( (pBuf)->
25180 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52 6f  n!=0 || (iLastRo
25190 77 69 64 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  wid)==0 );      
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
251b0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
251c0 70 70 65 6e 64 56 61 72 69 6e 74 28 28 70 42 75  ppendVarint((pBu
251d0 66 29 2c 20 28 69 52 6f 77 69 64 29 20 2d 20 28  f), (iRowid) - (
251e0 69 4c 61 73 74 52 6f 77 69 64 29 29 3b 20 5c 0a  iLastRowid)); \.
251f0 20 20 28 69 4c 61 73 74 52 6f 77 69 64 29 20 3d    (iLastRowid) =
25200 20 28 69 52 6f 77 69 64 29 3b 20 20 20 20 20 20   (iRowid);      
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
25230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74  .}../*.** Swap t
25240 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 62  he contents of b
25250 75 66 66 65 72 20 2a 70 31 20 77 69 74 68 20 74  uffer *p1 with t
25260 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a 2f 0a 73  hat of *p2..*/.s
25270 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
25280 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75  ufferSwap(Fts5Bu
25290 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75  ffer *p1, Fts5Bu
252a0 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73  ffer *p2){.  Fts
252b0 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70  5Buffer tmp = *p
252c0 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a  1;.  *p1 = *p2;.
252d0 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a    *p2 = tmp;.}..
252e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
252f0 4e 65 78 74 52 6f 77 69 64 28 46 74 73 35 42 75  NextRowid(Fts5Bu
25300 66 66 65 72 20 2a 70 42 75 66 2c 20 69 6e 74 20  ffer *pBuf, int 
25310 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a 70 69 52  *piOff, i64 *piR
25320 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20 69 20 3d  owid){.  int i =
25330 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66 28 20 69   *piOff;.  if( i
25340 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a 20 20 20  >=pBuf->n ){.   
25350 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20   *piOff = -1;.  
25360 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36 34 20 69  }else{.    u64 i
25370 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f 66 66 20  Val;.    *piOff 
25380 3d 20 69 20 2b 20 73 71 6c 69 74 65 33 46 74 73  = i + sqlite3Fts
25390 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66  5GetVarint(&pBuf
253a0 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a  ->p[i], &iVal);.
253b0 20 20 20 20 2a 70 69 52 6f 77 69 64 20 2b 3d 20      *piRowid += 
253c0 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iVal;.  }.}../*.
253d0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 65  ** This is the e
253e0 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 66 74 73  quivalent of fts
253f0 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
25400 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 3d 6e  s() for detail=n
25410 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20 49 6e 20  one mode..** In 
25420 74 68 69 73 20 63 61 73 65 20 74 68 65 20 62 75  this case the bu
25430 66 66 65 72 73 20 63 6f 6e 73 69 73 74 20 6f 66  ffers consist of
25440 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64   a delta-encoded
25450 20 6c 69 73 74 20 6f 66 20 72 6f 77 69 64 73 20   list of rowids 
25460 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
25470 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 52 6f  void fts5MergeRo
25480 77 69 64 4c 69 73 74 73 28 0a 20 20 46 74 73 35  widLists(.  Fts5
25490 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
254a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
254b0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
254c0 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ct */.  Fts5Buff
254d0 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20  er *p1,         
254e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
254f0 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
25500 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
25510 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
25520 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69      /* Second li
25530 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  st to merge */.)
25540 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 30 3b 0a  {.  int i1 = 0;.
25550 20 20 69 6e 74 20 69 32 20 3d 20 30 3b 0a 20 20    int i2 = 0;.  
25560 69 36 34 20 69 52 6f 77 69 64 31 20 3d 20 30 3b  i64 iRowid1 = 0;
25570 0a 20 20 69 36 34 20 69 52 6f 77 69 64 32 20 3d  .  i64 iRowid2 =
25580 20 30 3b 0a 20 20 69 36 34 20 69 4f 75 74 20 3d   0;.  i64 iOut =
25590 20 30 3b 0a 0a 20 20 46 74 73 35 42 75 66 66 65   0;..  Fts5Buffe
255a0 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73 65 74 28  r out;.  memset(
255b0 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &out, 0, sizeof(
255c0 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  out));.  sqlite3
255d0 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
255e0 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d  p->rc, &out, p1-
255f0 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 69  >n + p2->n);.  i
25600 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
25610 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78 74 52 6f  n;..  fts5NextRo
25620 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52  wid(p1, &i1, &iR
25630 6f 77 69 64 31 29 3b 0a 20 20 66 74 73 35 4e 65  owid1);.  fts5Ne
25640 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69 32 2c  xtRowid(p2, &i2,
25650 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20 77 68   &iRowid2);.  wh
25660 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c 20 69 32  ile( i1>=0 || i2
25670 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  >=0 ){.    if( i
25680 31 3e 3d 30 20 26 26 20 28 69 32 3c 30 20 7c 7c  1>=0 && (i2<0 ||
25690 20 69 52 6f 77 69 64 31 3c 69 52 6f 77 69 64 32   iRowid1<iRowid2
256a0 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
256b0 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52  t( iOut==0 || iR
256c0 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b 0a 20 20  owid1>iOut );.  
256d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
256e0 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  feAppendVarint(&
256f0 6f 75 74 2c 20 69 52 6f 77 69 64 31 20 2d 20 69  out, iRowid1 - i
25700 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f 75 74  Out);.      iOut
25710 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20 20 20 20   = iRowid1;.    
25720 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
25730 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64  p1, &i1, &iRowid
25740 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
25750 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75       assert( iOu
25760 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 32 3e  t==0 || iRowid2>
25770 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74  iOut );.      ft
25780 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
25790 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69  ndVarint(&out, i
257a0 52 6f 77 69 64 32 20 2d 20 69 4f 75 74 29 3b 0a  Rowid2 - iOut);.
257b0 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f        iOut = iRo
257c0 77 69 64 32 3b 0a 20 20 20 20 20 20 69 66 28 20  wid2;.      if( 
257d0 69 31 3e 3d 30 20 26 26 20 69 52 6f 77 69 64 31  i1>=0 && iRowid1
257e0 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a 20 20 20  ==iRowid2 ){.   
257f0 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77       fts5NextRow
25800 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f  id(p1, &i1, &iRo
25810 77 69 64 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  wid1);.      }. 
25820 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77       fts5NextRow
25830 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f  id(p2, &i2, &iRo
25840 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  wid2);.    }.  }
25850 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 77  ..  fts5BufferSw
25860 61 70 28 26 6f 75 74 2c 20 70 31 29 3b 0a 20 20  ap(&out, p1);.  
25870 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
25880 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  out);.}../*.** B
25890 75 66 66 65 72 73 20 70 31 20 61 6e 64 20 70 32  uffers p1 and p2
258a0 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74   contain doclist
258b0 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
258c0 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e 74   merges the cont
258d0 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77  ent.** of the tw
258e0 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65 74  o doclists toget
258f0 68 65 72 20 61 6e 64 20 73 65 74 73 20 62 75 66  her and sets buf
25900 66 65 72 20 70 31 20 74 6f 20 74 68 65 20 72 65  fer p1 to the re
25910 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72  sult before.** r
25920 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
25930 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
25940 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
25950 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e  e is left in p->
25960 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rc. If an error 
25970 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  has.** already o
25980 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
25990 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
259a0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
259b0 64 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69  d fts5MergePrefi
259c0 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e  xLists(.  Fts5In
259d0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
259e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
259f0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
25a00 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
25a10 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20 20   *p1,           
25a20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
25a30 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
25a40 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32    Fts5Buffer *p2
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a60 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74    /* Second list
25a70 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a   to merge */.){.
25a80 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20    if( p2->n ){. 
25a90 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69     i64 iLastRowi
25aa0 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 44  d = 0;.    Fts5D
25ab0 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b 0a 20  oclistIter i1;. 
25ac0 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
25ad0 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73 35 42  er i2;.    Fts5B
25ae0 75 66 66 65 72 20 6f 75 74 20 3d 20 7b 30 2c 20  uffer out = {0, 
25af0 30 2c 20 30 7d 3b 0a 20 20 20 20 46 74 73 35 42  0, 0};.    Fts5B
25b00 75 66 66 65 72 20 74 6d 70 20 3d 20 7b 30 2c 20  uffer tmp = {0, 
25b10 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 2f 2a 20 54  0, 0};..    /* T
25b20 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
25b30 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  of the output is
25b40 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 75   equal to the su
25b50 6d 20 6f 66 20 74 68 65 20 74 77 6f 20 0a 20 20  m of the two .  
25b60 20 20 2a 2a 20 69 6e 70 75 74 20 73 69 7a 65 73    ** input sizes
25b70 20 2b 20 31 20 76 61 72 69 6e 74 20 28 39 20 62   + 1 varint (9 b
25b80 79 74 65 73 29 2e 20 54 68 65 20 65 78 74 72 61  ytes). The extra
25b90 20 76 61 72 69 6e 74 20 69 73 20 62 65 63 61 75   varint is becau
25ba0 73 65 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  se if the.    **
25bb0 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20   first rowid in 
25bc0 6f 6e 65 20 69 6e 70 75 74 20 69 73 20 61 20 6c  one input is a l
25bd0 61 72 67 65 20 6e 65 67 61 74 69 76 65 20 6e 75  arge negative nu
25be0 6d 62 65 72 2c 20 61 6e 64 20 74 68 65 20 66 69  mber, and the fi
25bf0 72 73 74 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  rst in.    ** th
25c00 65 20 6f 74 68 65 72 20 61 20 6e 6f 6e 2d 6e 65  e other a non-ne
25c10 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2c 20 74  gative number, t
25c20 68 65 20 64 65 6c 74 61 20 66 6f 72 20 74 68 65  he delta for the
25c30 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 0a 20 20   non-negative.  
25c40 20 20 2a 2a 20 6e 75 6d 62 65 72 20 77 69 6c 6c    ** number will
25c50 20 62 65 20 6c 61 72 67 65 72 20 6f 6e 20 64 69   be larger on di
25c60 73 6b 20 74 68 61 6e 20 74 68 65 20 6c 69 74 65  sk than the lite
25c70 72 61 6c 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ral integer valu
25c80 65 0a 20 20 20 20 2a 2a 20 77 61 73 2e 20 20 2a  e.    ** was.  *
25c90 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
25ca0 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
25cb0 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31  &p->rc, &out, p1
25cc0 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 20 2b 20 39 29  ->n + p2->n + 9)
25cd0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
25ce0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
25cf0 69 74 28 70 31 2c 20 26 69 31 29 3b 0a 20 20 20  it(p1, &i1);.   
25d00 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
25d10 49 6e 69 74 28 70 32 2c 20 26 69 32 29 3b 0a 0a  Init(p2, &i2);..
25d20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
25d30 20 20 20 20 20 20 69 66 28 20 69 31 2e 69 52 6f        if( i1.iRo
25d40 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 20 29 7b  wid<i2.iRowid ){
25d50 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
25d60 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31 20 2a   entry from i1 *
25d70 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  /.        fts5Me
25d80 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
25d90 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
25da0 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i1.iRowid);.   
25db0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
25dc0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f  afeAppendBlob(&o
25dd0 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c  ut, i1.aPoslist,
25de0 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69 31 2e   i1.nPoslist+i1.
25df0 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  nSize);.        
25e00 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
25e10 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20  ext(&i1);.      
25e20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73    if( i1.aPoslis
25e30 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
25e40 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
25e50 20 69 66 28 20 69 32 2e 69 52 6f 77 69 64 21 3d   if( i2.iRowid!=
25e60 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  i1.iRowid ){.   
25e70 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74       /* Copy ent
25e80 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20  ry from i2 */.  
25e90 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
25ea0 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
25eb0 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e   iLastRowid, i2.
25ec0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
25ed0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
25ee0 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20  ppendBlob(&out, 
25ef0 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e  i2.aPoslist, i2.
25f00 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53 69 7a  nPoslist+i2.nSiz
25f10 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  e);.        fts5
25f20 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
25f30 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &i2);.        if
25f40 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  ( i2.aPoslist==0
25f50 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
25f60 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20  }.      else{.  
25f70 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74        /* Merge t
25f80 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20  he two position 
25f90 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20  lists. */ .     
25fa0 20 20 20 69 36 34 20 69 50 6f 73 31 20 3d 20 30     i64 iPos1 = 0
25fb0 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 50  ;.        i64 iP
25fc0 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  os2 = 0;.       
25fd0 20 69 6e 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a   int iOff1 = 0;.
25fe0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
25ff0 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  2 = 0;.        u
26000 38 20 2a 61 31 20 3d 20 26 69 31 2e 61 50 6f 73  8 *a1 = &i1.aPos
26010 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a  list[i1.nSize];.
26020 20 20 20 20 20 20 20 20 75 38 20 2a 61 32 20 3d          u8 *a2 =
26030 20 26 69 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32   &i2.aPoslist[i2
26040 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20 20 20 20  .nSize];..      
26050 20 20 69 36 34 20 69 50 72 65 76 20 3d 20 30 3b    i64 iPrev = 0;
26060 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73  .        Fts5Pos
26070 6c 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65  listWriter write
26080 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  r;.        memse
26090 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69  t(&writer, 0, si
260a0 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a  zeof(writer));..
260b0 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
260c0 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75  eAppendDocid(&ou
260d0 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  t, iLastRowid, i
260e0 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
260f0 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
26100 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20  o(&tmp);.       
26110 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
26120 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
26130 74 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  tmp, i1.nPoslist
26140 20 2b 20 69 32 2e 6e 50 6f 73 6c 69 73 74 29 3b   + i2.nPoslist);
26150 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
26160 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  rc ) break;..   
26170 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
26180 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31  PoslistNext64(a1
26190 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i1.nPoslist, &
261a0 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a  iOff1, &iPos1);.
261b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
261c0 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
261d0 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  (a2, i2.nPoslist
261e0 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32  , &iOff2, &iPos2
261f0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
26200 74 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69  t( iPos1>=0 && i
26210 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20 20 20 20  Pos2>=0 );..    
26220 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50      if( iPos1<iP
26230 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os2 ){.         
26240 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
26250 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74  istSafeAppend(&t
26260 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73  mp, &iPrev, iPos
26270 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
26280 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26290 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50  Next64(a1, i1.nP
262a0 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20  oslist, &iOff1, 
262b0 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20  &iPos1);.       
262c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
262d0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
262e0 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26  listSafeAppend(&
262f0 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f  tmp, &iPrev, iPo
26300 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  s2);.          s
26310 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
26320 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e  tNext64(a2, i2.n
26330 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c  Poslist, &iOff2,
26340 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20   &iPos2);.      
26350 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
26360 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f   iPos1>=0 && iPo
26370 73 32 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  s2>=0 ){.       
26380 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
26390 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
263a0 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a 20 20  Pos1<iPos2 ){.  
263b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
263c0 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29 7b 0a  iPos1!=iPrev ){.
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
263f0 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d  stSafeAppend(&tm
26400 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31  p, &iPrev, iPos1
26410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26420 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
26430 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
26440 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31  istNext64(a1, i1
26450 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
26460 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20  1, &iPos1);.    
26470 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
26480 6f 73 31 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20  os1<0 ) break;. 
26490 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
264a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
264b0 61 73 73 65 72 74 28 20 69 50 6f 73 32 21 3d 69  assert( iPos2!=i
264c0 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20 20 20  Prev );.        
264d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
264e0 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
264f0 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c  nd(&tmp, &iPrev,
26500 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20   iPos2);.       
26510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
26520 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
26530 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c  a2, i2.nPoslist,
26540 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29   &iOff2, &iPos2)
26550 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26560 69 66 28 20 69 50 6f 73 32 3c 30 20 29 20 62 72  if( iPos2<0 ) br
26570 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
26580 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
26590 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
265a0 20 20 69 66 28 20 69 50 6f 73 31 3e 3d 30 20 29    if( iPos1>=0 )
265b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
265c0 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29 7b 0a  iPos1!=iPrev ){.
265d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
265e0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61  te3Fts5PoslistSa
265f0 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  feAppend(&tmp, &
26600 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20  iPrev, iPos1);. 
26610 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26620 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
26630 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 74  afeAppendBlob(&t
26640 6d 70 2c 20 26 61 31 5b 69 4f 66 66 31 5d 2c 20  mp, &a1[iOff1], 
26650 69 31 2e 6e 50 6f 73 6c 69 73 74 2d 69 4f 66 66  i1.nPoslist-iOff
26660 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
26670 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
26680 65 72 74 28 20 69 50 6f 73 32 3e 3d 30 20 26 26  ert( iPos2>=0 &&
26690 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29 3b   iPos2!=iPrev );
266a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
266b0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66  e3Fts5PoslistSaf
266c0 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69  eAppend(&tmp, &i
266d0 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20  Prev, iPos2);.  
266e0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
266f0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
26700 28 26 74 6d 70 2c 20 26 61 32 5b 69 4f 66 66 32  (&tmp, &a2[iOff2
26710 5d 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2d 69  ], i2.nPoslist-i
26720 4f 66 66 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  Off2);.        }
26730 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ..        /* WRI
26740 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
26750 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
26760 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
26770 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e 20  int(&out, tmp.n 
26780 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74  * 2);.        ft
26790 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
267a0 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d 70  ndBlob(&out, tmp
267b0 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20  .p, tmp.n);.    
267c0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
267d0 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
267e0 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
267f0 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a  tIterNext(&i2);.
26800 20 20 20 20 20 20 20 20 69 66 28 20 69 31 2e 61          if( i1.a
26810 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32  Poslist==0 || i2
26820 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62  .aPoslist==0 ) b
26830 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26840 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 31 2e    }..    if( i1.
26850 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20 20  aPoslist ){.    
26860 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
26870 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
26880 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77  stRowid, i1.iRow
26890 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  id);.      fts5B
268a0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
268b0 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f  lob(&out, i1.aPo
268c0 73 6c 69 73 74 2c 20 69 31 2e 61 45 6f 66 20 2d  slist, i1.aEof -
268d0 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20   i1.aPoslist);. 
268e0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
268f0 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 20 29 7b  ( i2.aPoslist ){
26900 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65  .      fts5Merge
26910 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74  AppendDocid(&out
26920 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32  , iLastRowid, i2
26930 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
26940 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
26950 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69  pendBlob(&out, i
26960 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 61  2.aPoslist, i2.a
26970 45 6f 66 20 2d 20 69 32 2e 61 50 6f 73 6c 69 73  Eof - i2.aPoslis
26980 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  t);.    }.    as
26990 73 65 72 74 28 20 6f 75 74 2e 6e 3c 3d 28 70 31  sert( out.n<=(p1
269a0 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20 29 3b 0a  ->n+p2->n+9) );.
269b0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
269c0 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f  et(&p->rc, p1, o
269d0 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20  ut.n, out.p);.  
269e0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
269f0 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74 73 35  (&tmp);.    fts5
26a00 42 75 66 66 65 72 46 72 65 65 28 26 6f 75 74 29  BufferFree(&out)
26a10 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
26a20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70 50 72  void fts5SetupPr
26a30 65 66 69 78 49 74 65 72 28 0a 20 20 46 74 73 35  efixIter(.  Fts5
26a40 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
26a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26a60 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66 72 6f  ndex to read fro
26a70 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  m */.  int bDesc
26a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26a90 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
26aa0 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77  or "ORDER BY row
26ab0 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20 63 6f  id DESC" */.  co
26ac0 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20  nst u8 *pToken, 
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ae0 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
26af0 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61 74  ng prefix to mat
26b00 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b  ch */.  int nTok
26b10 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
26b20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
26b30 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65 6e  of buffer pToken
26b40 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46   in bytes */.  F
26b50 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
26b60 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  et,            /
26b70 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68  * Restrict match
26b80 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f 6c 75  es to these colu
26b90 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49 74 65  mns */.  Fts5Ite
26ba0 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20  r **ppIter      
26bb0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
26bc0 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  iterator */.){. 
26bd0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
26be0 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 42  pStruct;.  Fts5B
26bf0 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20 63  uffer *aBuf;.  c
26c00 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d 20  onst int nBuf = 
26c10 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 4d  32;..  void (*xM
26c20 65 72 67 65 29 28 46 74 73 35 49 6e 64 65 78 2a  erge)(Fts5Index*
26c30 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 46  , Fts5Buffer*, F
26c40 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 76  ts5Buffer*);.  v
26c50 6f 69 64 20 28 2a 78 41 70 70 65 6e 64 29 28 46  oid (*xAppend)(F
26c60 74 73 35 49 6e 64 65 78 2a 2c 20 69 36 34 2c 20  ts5Index*, i64, 
26c70 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 42  Fts5Iter*, Fts5B
26c80 75 66 66 65 72 2a 29 3b 0a 20 20 69 66 28 20 70  uffer*);.  if( p
26c90 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
26ca0 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
26cb0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78 4d 65 72  NONE ){.    xMer
26cc0 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65 52 6f  ge = fts5MergeRo
26cd0 77 69 64 4c 69 73 74 73 3b 0a 20 20 20 20 78 41  widLists;.    xA
26ce0 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65  ppend = fts5Appe
26cf0 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65  ndRowid;.  }else
26d00 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d 20 66  {.    xMerge = f
26d10 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
26d20 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e 64  sts;.    xAppend
26d30 20 3d 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73   = fts5AppendPos
26d40 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 42 75  list;.  }..  aBu
26d50 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a  f = (Fts5Buffer*
26d60 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
26d70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
26d80 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53  fer)*nBuf);.  pS
26d90 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
26da0 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20  ctureRead(p);.. 
26db0 20 69 66 28 20 61 42 75 66 20 26 26 20 70 53 74   if( aBuf && pSt
26dc0 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73  ruct ){.    cons
26dd0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54  t int flags = FT
26de0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
26df0 41 4e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  AN .            
26e00 20 20 20 20 20 20 20 20 7c 20 46 54 53 35 49 4e          | FTS5IN
26e10 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d  DEX_QUERY_SKIPEM
26e20 50 54 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  PTY .           
26e30 20 20 20 20 20 20 20 20 20 7c 20 46 54 53 35 49           | FTS5I
26e40 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54  NDEX_QUERY_NOOUT
26e50 50 55 54 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  PUT;.    int i;.
26e60 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77      i64 iLastRow
26e70 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35  id = 0;.    Fts5
26e80 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20 20 20  Iter *p1 = 0;   
26e90 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73    /* Iterator us
26ea0 65 64 20 74 6f 20 67 61 74 68 65 72 20 64 61 74  ed to gather dat
26eb0 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a  a from index */.
26ec0 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44      Fts5Data *pD
26ed0 61 74 61 3b 0a 20 20 20 20 46 74 73 35 42 75 66  ata;.    Fts5Buf
26ee0 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 20 20 20  fer doclist;.   
26ef0 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
26f00 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  1;..    memset(&
26f10 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65  doclist, 0, size
26f20 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20  of(doclist));.  
26f30 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
26f40 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66  ew(p, pStruct, f
26f50 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74 2c 20 70  lags, pColset, p
26f60 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d  Token, nToken, -
26f70 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20 20  1, 0, &p1);.    
26f80 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
26f90 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 31 29 3b  tCb(&p->rc, p1);
26fa0 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20 6e 6f 2d  .    for( /* no-
26fb0 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20 20 20 20  op */ ;.        
26fc0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
26fd0 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20  (p, p1)==0;.    
26fe0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
26ff0 72 4e 65 78 74 32 28 70 2c 20 70 31 2c 20 26 62  rNext2(p, p1, &b
27000 4e 65 77 54 65 72 6d 29 0a 20 20 20 20 29 7b 0a  NewTerm).    ){.
27010 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
27020 72 20 2a 70 53 65 67 20 3d 20 26 70 31 2d 3e 61  r *pSeg = &p1->a
27030 53 65 67 5b 20 70 31 2d 3e 61 46 69 72 73 74 5b  Seg[ p1->aFirst[
27040 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
27050 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70     int nTerm = p
27060 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 20  Seg->term.n;.   
27070 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65     const u8 *pTe
27080 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e  rm = pSeg->term.
27090 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e 78 53 65  p;.      p1->xSe
270a0 74 4f 75 74 70 75 74 73 28 70 31 2c 20 70 53 65  tOutputs(p1, pSe
270b0 67 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  g);..      asser
270c0 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70 54 6f  t_nc( memcmp(pTo
270d0 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28  ken, pTerm, MIN(
270e0 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c  nToken, nTerm))<
270f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
27100 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20  bNewTerm ){.    
27110 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54      if( nTerm<nT
27120 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  oken || memcmp(p
27130 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54  Token, pTerm, nT
27140 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20  oken) ) break;. 
27150 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
27160 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44 61 74 61  ( p1->base.nData
27170 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
27180 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 62  .      if( p1->b
27190 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69 4c 61 73  ase.iRowid<=iLas
271a0 74 52 6f 77 69 64 20 26 26 20 64 6f 63 6c 69 73  tRowid && doclis
271b0 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  t.n>0 ){.       
271c0 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
271d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 6f  =SQLITE_OK && do
271e0 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  clist.n; i++){. 
271f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27200 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20 20   i<nBuf );.     
27210 20 20 20 20 20 69 66 28 20 61 42 75 66 5b 69 5d       if( aBuf[i]
27220 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
27230 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
27240 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26 61  wap(&doclist, &a
27250 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
27260 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
27270 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20  ero(&doclist);. 
27280 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27290 20 20 20 20 20 20 20 20 20 20 20 20 78 4d 65 72              xMer
272a0 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20  ge(p, &doclist, 
272b0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
272c0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
272d0 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b  rZero(&aBuf[i]);
272e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
272f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
27300 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
27310 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 78 41       }..      xA
27320 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e 62 61 73  ppend(p, p1->bas
27330 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73 74 52 6f  e.iRowid-iLastRo
27340 77 69 64 2c 20 70 31 2c 20 26 64 6f 63 6c 69 73  wid, p1, &doclis
27350 74 29 3b 0a 20 20 20 20 20 20 69 4c 61 73 74 52  t);.      iLastR
27360 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61 73 65 2e  owid = p1->base.
27370 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20  iRowid;.    }.. 
27380 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42     for(i=0; i<nB
27390 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  uf; i++){.      
273a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
273b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
273c0 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69  xMerge(p, &docli
273d0 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
273e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
273f0 35 42 75 66 66 65 72 46 72 65 65 28 26 61 42 75  5BufferFree(&aBu
27400 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  f[i]);.    }.   
27410 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
27420 65 65 28 70 31 29 3b 0a 0a 20 20 20 20 70 44 61  ee(p1);..    pDa
27430 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  ta = fts5IdxMall
27440 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
27450 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69 73 74  5Data) + doclist
27460 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61  .n);.    if( pDa
27470 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74  ta ){.      pDat
27480 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44 61  a->p = (u8*)&pDa
27490 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44 61  ta[1];.      pDa
274a0 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e  ta->nn = pData->
274b0 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73 74  szLeaf = doclist
274c0 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 6f  .n;.      if( do
274d0 63 6c 69 73 74 2e 6e 20 29 20 6d 65 6d 63 70 79  clist.n ) memcpy
274e0 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69  (pData->p, docli
274f0 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29  st.p, doclist.n)
27500 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
27510 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44 61  iIterNew2(p, pDa
27520 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74 65  ta, bDesc, ppIte
27530 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  r);.    }.    ft
27540 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64 6f  s5BufferFree(&do
27550 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66  clist);.  }..  f
27560 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
27570 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
27580 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75  sqlite3_free(aBu
27590 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  f);.}.../*.** In
275a0 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20  dicate that all 
275b0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
275c0 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
275d0 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72 74  ndexWrite() pert
275e0 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f  ain.** to the do
275f0 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69  cument with rowi
27600 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  d iRowid..*/.int
27610 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27620 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73 35  xBeginWrite(Fts5
27630 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44  Index *p, int bD
27640 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77 69  elete, i64 iRowi
27650 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  d){.  assert( p-
27660 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
27670 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
27680 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
27690 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
276a0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
276b0 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
276c0 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >pHash==0 ){.   
276d0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
276e0 46 74 73 35 48 61 73 68 4e 65 77 28 70 2d 3e 70  Fts5HashNew(p->p
276f0 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70 48 61 73  Config, &p->pHas
27700 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  h, &p->nPendingD
27710 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ata);.  }..  /* 
27720 46 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74  Flush the hash t
27730 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 69 66 20  able to disk if 
27740 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66  required */.  if
27750 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72 69  ( iRowid<p->iWri
27760 74 65 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20 28  teRowid .   || (
27770 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69 74  iRowid==p->iWrit
27780 65 52 6f 77 69 64 20 26 26 20 70 2d 3e 62 44 65  eRowid && p->bDe
27790 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28  lete==0).   || (
277a0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
277b0 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 48  > p->pConfig->nH
277c0 61 73 68 53 69 7a 65 29 20 0a 20 20 29 7b 0a 20  ashSize) .  ){. 
277d0 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73     fts5IndexFlus
277e0 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  h(p);.  }..  p->
277f0 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52  iWriteRowid = iR
27800 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c 65  owid;.  p->bDele
27810 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20 20  te = bDelete;.  
27820 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
27830 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
27840 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20  .** Commit data 
27850 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
27860 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27870 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a  Sync(Fts5Index *
27880 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
27890 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
278a0 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ;.  fts5IndexFlu
278b0 73 68 28 70 29 3b 0a 20 20 66 74 73 35 43 6c 6f  sh(p);.  fts5Clo
278c0 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72  seReader(p);.  r
278d0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
278e0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
278f0 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64  ** Discard any d
27900 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
27910 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
27920 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20   tables. Do not 
27930 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74  write it.** to t
27940 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
27950 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d  itionally, assum
27960 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  e that the conte
27970 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74  nts of the %_dat
27980 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68  a.** table may h
27990 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64  ave changed on d
279a0 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d  isk. So any in-m
279b0 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20  emory caches of 
279c0 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72  %_data .** recor
279d0 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c  ds must be inval
279e0 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  idated..*/.int s
279f0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
27a00 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65  ollback(Fts5Inde
27a10 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f  x *p){.  fts5Clo
27a20 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66  seReader(p);.  f
27a30 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
27a40 61 74 61 28 70 29 3b 0a 20 20 66 74 73 35 53 74  ata(p);.  fts5St
27a50 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
27a60 65 28 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72  e(p);.  /* asser
27a70 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
27a80 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74 75  _OK ); */.  retu
27a90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27aa0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74  ./*.** The %_dat
27ab0 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c  a table is compl
27ac0 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e  etely empty when
27ad0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27ae0 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a  s called. This.*
27af0 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c  * function popul
27b00 61 74 65 73 20 69 74 20 77 69 74 68 20 74 68 65  ates it with the
27b10 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75   initial structu
27b20 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65  re objects for e
27b30 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e  ach index,.** an
27b40 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65  d the initial ve
27b50 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76  rsion of the "av
27b60 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 28  erages" record (
27b70 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62  a zero-byte blob
27b80 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
27b90 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74  3Fts5IndexReinit
27ba0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
27bb0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
27bc0 73 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  s;.  fts5Structu
27bd0 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b  reInvalidate(p);
27be0 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c  .  memset(&s, 0,
27bf0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
27c00 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35 44  cture));.  fts5D
27c10 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
27c20 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c  _AVERAGES_ROWID,
27c30 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20   (const u8*)"", 
27c40 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  0);.  fts5Struct
27c50 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29 3b  ureWrite(p, &s);
27c60 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
27c70 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
27c80 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
27c90 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  w Fts5Index hand
27ca0 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65 61  le. If the bCrea
27cb0 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  te argument is t
27cc0 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61  rue, create.** a
27cd0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
27ce0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64  e underlying %_d
27cf0 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ata table..**.**
27d00 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
27d10 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
27d20 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
27d30 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
27d40 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65  LITE_OK..** Othe
27d50 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74  rwise, set *pp t
27d60 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72  o NULL and retur
27d70 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
27d80 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
27d90 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
27da0 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  pen(.  Fts5Confi
27db0 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69  g *pConfig, .  i
27dc0 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46  nt bCreate, .  F
27dd0 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20  ts5Index **pp,. 
27de0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
27df0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27e00 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64  TE_OK;.  Fts5Ind
27e10 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ex *p;          
27e20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
27e30 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70  object */..  *pp
27e40 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65   = p = (Fts5Inde
27e50 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  x*)sqlite3Fts5Ma
27e60 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69  llocZero(&rc, si
27e70 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29  zeof(Fts5Index))
27e80 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
27e90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
27ea0 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69  pConfig = pConfi
27eb0 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55  g;.    p->nWorkU
27ec0 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f  nit = FTS5_WORK_
27ed0 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61  UNIT;.    p->zDa
27ee0 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46  taTbl = sqlite3F
27ef0 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20  ts5Mprintf(&rc, 
27f00 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66  "%s_data", pConf
27f10 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ig->zName);.    
27f20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20  if( p->zDataTbl 
27f30 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20  && bCreate ){.  
27f40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27f50 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28  Fts5CreateTable(
27f60 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
27f70 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20  ig, "data", "id 
27f80 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
27f90 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22  KEY, block BLOB"
27fa0 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20  , 0, pzErr.     
27fb0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
27fc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27fd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27fe0 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62  te3Fts5CreateTab
27ff0 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78  le(pConfig, "idx
28000 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
28010 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67  "segid, term, pg
28020 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28  no, PRIMARY KEY(
28030 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a  segid, term)", .
28040 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 70              1, p
28050 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  zErr.        );.
28060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28070 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28080 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28090 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
280a0 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20  Reinit(p);.     
280b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
280c0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
280d0 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
280e0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
280f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
28100 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f  ite3Fts5IndexClo
28110 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d  se(p);.    *pp =
28120 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
28130 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
28140 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65  ose a handle ope
28150 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
28160 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
28170 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29  3Fts5IndexOpen()
28180 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28190 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46  Fts5IndexClose(F
281a0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
281b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
281c0 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  OK;.  if( p ){. 
281d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
281e0 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  eader==0 );.    
281f0 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76  fts5StructureInv
28200 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 20 20  alidate(p);.    
28210 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
28220 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
28230 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
28240 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ze(p->pDeleter);
28250 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
28260 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69  alize(p->pIdxWri
28270 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
28280 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49  3_finalize(p->pI
28290 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20  dxDeleter);.    
282a0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
282b0 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b  (p->pIdxSelect);
282c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
282d0 61 6c 69 7a 65 28 70 2d 3e 70 44 61 74 61 56 65  alize(p->pDataVe
282e0 72 73 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  rsion);.    sqli
282f0 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28  te3Fts5HashFree(
28300 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 73  p->pHash);.    s
28310 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
28320 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71  DataTbl);.    sq
28330 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
28340 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28350 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
28360 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  t p points to a 
28370 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
28380 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68 61  g utf-8 text tha
28390 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20  t is n bytes in 
283a0 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e  .** size. Return
283b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
283c0 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61  ytes in the nCha
283d0 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65 66  r character pref
283e0 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66  ix of the.** buf
283f0 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65  fer, or 0 if the
28400 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e  re are less than
28410 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72   nChar character
28420 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 69  s in total..*/.i
28430 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
28440 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
28450 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  len(.  const cha
28460 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42 79  r *p, .  int nBy
28470 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61 72  te, .  int nChar
28480 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  .){.  int n = 0;
28490 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
284a0 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b  i=0; i<nChar; i+
284b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e  +){.    if( n>=n
284c0 42 79 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Byte ) return 0;
284d0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
284e0 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
284f0 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a  an nChar chars *
28500 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67  /.    if( (unsig
28510 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e  ned char)p[n++]>
28520 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77  =0xc0 ){.      w
28530 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78  hile( (p[n] & 0x
28540 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20  c0)==0x80 ){.   
28550 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
28560 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29    if( n>=nByte )
28570 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
28580 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28590 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn n;.}../*.** p
285a0 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e  In is a UTF-8 en
285b0 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49  coded string, nI
285c0 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  n bytes in size.
285d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
285e0 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65  er of.** unicode
285f0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
28600 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  he string..*/.st
28610 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
28620 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20  exCharlen(const 
28630 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e  char *pIn, int n
28640 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  In){.  int nChar
28650 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
28660 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20   .  int i = 0;. 
28670 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b   while( i<nIn ){
28680 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e  .    if( (unsign
28690 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d  ed char)pIn[i++]
286a0 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
286b0 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20  while( i<nIn && 
286c0 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d  (pIn[i] & 0xc0)=
286d0 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20  =0x80 ) i++;.   
286e0 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a   }.    nChar++;.
286f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68    }.  return nCh
28700 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  ar;.}../*.** Ins
28710 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61  ert or remove da
28720 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ta to or from th
28730 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69  e index. Each ti
28740 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73  me a document is
28750 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72   .** added to or
28760 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
28770 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75  e index, this fu
28780 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
28790 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
287a0 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  times..**.** For
287b0 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d   an insert, it m
287c0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  ust be called on
287d0 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65  ce for each toke
287e0 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63  n in the new doc
287f0 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65  ument..** If the
28800 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
28810 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20  delete, it must 
28820 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65  be called (at le
28830 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61  ast) once for ea
28840 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b  ch.** unique tok
28850 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  en in the docume
28860 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20  nt with an iCol 
28870 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20  value less than 
28880 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a  zero. The iPos.*
28890 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67  * argument is ig
288a0 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65  nored for a dele
288b0 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  te..*/.int sqlit
288c0 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
288d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
288e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
288f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
28900 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  write to */.  in
28910 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28930 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70   Column token ap
28940 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e  pears in (-ve ->
28950 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e   delete) */.  in
28960 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  t iPos,         
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28980 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b   Position of tok
28990 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e  en within column
289a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
289b0 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
289c0 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74  oken  /* Token t
289d0 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  o add or remove 
289e0 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78  to or from index
289f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
28a20 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
28a30 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ugh indexes */. 
28a40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28a50 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
28a60 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
28a70 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
28a80 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
28a90 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74  onfig;..  assert
28aa0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
28ab0 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
28ac0 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65  (iCol<0)==p->bDe
28ad0 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  lete );..  /* Ad
28ae0 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74  d the entry to t
28af0 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e  he main terms in
28b00 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  dex. */.  rc = s
28b10 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
28b20 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48  ite(.      p->pH
28b30 61 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f  ash, p->iWriteRo
28b40 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
28b50 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
28b60 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  X, pToken, nToke
28b70 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  n.  );..  for(i=
28b80 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50  0; i<pConfig->nP
28b90 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c  refix && rc==SQL
28ba0 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
28bb0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68 61    const int nCha
28bc0 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  r = pConfig->aPr
28bd0 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  efix[i];.    int
28be0 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
28bf0 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  Fts5IndexCharlen
28c00 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e  ToBytelen(pToken
28c10 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72 29  , nToken, nChar)
28c20 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
28c30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
28c40 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
28c50 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20  te(p->pHash, .  
28c60 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74          p->iWrit
28c70 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
28c80 6f 73 2c 20 28 63 68 61 72 29 28 46 54 53 35 5f  os, (char)(FTS5_
28c90 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31 29  MAIN_PREFIX+i+1)
28ca0 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20  , pToken,.      
28cb0 20 20 20 20 6e 42 79 74 65 0a 20 20 20 20 20 20      nByte.      
28cc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
28cd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28ce0 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69  .** Open a new i
28cf0 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61  terator to itera
28d00 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f  te though all ro
28d10 77 69 64 20 74 68 61 74 20 6d 61 74 63 68 20 74  wid that match t
28d20 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  he .** specified
28d30 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20   token or token 
28d40 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73  prefix..*/.int s
28d50 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
28d60 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65  uery(.  Fts5Inde
28d70 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
28d80 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69          /* FTS i
28d90 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f  ndex to query */
28da0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
28db0 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65  Token, int nToke
28dc0 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20  n, /* Token (or 
28dd0 70 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79  prefix) to query
28de0 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c   for */.  int fl
28df0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
28e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
28e10 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51  k of FTS5INDEX_Q
28e20 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a  UERY_X flags */.
28e30 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
28e40 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
28e50 20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65    /* Match these
28e60 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f   columns only */
28e70 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
28e80 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20   **ppIter       
28e90 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69     /* OUT: New i
28ea0 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a  terator object *
28eb0 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  /.){.  Fts5Confi
28ec0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
28ed0 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49  pConfig;.  Fts5I
28ee0 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ter *pRet = 0;. 
28ef0 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20   Fts5Buffer buf 
28f00 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20  = {0, 0, 0};..  
28f10 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f  /* If the QUERY_
28f20 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74  SCAN flag is set
28f30 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67  , all other flag
28f40 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e  s must be clear.
28f50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
28f60 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
28f70 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20  _QUERY_SCAN)==0 
28f80 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e  || flags==FTS5IN
28f90 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 29  DEX_QUERY_SCAN )
28fa0 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
28fb0 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
28fc0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f  p->rc, &buf, nTo
28fd0 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20  ken+1)==0 ){.   
28fe0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20   int iIdx = 0;  
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29000 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72 63  * Index to searc
29010 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f  h */.    if( nTo
29020 6b 65 6e 20 29 20 6d 65 6d 63 70 79 28 26 62 75  ken ) memcpy(&bu
29030 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20  f.p[1], pToken, 
29040 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a  nToken);..    /*
29050 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
29060 68 20 69 6e 64 65 78 20 74 6f 20 73 65 61 72 63  h index to searc
29070 68 20 61 6e 64 20 73 65 74 20 69 49 64 78 20 61  h and set iIdx a
29080 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 74  ccordingly. If t
29090 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  his.    ** is a 
290a0 70 72 65 66 69 78 20 71 75 65 72 79 20 66 6f 72  prefix query for
290b0 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20   which there is 
290c0 6e 6f 20 70 72 65 66 69 78 20 69 6e 64 65 78 2c  no prefix index,
290d0 20 73 65 74 20 69 49 64 78 20 74 6f 0a 20 20 20   set iIdx to.   
290e0 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
290f0 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69   pConfig->nPrefi
29100 78 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  x to indicate th
29110 61 74 20 74 68 65 20 71 75 65 72 79 20 77 69 6c  at the query wil
29120 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73 61 74 69  l be.    ** sati
29130 73 66 69 65 64 20 62 79 20 73 63 61 6e 6e 69 6e  sfied by scannin
29140 67 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73  g multiple terms
29150 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64   in the main ind
29160 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
29170 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 54  * If the QUERY_T
29180 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20 77  EST_NOIDX flag w
29190 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 68  as specified, th
291a0 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62 65 20  en this must be 
291b0 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69 78 2d  a.    ** prefix-
291c0 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64 20 6f  query. Instead o
291d0 66 20 75 73 69 6e 67 20 61 20 70 72 65 66 69 78  f using a prefix
291e0 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65 20 65  -index (if one e
291f0 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a 20  xists), .    ** 
29200 65 76 61 6c 75 61 74 65 20 74 68 65 20 70 72 65  evaluate the pre
29210 66 69 78 20 71 75 65 72 79 20 75 73 69 6e 67 20  fix query using 
29220 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69 6e 64  the main FTS ind
29230 65 78 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ex. This is used
29240 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74 65  .    ** for inte
29250 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  rnal sanity chec
29260 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e 74 65  king by the inte
29270 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e 20 64  grity-check in d
29280 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f 64  ebug .    ** mod
29290 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69 66 64  e only.  */.#ifd
292a0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
292b0 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
292c0 3e 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d 30  >bPrefixIndex==0
292d0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
292e0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53  5INDEX_QUERY_TES
292f0 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20 20  T_NOIDX) ){.    
29300 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20    assert( flags 
29310 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
29320 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20 20  Y_PREFIX );.    
29330 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e 66    iIdx = 1+pConf
29340 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20 20  ig->nPrefix;.   
29350 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
29360 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
29370 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52  S5INDEX_QUERY_PR
29380 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69 6e  EFIX ){.      in
29390 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e  t nChar = fts5In
293a0 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65  dexCharlen(pToke
293b0 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
293c0 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49    for(iIdx=1; iI
293d0 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
293e0 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
293f0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66         if( pConf
29400 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78  ig->aPrefix[iIdx
29410 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65  -1]==nChar ) bre
29420 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
29430 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c  }..    if( iIdx<
29440 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  =pConfig->nPrefi
29450 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 74  x ){.      /* St
29460 72 61 69 67 68 74 20 69 6e 64 65 78 20 6c 6f 6f  raight index loo
29470 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  kup */.      Fts
29480 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
29490 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
294a0 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20 20  ureRead(p);.    
294b0 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 28 75 38    buf.p[0] = (u8
294c0 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  )(FTS5_MAIN_PREF
294d0 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 20 20  IX + iIdx);.    
294e0 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
294f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
29500 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
29510 72 75 63 74 2c 20 66 6c 61 67 73 20 7c 20 46 54  ruct, flags | FT
29520 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b  S5INDEX_QUERY_SK
29530 49 50 45 4d 50 54 59 2c 20 0a 20 20 20 20 20 20  IPEMPTY, .      
29540 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2c 20 62        pColset, b
29550 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20  uf.p, nToken+1, 
29560 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a 20 20 20  -1, 0, &pRet.   
29570 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
29580 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
29590 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
295a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
295b0 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20  {.      /* Scan 
295c0 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
295d0 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78  n the main index
295e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
295f0 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46  esc = (flags & F
29600 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
29610 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62  ESC)!=0;.      b
29620 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d  uf.p[0] = FTS5_M
29630 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20  AIN_PREFIX;.    
29640 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69    fts5SetupPrefi
29650 78 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20  xIter(p, bDesc, 
29660 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c  buf.p, nToken+1,
29670 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74 29   pColset, &pRet)
29680 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29690 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
296a0 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f 6c 73 65   || pRet->pColse
296b0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74  t==0 );.      ft
296c0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43  s5IterSetOutputC
296d0 62 28 26 70 2d 3e 72 63 2c 20 70 52 65 74 29 3b  b(&p->rc, pRet);
296e0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
296f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29700 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
29710 65 72 20 2a 70 53 65 67 20 3d 20 26 70 52 65 74  er *pSeg = &pRet
29720 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e 61 46 69  ->aSeg[pRet->aFi
29730 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a  rst[1].iFirst];.
29740 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67          if( pSeg
29750 2d 3e 70 4c 65 61 66 20 29 20 70 52 65 74 2d 3e  ->pLeaf ) pRet->
29760 78 53 65 74 4f 75 74 70 75 74 73 28 70 52 65 74  xSetOutputs(pRet
29770 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d  , pSeg);.      }
29780 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
29790 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73  p->rc ){.      s
297a0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
297b0 6f 73 65 28 28 46 74 73 35 49 6e 64 65 78 49 74  ose((Fts5IndexIt
297c0 65 72 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20  er*)pRet);.     
297d0 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
297e0 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
297f0 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (p);.    }..    
29800 2a 70 70 49 74 65 72 20 3d 20 28 46 74 73 35 49  *ppIter = (Fts5I
29810 6e 64 65 78 49 74 65 72 2a 29 70 52 65 74 3b 0a  ndexIter*)pRet;.
29820 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
29830 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
29840 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74  .  }.  return ft
29850 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
29860 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29870 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
29880 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
29890 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
298a0 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f  nt is at EOF..*/
298b0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
298c0 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
298d0 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20   rowid. .*/.int 
298e0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
298f0 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65  ext(Fts5IndexIte
29900 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a  r *pIndexIter){.
29910 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
29920 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70  r = (Fts5Iter*)p
29930 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 61 73 73  IndexIter;.  ass
29940 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
29950 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
29960 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69  K );.  fts5Multi
29970 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e  IterNext(pIter->
29980 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30  pIndex, pIter, 0
29990 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  , 0);.  return f
299a0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
299b0 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
299c0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
299d0 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
299e0 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73  g term/rowid. Us
299f0 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f  ed by the fts5vo
29a00 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69  cab module..*/.i
29a10 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
29a20 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49  erNextScan(Fts5I
29a30 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78  ndexIter *pIndex
29a40 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74 65  Iter){.  Fts5Ite
29a50 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35  r *pIter = (Fts5
29a60 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72  Iter*)pIndexIter
29a70 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  ;.  Fts5Index *p
29a80 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
29a90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
29aa0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
29ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
29ac0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
29ad0 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
29ae0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
29af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29b00 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
29b10 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
29b20 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
29b30 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
29b40 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
29b50 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e  f && pSeg->term.
29b60 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f  p[0]!=FTS5_MAIN_
29b70 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20  PREFIX ){.      
29b80 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
29b90 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  pSeg->pLeaf);.  
29ba0 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20      pSeg->pLeaf 
29bb0 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72  = 0;.      pIter
29bc0 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b  ->base.bEof = 1;
29bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
29be0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
29bf0 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
29c00 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ex);.}../*.** Mo
29c10 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  ve to the next m
29c20 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68  atching rowid th
29c30 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20  at occurs at or 
29c40 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68  after iMatch. Th
29c50 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20  e.** definition 
29c60 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72 22  of "at or after"
29c70 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
29c80 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f  her this iterato
29c90 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e  r iterates.** in
29ca0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65   ascending or de
29cb0 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f  scending rowid o
29cc0 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rder..*/.int sql
29cd0 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
29ce0 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74  From(Fts5IndexIt
29cf0 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c 20  er *pIndexIter, 
29d00 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 46  i64 iMatch){.  F
29d10 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ts5Iter *pIter =
29d20 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64   (Fts5Iter*)pInd
29d30 65 78 49 74 65 72 3b 0a 20 20 66 74 73 35 4d 75  exIter;.  fts5Mu
29d40 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ltiIterNextFrom(
29d50 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
29d60 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20  Iter, iMatch);. 
29d70 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
29d80 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
29d90 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
29da0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
29db0 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e  ent term..*/.con
29dc0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
29dd0 46 74 73 35 49 74 65 72 54 65 72 6d 28 46 74 73  Fts5IterTerm(Fts
29de0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64  5IndexIter *pInd
29df0 65 78 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  exIter, int *pn)
29e00 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  {.  int n;.  con
29e10 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
29e20 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75  nst char*)fts5Mu
29e30 6c 74 69 49 74 65 72 54 65 72 6d 28 28 46 74 73  ltiIterTerm((Fts
29e40 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
29e50 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20  r, &n);.  *pn = 
29e60 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a  n-1;.  return &z
29e70 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  [1];.}../*.** Cl
29e80 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ose an iterator 
29e90 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72  opened by an ear
29ea0 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  lier call to sql
29eb0 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
29ec0 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ry()..*/.void sq
29ed0 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
29ee0 73 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  se(Fts5IndexIter
29ef0 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20   *pIndexIter){. 
29f00 20 69 66 28 20 70 49 6e 64 65 78 49 74 65 72 20   if( pIndexIter 
29f10 29 7b 0a 20 20 20 20 46 74 73 35 49 74 65 72 20  ){.    Fts5Iter 
29f20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74  *pIter = (Fts5It
29f30 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a  er*)pIndexIter;.
29f40 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70      Fts5Index *p
29f50 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e 70  Index = pIter->p
29f60 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35 4d  Index;.    fts5M
29f70 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74  ultiIterFree(pIt
29f80 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f  er);.    fts5Clo
29f90 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78 29  seReader(pIndex)
29fa0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
29fb0 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74  ead and decode t
29fc0 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65  he "averages" re
29fd0 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64 61  cord from the da
29fe0 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50  tabase. .**.** P
29ff0 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65 20  arameter anSize 
2a000 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
2a010 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e   array of size n
2a020 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20  Col, where nCol 
2a030 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  is.** the number
2a040 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64   of user defined
2a050 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2a060 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  FTS table..*/.in
2a070 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2a080 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74  exGetAverages(Ft
2a090 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
2a0a0 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53  *pnRow, i64 *anS
2a0b0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c  ize){.  int nCol
2a0c0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   = p->pConfig->n
2a0d0 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61 20  Col;.  Fts5Data 
2a0e0 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f  *pData;..  *pnRo
2a0f0 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  w = 0;.  memset(
2a100 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f  anSize, 0, sizeo
2a110 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a  f(i64) * nCol);.
2a120 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
2a130 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 41  taRead(p, FTS5_A
2a140 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a  VERAGES_ROWID);.
2a150 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2a160 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d  ITE_OK && pData-
2a170 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >nn ){.    int i
2a180 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43   = 0;.    int iC
2a190 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73  ol;.    i += fts
2a1a0 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
2a1b0 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70  a->p[i], (u64*)p
2a1c0 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28 69  nRow);.    for(i
2a1d0 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e  Col=0; i<pData->
2a1e0 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b  nn && iCol<nCol;
2a1f0 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
2a200 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
2a210 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c  nt(&pData->p[i],
2a220 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69   (u64*)&anSize[i
2a230 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Col]);.    }.  }
2a240 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
2a250 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65  ase(pData);.  re
2a260 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
2a270 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
2a280 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75  * Replace the cu
2a290 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22  rrent "averages"
2a2a0 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65   record with the
2a2b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2a2c0 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70   buffer .** supp
2a2d0 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  lied as the seco
2a2e0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
2a2f0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2a300 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28  ndexSetAverages(
2a310 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f  Fts5Index *p, co
2a320 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69  nst u8 *pData, i
2a330 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73  nt nData){.  ass
2a340 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
2a350 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44  TE_OK );.  fts5D
2a360 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
2a370 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c  _AVERAGES_ROWID,
2a380 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a   pData, nData);.
2a390 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2a3a0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2a3b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2a3c0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
2a3d0 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64   blocks this mod
2a3e0 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f  ule has read fro
2a3f0 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20  m the %_data.** 
2a400 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77  table since it w
2a410 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69  as created..*/.i
2a420 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2a430 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64  dexReads(Fts5Ind
2a440 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ex *p){.  return
2a450 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a   p->nRead;.}../*
2a460 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62  .** Set the 32-b
2a470 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  it cookie value 
2a480 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
2a490 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63  art of all struc
2a4a0 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73  ture .** records
2a4b0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
2a4c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2a4d0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
2a4e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
2a4f0 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
2a500 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
2a510 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
2a520 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
2a530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a540 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b  Fts5IndexSetCook
2a550 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ie(Fts5Index *p,
2a560 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e   int iNew){.  in
2a570 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a590 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2a5a0 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69  e */.  Fts5Confi
2a5b0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
2a5c0 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43  pConfig;    /* C
2a5d0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
2a5e0 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f  ect */.  u8 aCoo
2a5f0 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20  kie[4];         
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a610 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e   Binary represen
2a620 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a  tation of iNew *
2a630 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
2a640 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20   *pBlob = 0;..  
2a650 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
2a660 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
2a670 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61  lite3Fts5Put32(a
2a680 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a  Cookie, iNew);..
2a690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2a6a0 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
2a6b0 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  ->db, pConfig->z
2a6c0 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c  Db, p->zDataTbl,
2a6d0 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c   .      "block",
2a6e0 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
2a6f0 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62  ROWID, 1, &pBlob
2a700 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
2a710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a720 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
2a730 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b  ite(pBlob, aCook
2a740 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72  ie, 4, 0);.    r
2a750 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
2a760 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20  _close(pBlob);. 
2a770 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2a780 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
2a790 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66  ts5IndexLoadConf
2a7a0 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ig(Fts5Index *p)
2a7b0 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
2a7c0 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53  e *pStruct;.  pS
2a7d0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
2a7e0 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
2a7f0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
2a800 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
2a810 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
2a820 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a  xReturn(p);.}...
2a830 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2a840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2a880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8c0 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
2a8d0 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
2a8e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2a8f0 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  of the integrity
2a900 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74  -check .** funct
2a910 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a  ionality..*/../*
2a920 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d  .** Return a sim
2a930 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  ple checksum val
2a940 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ue based on the 
2a950 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36  arguments..*/.u6
2a960 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  4 sqlite3Fts5Ind
2a970 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20  exEntryCksum(.  
2a980 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69  i64 iRowid, .  i
2a990 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20  nt iCol, .  int 
2a9a0 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64  iPos, .  int iId
2a9b0 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
2a9c0 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54  *pTerm,.  int nT
2a9d0 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erm.){.  int i;.
2a9e0 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77    u64 ret = iRow
2a9f0 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  id;.  ret += (re
2aa00 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20  t<<3) + iCol;.  
2aa10 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
2aa20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49  + iPos;.  if( iI
2aa30 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28  dx>=0 ) ret += (
2aa40 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f  ret<<3) + (FTS5_
2aa50 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49  MAIN_PREFIX + iI
2aa60 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  dx);.  for(i=0; 
2aa70 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65  i<nTerm; i++) re
2aa80 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
2aa90 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75  pTerm[i];.  retu
2aaa0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65  rn ret;.}..#ifde
2aab0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2aac0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2aad0 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20  on is purely an 
2aae0 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
2aaf0 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
2ab00 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
2ab10 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
2ab20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
2ab30 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
2ab40 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
2ab50 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73  nstead, it tests
2ab60 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
2ab70 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64  et of pgno/rowid
2ab80 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
2ab90 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65  e .** visited re
2aba0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2abb0 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  her the doclist-
2abc0 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64  index identified
2abd0 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a   by parameters.*
2abe0 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69  * iSegid/iLeaf i
2abf0 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f  s iterated in fo
2ac00 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73  rwards or revers
2ac10 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  e order..*/.stat
2ac20 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
2ac30 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20 20  DlidxReverse(.  
2ac40 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
2ac50 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac70 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74   /* Segment id t
2ac80 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o load from */. 
2ac90 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20   int iLeaf      
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acb0 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74   /* Load doclist
2acc0 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20  -index for this 
2acd0 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  leaf */.){.  Fts
2ace0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
2acf0 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b  dx = 0;.  u64 ck
2ad00 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34  sum1 = 13;.  u64
2ad10 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20   cksum2 = 13;.. 
2ad20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
2ad30 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
2ad40 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61   0, iSegid, iLea
2ad50 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  f);.      fts5Dl
2ad60 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
2ad70 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
2ad80 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
2ad90 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29  t(p, pDlidx).  )
2ada0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
2adb0 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
2adc0 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20  Rowid(pDlidx);. 
2add0 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74     int pgno = ft
2ade0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
2adf0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73  pDlidx);.    ass
2ae00 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20  ert( pgno>iLeaf 
2ae10 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d  );.    cksum1 +=
2ae20 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29   iRowid + ((i64)
2ae30 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20  pgno<<32);.  }. 
2ae40 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
2ae50 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
2ae60 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  lidx = 0;..  for
2ae70 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
2ae80 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20  xIterInit(p, 1, 
2ae90 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a  iSegid, iLeaf);.
2aea0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2aeb0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
2aec0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
2aed0 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c  DlidxIterPrev(p,
2aee0 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20   pDlidx).  ){.  
2aef0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66    i64 iRowid = f
2af00 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
2af10 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69  d(pDlidx);.    i
2af20 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c  nt pgno = fts5Dl
2af30 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
2af40 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dx);.    assert(
2af50 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
2af60 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66  no(pDlidx)>iLeaf
2af70 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b   );.    cksum2 +
2af80 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
2af90 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
2afa0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
2afb0 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
2afc0 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66  Dlidx = 0;..  if
2afd0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2afe0 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b  OK && cksum1!=ck
2aff0 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46  sum2 ) p->rc = F
2b000 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a  TS5_CORRUPT;.}..
2b010 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51  static int fts5Q
2b020 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73  ueryCksum(.  Fts
2b030 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b050 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63  Fts5 index objec
2b060 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
2b070 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b090 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20     /* Index key 
2b0a0 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
2b0b0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64    /* Size of ind
2b0e0 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20  ex key in bytes 
2b0f0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
2b120 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  r Fts5IndexQuery
2b130 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75   */.  u64 *pCksu
2b140 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
2b150 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2b160 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
2b170 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 74  */.){.  int eDet
2b180 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
2b190 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34  ->eDetail;.  u64
2b1a0 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d   cksum = *pCksum
2b1b0 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ;.  Fts5IndexIte
2b1c0 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20  r *pIter = 0;.  
2b1d0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
2b1e0 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 70  Fts5IndexQuery(p
2b1f0 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30  , z, n, flags, 0
2b200 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20 20 77 68  , &pIter);..  wh
2b210 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2b220 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  OK && 0==sqlite3
2b230 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74 65  Fts5IterEof(pIte
2b240 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20 72 6f  r) ){.    i64 ro
2b250 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52 6f  wid = pIter->iRo
2b260 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 65 44  wid;..    if( eD
2b270 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
2b280 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
2b290 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65   cksum ^= sqlite
2b2a0 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2b2b0 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20 30  ksum(rowid, 0, 0
2b2c0 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20  , iIdx, z, n);. 
2b2d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b2e0 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2b2f0 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20  r sReader;.     
2b300 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35   for(sqlite3Fts5
2b310 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
2b320 74 28 70 49 74 65 72 2d 3e 70 44 61 74 61 2c 20  t(pIter->pData, 
2b330 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26 73  pIter->nData, &s
2b340 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20  Reader);.       
2b350 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d     sReader.bEof=
2b360 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  =0;.          sq
2b370 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
2b380 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61  ReaderNext(&sRea
2b390 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  der).      ){.  
2b3a0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
2b3b0 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
2b3c0 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a  (sReader.iPos);.
2b3d0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
2b3e0 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
2b3f0 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29  ET(sReader.iPos)
2b400 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
2b410 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
2b420 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f  dexEntryCksum(ro
2b430 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c  wid, iCol, iOff,
2b440 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20   iIdx, z, n);.  
2b450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b460 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b470 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2b480 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
2b490 65 78 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20  ext(pIter);.    
2b4a0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46  }.  }.  sqlite3F
2b4b0 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49 74  ts5IterClose(pIt
2b4c0 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20  er);..  *pCksum 
2b4d0 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72  = cksum;.  retur
2b4e0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2b4f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2b500 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20   also purely an 
2b510 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
2b520 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
2b530 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
2b540 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
2b550 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
2b560 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
2b570 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74  any way..*/.stat
2b580 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
2b590 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
2b5a0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66  x *p, .  Fts5Buf
2b5b0 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20  fer *pPrev,     
2b5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
2b5d0 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63  ious term */.  c
2b5e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
2b5f0 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  t n,           /
2b600 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74  * Possibly new t
2b610 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  erm to test */. 
2b620 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20   u64 expected,. 
2b630 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a   u64 *pCksum.){.
2b640 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
2b650 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e  ;.  if( pPrev->n
2b660 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  ==0 ){.    fts5B
2b670 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
2b680 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
2b690 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  8*)z);.  }else. 
2b6a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b6b0 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21  OK && (pPrev->n!
2b6c0 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72  =n || memcmp(pPr
2b6d0 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b  ev->p, z, n)) ){
2b6e0 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20  .    u64 cksum3 
2b6f0 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63  = *pCksum;.    c
2b700 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
2b710 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2b720 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f  &pPrev->p[1];  /
2b730 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66  * term sans pref
2b740 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ix-byte */.    i
2b750 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76  nt nTerm = pPrev
2b760 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20  ->n-1;          
2b770 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65    /* Size of zTe
2b780 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
2b790 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70     int iIdx = (p
2b7a0 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53  Prev->p[0] - FTS
2b7b0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a  5_MAIN_PREFIX);.
2b7c0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
2b7d0 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46  (iIdx==0 ? 0 : F
2b7e0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
2b7f0 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20  REFIX);.    u64 
2b800 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34  ck1 = 0;.    u64
2b810 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f   ck2 = 0;..    /
2b820 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2b830 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
2b840 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45  d for ASC and DE
2b850 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20  SC queries are. 
2b860 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
2b870 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69  If not, call thi
2b880 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  s corruption.  *
2b890 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51  /.    rc = fts5Q
2b8a0 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
2b8b0 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
2b8c0 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20   flags, &ck1);. 
2b8d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b8e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
2b8f0 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
2b900 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
2b910 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
2b920 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
2b930 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
2b940 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
2b950 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2b960 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
2b970 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
2b980 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f  _CORRUPT;..    /
2b990 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70  * If this is a p
2b9a0 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65  refix query, che
2b9b0 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ck that the resu
2b9c0 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20  lts returned if 
2b9d0 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  the.    ** the i
2b9e0 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64  ndex is disabled
2b9f0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49   are the same. I
2ba00 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44  n both ASC and D
2ba10 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20  ESC order. .    
2ba20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63  **.    ** This c
2ba30 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65  heck may only be
2ba40 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68   performed if th
2ba50 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20  e hash table is 
2ba60 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20  empty. This.    
2ba70 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68  ** is because th
2ba80 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c  e hash table onl
2ba90 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e  y supports a sin
2baa0 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20 61  gle scan query a
2bab0 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c  t.    ** a time,
2bac0 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69   and the multi-i
2bad0 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68  ter loop from wh
2bae0 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ich this functio
2baf0 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20  n is called.    
2bb00 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70 65  ** is already pe
2bb10 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20  rforming such a 
2bb20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
2bb30 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
2bb40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2bb50 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53   iIdx>0 && rc==S
2bb60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bb70 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
2bb80 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
2bb90 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20  Y_TEST_NOIDX;.  
2bba0 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
2bbb0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
2bbc0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2bbd0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2bbe0 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
2bbf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bc00 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
2bc10 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
2bc20 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
2bc30 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20       if( iIdx>0 
2bc40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2bc50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2bc60 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
2bc70 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
2bc80 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51  OIDX|FTS5INDEX_Q
2bc90 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20  UERY_DESC;.     
2bca0 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20     ck2 = 0;.    
2bcb0 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
2bcc0 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
2bcd0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
2bce0 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20  , &ck2);.       
2bcf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bd00 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
2bd10 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
2bd20 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
2bd30 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d  }..    cksum3 ^=
2bd40 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75   ck1;.    fts5Bu
2bd50 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72  fferSet(&rc, pPr
2bd60 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38  ev, n, (const u8
2bd70 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  *)z);..    if( r
2bd80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2bd90 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64  cksum3!=expected
2bda0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46   ){.      rc = F
2bdb0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2bdc0 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d   }.    *pCksum =
2bdd0 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70   cksum3;.  }.  p
2bde0 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23  ->rc = rc;.}. .#
2bdf0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
2be00 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
2be10 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69  se(x,y,z).# defi
2be20 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  ne fts5TestTerm(
2be30 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
2be40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
2be50 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31   that:.**.**   1
2be60 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20  ) All leaves of 
2be70 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46 69  pSeg between iFi
2be80 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69  rst and iLast (i
2be90 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20  nclusive) exist 
2bea0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74  and.**      cont
2beb0 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a  ain zero terms..
2bec0 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76  **   2) All leav
2bed0 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65  es of pSeg betwe
2bee0 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20  en iNoRowid and 
2bef0 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65  iLast (inclusive
2bf00 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20  ) exist and.**  
2bf10 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f      contain zero
2bf20 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74   rowids..*/.stat
2bf30 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
2bf40 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45  xIntegrityCheckE
2bf50 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65  mpty(.  Fts5Inde
2bf60 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75  x *p,.  Fts5Stru
2bf70 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
2bf80 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg,     /* Segme
2bf90 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
2bfa0 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
2bfb0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
2bfc0 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64  ,.  int iNoRowid
2bfd0 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b  ,.  int iLast.){
2bfe0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
2bff0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2c000 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
2c010 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
2c020 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
2c030 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20  .  ** (a) exist 
2c040 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
2c050 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66  no terms. */.  f
2c060 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e  or(i=iFirst; p->
2c070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c080 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b   i<=iLast; i++){
2c090 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
2c0a0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
2c0b0 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
2c0c0 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
2c0d0 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20  iSegid, i));.   
2c0e0 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
2c0f0 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61      if( !fts5Lea
2c100 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61  fIsTermless(pLea
2c110 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  f) ) p->rc = FTS
2c120 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2c130 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64   if( i>=iNoRowid
2c140 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46   && 0!=fts5LeafF
2c150 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
2c160 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
2c170 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2c180 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
2c190 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
2c1a0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
2c1b0 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
2c1c0 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64  eckPgidx(Fts5Ind
2c1d0 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20  ex *p, Fts5Data 
2c1e0 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69  *pLeaf){.  int i
2c1f0 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69  TermOff = 0;.  i
2c200 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75  nt ii;..  Fts5Bu
2c210 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30  ffer buf1 = {0,0
2c220 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65  ,0};.  Fts5Buffe
2c230 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d  r buf2 = {0,0,0}
2c240 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d  ;..  ii = pLeaf-
2c250 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65  >szLeaf;.  while
2c260 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26  ( ii<pLeaf->nn &
2c270 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
2c280 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  OK ){.    int re
2c290 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  s;.    int iOff;
2c2a0 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a  .    int nIncr;.
2c2b0 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47  .    ii += fts5G
2c2c0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2c2d0 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29  f->p[ii], nIncr)
2c2e0 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b  ;.    iTermOff +
2c2f0 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66  = nIncr;.    iOf
2c300 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20  f = iTermOff;.. 
2c310 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
2c320 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2c330 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2c340 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
2c350 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
2c360 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20  ==nIncr ){.     
2c370 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20   int nByte;.    
2c380 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2c390 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
2c3a0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  ->p[iOff], nByte
2c3b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f  );.      if( (iO
2c3c0 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d  ff+nByte)>pLeaf-
2c3d0 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
2c3e0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2c3f0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2c400 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
2c410 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
2c420 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65  rc, &buf1, nByte
2c430 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  , &pLeaf->p[iOff
2c440 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2c450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2c460 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20   nKeep, nByte;. 
2c470 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2c480 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2c490 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b  eaf->p[iOff], nK
2c4a0 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  eep);.      iOff
2c4b0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2c4c0 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
2c4d0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
2c4e0 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66     if( nKeep>buf
2c4f0 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79  1.n || (iOff+nBy
2c500 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  te)>pLeaf->szLea
2c510 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
2c520 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2c530 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
2c540 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d          buf1.n =
2c550 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20   nKeep;.        
2c560 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
2c570 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
2c580 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61  f1, nByte, &pLea
2c590 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  f->p[iOff]);.   
2c5a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
2c5b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2c5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
2c5d0 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  = fts5BufferComp
2c5e0 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66 32  are(&buf1, &buf2
2c5f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2c600 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  es<=0 ) p->rc = 
2c610 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2c620 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c630 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
2c640 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66  ->rc, &buf2, buf
2c650 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20  1.n, buf1.p);.  
2c660 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  }..  fts5BufferF
2c670 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74  ree(&buf1);.  ft
2c680 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
2c690 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  f2);.}..static v
2c6a0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
2c6b0 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
2c6c0 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nt(.  Fts5Index 
2c6d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2c6e0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
2c6f0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
2c700 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
2c710 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20  egment *pSeg    
2c720 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
2c730 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63  check internal c
2c740 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b  onsistency */.){
2c750 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2c760 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
2c770 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  fig;.  sqlite3_s
2c780 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
2c790 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74    int rc2;.  int
2c7a0 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20   iIdxPrevLeaf = 
2c7b0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d  pSeg->pgnoFirst-
2c7c0 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50  1;.  int iDlidxP
2c7d0 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e  revLeaf = pSeg->
2c7e0 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28  pgnoLast;..  if(
2c7f0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2c800 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
2c810 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
2c820 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c  eStmt(p, &pStmt,
2c830 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2c840 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  (.      "SELECT 
2c850 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67  segid, term, (pg
2c860 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29  no>>1), (pgno&1)
2c870 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78   FROM %Q.'%q_idx
2c880 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64  ' WHERE segid=%d
2c890 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  ",.      pConfig
2c8a0 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
2c8b0 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65  zName, pSeg->iSe
2c8c0 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  gid.  ));..  /* 
2c8d0 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
2c8e0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
2c8f0 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c  rchy.  */.  whil
2c900 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
2c910 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
2c920 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
2c930 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36  pStmt) ){.    i6
2c940 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 iRow;         
2c950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c960 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65  owid for this le
2c970 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61  af */.    Fts5Da
2c980 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
2c990 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
2c9a0 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
2c9b0 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65  ..    int nIdxTe
2c9c0 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rm = sqlite3_col
2c9d0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
2c9e0 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   1);.    const c
2c9f0 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20  har *zIdxTerm = 
2ca00 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
2ca10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2ca20 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
2ca30 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73  int iIdxLeaf = s
2ca40 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2ca50 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  t(pStmt, 2);.   
2ca60 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d   int bIdxDlidx =
2ca70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2ca80 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a  int(pStmt, 3);..
2ca90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
2caa0 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
2cab0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2cac0 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
2cad0 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
2cae0 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
2caf0 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
2cb00 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
2cb10 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
2cb20 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c     if( iIdxLeaf<
2cb30 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
2cb40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2cb50 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d  iRow = FTS5_SEGM
2cb60 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
2cb70 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
2cb80 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
2cb90 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20 69  ts5LeafRead(p, i
2cba0 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Row);.    if( pL
2cbb0 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
2cbc0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
2cbd0 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74  at the leaf cont
2cbe0 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
2cbf0 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74  e term, and that
2cc00 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20   it is equal.   
2cc10 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72   ** to or larger
2cc20 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d   than the split-
2cc30 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e  key in zIdxTerm.
2cc40 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61    Also check tha
2cc50 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a  t if there.    *
2cc60 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69  * is also a rowi
2cc70 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e  d pointer within
2cc80 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68   the leaf page h
2cc90 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73  eader, it points
2cca0 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63   to a.    ** loc
2ccb0 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65  ation before the
2ccc0 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69   term.  */.    i
2ccd0 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c  f( pLeaf->nn<=pL
2cce0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2ccf0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2cd00 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2cd10 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
2cd20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
2cd30 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2cd40 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20  t of first term 
2cd50 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20  on leaf */.     
2cd60 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20   int iRowidOff; 
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cd80 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
2cd90 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f  rowid on leaf */
2cda0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
2cdb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cdc0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
2cdd0 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79  rm on leaf in by
2cde0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tes */.      int
2cdf0 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
2ce00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
2ce10 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61  arison of term a
2ce20 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a  nd split-key */.
2ce30 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74  .      iOff = ft
2ce40 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
2ce50 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
2ce60 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
2ce70 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
2ce80 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
2ce90 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d   if( iRowidOff>=
2cea0 69 4f 66 66 20 7c 7c 20 69 4f 66 66 3e 3d 70 4c  iOff || iOff>=pL
2ceb0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2cec0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
2ced0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2cee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cef0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2cf00 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
2cf10 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d  ->p[iOff], nTerm
2cf20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  );.        res =
2cf30 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e   memcmp(&pLeaf->
2cf40 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65 72  p[iOff], zIdxTer
2cf50 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e 49  m, MIN(nTerm, nI
2cf60 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20  dxTerm));.      
2cf70 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
2cf80 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49 64  es = nTerm - nId
2cf90 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  xTerm;.        i
2cfa0 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72 63  f( res<0 ) p->rc
2cfb0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2cfc0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2cfd0 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68 65  fts5IntegrityChe
2cfe0 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65 61 66  ckPgidx(p, pLeaf
2cff0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
2d000 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
2d010 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  af);.    if( p->
2d020 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  rc ) break;..   
2d030 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68   /* Now check th
2d040 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70  at the iter.nEmp
2d050 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  ty leaves follow
2d060 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
2d070 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20  leaf.    ** (a) 
2d080 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f  exist and (b) co
2d090 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20  ntain no terms. 
2d0a0 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  */.    fts5Index
2d0b0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d  IntegrityCheckEm
2d0c0 70 74 79 28 0a 20 20 20 20 20 20 20 20 70 2c 20  pty(.        p, 
2d0d0 70 53 65 67 2c 20 69 49 64 78 50 72 65 76 4c 65  pSeg, iIdxPrevLe
2d0e0 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72 65 76  af+1, iDlidxPrev
2d0f0 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65 61 66  Leaf+1, iIdxLeaf
2d100 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  -1.    );.    if
2d110 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
2d120 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2d130 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
2d140 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74  ndex, check that
2d150 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e   it looks right.
2d160 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 64 78   */.    if( bIdx
2d170 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46  Dlidx ){.      F
2d180 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
2d190 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f  lidx = 0;  /* Fo
2d1a0 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
2d1b0 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ugh doclist inde
2d1c0 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  x */.      int i
2d1d0 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c  PrevLeaf = iIdxL
2d1e0 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  eaf;.      int i
2d1f0 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53  Segid = pSeg->iS
2d200 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  egid;.      int 
2d210 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  iPg = 0;.      i
2d220 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20  64 iKey;..      
2d230 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
2d240 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
2d250 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c  0, iSegid, iIdxL
2d260 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
2d270 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
2d280 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
2d290 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c            fts5Dl
2d2a0 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70  idxIterNext(p, p
2d2b0 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29 7b 0a  Dlidx).      ){.
2d2c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2d2d0 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73  k any rowid-less
2d2e0 20 70 61 67 65 73 20 74 68 61 74 20 6f 63 63 75   pages that occu
2d2f0 72 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  r before the cur
2d300 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20  rent leaf. */.  
2d310 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50        for(iPg=iP
2d320 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66  revLeaf+1; iPg<f
2d330 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2d340 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29  (pDlidx); iPg++)
2d350 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 79  {.          iKey
2d360 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
2d370 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 50  ROWID(iSegid, iP
2d380 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  g);.          pL
2d390 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
2d3a0 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
2d3b0 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
2d3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d3d0 69 66 28 20 66 74 73 35 4c 65 61 66 46 69 72 73  if( fts5LeafFirs
2d3e0 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
2d3f0 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  !=0 ) p->rc = FT
2d400 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2d410 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
2d420 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
2d430 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d440 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50      }.        iP
2d450 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35 44 6c  revLeaf = fts5Dl
2d460 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
2d470 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  dx);..        /*
2d480 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2d490 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69 63 61  leaf page indica
2d4a0 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61  ted by the itera
2d4b0 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a  tor really does.
2d4c0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
2d4d0 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75 67  in the rowid sug
2d4e0 67 65 73 74 65 64 20 62 79 20 74 68 65 20 73 61  gested by the sa
2d4f0 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  me. */.        i
2d500 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Key = FTS5_SEGME
2d510 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
2d520 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20 20   iPrevLeaf);.   
2d530 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
2d540 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65  5DataRead(p, iKe
2d550 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
2d560 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
2d570 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20     i64 iRowid;. 
2d580 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f           int iRo
2d590 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61  widOff = fts5Lea
2d5a0 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
2d5b0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
2d5c0 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
2d5d0 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  K(pLeaf);.      
2d5e0 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
2d5f0 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  f>=pLeaf->szLeaf
2d600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d610 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2d620 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
2d630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d640 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
2d650 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69  (&pLeaf->p[iRowi
2d660 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52  dOff], (u64*)&iR
2d670 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
2d680 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66     if( iRowid!=f
2d690 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
2d6a0 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72  d(pDlidx) ) p->r
2d6b0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2d6c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d6d0 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
2d6e0 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
2d6f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d700 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50  }..      iDlidxP
2d710 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a 20  revLeaf = iPg;. 
2d720 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2d730 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
2d740 20 20 20 20 20 20 66 74 73 35 54 65 73 74 44 6c        fts5TestDl
2d750 69 64 78 52 65 76 65 72 73 65 28 70 2c 20 69 53  idxReverse(p, iS
2d760 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b  egid, iIdxLeaf);
2d770 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d780 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66    iDlidxPrevLeaf
2d790 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
2d7a0 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  t;.      /* TODO
2d7b0 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20 69 73  : Check there is
2d7c0 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64 65   no doclist inde
2d7d0 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  x */.    }..    
2d7e0 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69  iIdxPrevLeaf = i
2d7f0 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20  IdxLeaf;.  }..  
2d800 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
2d810 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2d820 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2d830 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
2d840 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 20  rc2;..  /* Page 
2d850 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20  iter.iLeaf must 
2d860 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67 68 74  now be the right
2d870 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69  most leaf-page i
2d880 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f  n the segment */
2d890 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e  .#if 0.  if( p->
2d8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d8b0 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65   iter.iLeaf!=pSe
2d8c0 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
2d8d0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2d8e0 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65 6e  CORRUPT;.  }.#en
2d8f0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75  dif.}.../*.** Ru
2d900 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  n internal check
2d910 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
2d920 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28   the FTS index (
2d930 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  a) is internally
2d940 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20   .** consistent 
2d950 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73  and (b) contains
2d960 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69   entries for whi
2d970 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68  ch the XOR of th
2d980 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61  e checksums.** a
2d990 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20  s calculated by 
2d9a0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2d9b0 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20  EntryCksum() is 
2d9c0 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cksum..**.** Ret
2d9d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2d9e0 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  PT if any of the
2d9f0 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
2da00 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65   fail, or if the
2da10 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  .** checksum doe
2da20 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74  s not match. Ret
2da30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
2da40 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73   all checks pass
2da50 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f   without.** erro
2da60 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  r, or some other
2da70 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2da80 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72  de if another er
2da90 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a  ror (e.g. OOM).*
2daa0 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
2dab0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2dac0 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  xIntegrityCheck(
2dad0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36  Fts5Index *p, u6
2dae0 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  4 cksum){.  int 
2daf0 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f  eDetail = p->pCo
2db00 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20  nfig->eDetail;. 
2db10 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b   u64 cksum2 = 0;
2db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db30 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73   /* Checksum bas
2db40 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f  ed on contents o
2db50 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46  f indexes */.  F
2db60 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73  ts5Buffer poslis
2db70 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f  t = {0,0,0};   /
2db80 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f  * Buffer used to
2db90 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74 20   hold a poslist 
2dba0 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  */.  Fts5Iter *p
2dbb0 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
2dbc0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
2dbd0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2dbe0 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a  entire index */.
2dbf0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
2dc00 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20  *pStruct;       
2dc10 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
2dc20 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ture */..#ifdef 
2dc30 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
2dc40 2a 20 55 73 65 64 20 62 79 20 65 78 74 72 61 20  * Used by extra 
2dc50 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20 6f  internal tests o
2dc60 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42 55  nly run if NDEBU
2dc70 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
2dc80 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 33   */.  u64 cksum3
2dc90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2dca0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
2dcb0 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65  m based on conte
2dcc0 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a  nts of indexes *
2dcd0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
2dce0 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  erm = {0,0,0};  
2dcf0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
2dd00 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20  ed to hold most 
2dd10 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 23  recent term */.#
2dd20 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 69 6e  endif.  const in
2dd30 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e  t flags = FTS5IN
2dd40 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50  DEX_QUERY_NOOUTP
2dd50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61 64  UT;.  .  /* Load
2dd60 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73   the FTS index s
2dd70 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 53  tructure */.  pS
2dd80 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
2dd90 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20  ctureRead(p);.. 
2dda0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2ddb0 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
2ddc0 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65 6e  s of each segmen
2ddd0 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61 76  t match the leav
2dde0 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72  es */.  if( pStr
2ddf0 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uct ){.    int i
2de00 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 66  Lvl, iSeg;.    f
2de10 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
2de20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
2de30 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
2de40 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
2de50 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  <pStruct->aLevel
2de60 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65  [iLvl].nSeg; iSe
2de70 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74  g++){.        Ft
2de80 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2de90 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74 72  nt *pSeg = &pStr
2dea0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
2deb0 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ].aSeg[iSeg];.  
2dec0 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 49        fts5IndexI
2ded0 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67  ntegrityCheckSeg
2dee0 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a 20  ment(p, pSeg);. 
2def0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2df00 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73 75 6d  ..  /* The cksum
2df10 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
2df20 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2df30 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75 6d 20  n is a checksum 
2df40 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a 20  calculated.  ** 
2df50 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78 70  based on all exp
2df60 65 63 74 65 64 20 65 6e 74 72 69 65 73 20 69 6e  ected entries in
2df70 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28   the FTS index (
2df80 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66 69 78  including prefix
2df90 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74 72   index.  ** entr
2dfa0 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f 63 6b  ies). This block
2dfb0 20 63 68 65 63 6b 73 20 74 68 61 74 20 61 20 63   checks that a c
2dfc0 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74  hecksum calculat
2dfd0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  ed based on the.
2dfe0 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74    ** actual cont
2dff0 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e 64 65  ents of FTS inde
2e000 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c 2e 0a  x is identical..
2e010 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76 65    **.  ** Two ve
2e020 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61  rsions of the sa
2e030 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72 65 20  me checksum are 
2e040 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68 65 20  calculated. The 
2e050 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20 20 2a  first (stack.  *
2e060 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73 75 6d  * variable cksum
2e070 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e 74 72  2) based on entr
2e080 69 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  ies extracted fr
2e090 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  om the full-text
2e0a0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69 6c   index.  ** whil
2e0b0 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61 72  e doing a linear
2e0c0 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20 69 6e   scan of each in
2e0d0 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78 20 69  dividual index i
2e0e0 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20  n turn. .  **.  
2e0f0 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72 6d 20  ** As each term 
2e100 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20 6c  visited by the l
2e110 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61 20 73  inear scans, a s
2e120 65 70 61 72 61 74 65 20 71 75 65 72 79 20 66 6f  eparate query fo
2e130 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  r the.  ** same 
2e140 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72 6d 65  term is performe
2e150 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63 61 6c  d. cksum3 is cal
2e160 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  culated based on
2e170 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20 20 2a   the entries.  *
2e180 2a 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74  * extracted by t
2e190 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a 20 20  hese queries..  
2e1a0 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c  */.  for(fts5Mul
2e1b0 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
2e1c0 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c 20  ruct, flags, 0, 
2e1d0 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49  0, 0, -1, 0, &pI
2e1e0 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ter);.      fts5
2e1f0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
2e200 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  pIter)==0;.     
2e210 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
2e220 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
2e230 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  0).  ){.    int 
2e240 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2e250 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2e260 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73  of term in bytes
2e270 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f 73   */.    i64 iPos
2e280 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e290 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
2e2a0 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69 73  read from poslis
2e2b0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66  t */.    int iOf
2e2c0 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
2e2d0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 77       /* Offset w
2e2e0 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a 2f  ithin poslist */
2e2f0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
2e300 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
2e310 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
2e320 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72   char *z = (char
2e330 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
2e340 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
2e350 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2e360 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20 71  is a new term, q
2e370 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70 64  uery for it. Upd
2e380 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68 20  ate cksum3 with 
2e390 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a  the results. */.
2e3a0 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72 6d      fts5TestTerm
2e3b0 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c  (p, &term, z, n,
2e3c0 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33   cksum2, &cksum3
2e3d0 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74  );..    if( eDet
2e3e0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
2e3f0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
2e400 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c 74 69 49  f( 0==fts5MultiI
2e410 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49  terIsEmpty(p, pI
2e420 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ter) ){.        
2e430 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65  cksum2 ^= sqlite
2e440 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2e450 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 30 2c 20  ksum(iRowid, 0, 
2e460 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20  0, -1, z, n);.  
2e470 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2e480 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74 2e 6e  .      poslist.n
2e490 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73 35   = 0;.      fts5
2e4a0 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
2e4b0 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  , &pIter->aSeg[p
2e4c0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
2e4d0 69 46 69 72 73 74 5d 2c 20 30 2c 20 26 70 6f 73  iFirst], 0, &pos
2e4e0 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  list);.      whi
2e4f0 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74  le( 0==sqlite3Ft
2e500 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
2e510 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69  poslist.p, posli
2e520 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50  st.n, &iOff, &iP
2e530 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  os) ){.        i
2e540 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50  nt iCol = FTS5_P
2e550 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b  OS2COLUMN(iPos);
2e560 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 6f  .        int iTo
2e570 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32  kOff = FTS5_POS2
2e580 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a 20 20  OFFSET(iPos);.  
2e590 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20        cksum2 ^= 
2e5a0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2e5b0 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69  EntryCksum(iRowi
2e5c0 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66  d, iCol, iTokOff
2e5d0 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  , -1, z, n);.   
2e5e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2e5f0 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c   fts5TestTerm(p,
2e600 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63 6b   &term, 0, 0, ck
2e610 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a  sum2, &cksum3);.
2e620 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
2e630 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 69  Free(pIter);.  i
2e640 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2e650 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b  _OK && cksum!=ck
2e660 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46  sum2 ) p->rc = F
2e670 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
2e680 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
2e690 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 23  ease(pStruct);.#
2e6a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2e6b0 55 47 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  UG.  fts5BufferF
2e6c0 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65 6e 64  ree(&term);.#end
2e6d0 69 66 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  if.  fts5BufferF
2e6e0 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a 20  ree(&poslist);. 
2e6f0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
2e700 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
2e710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e750 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2e760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e7a0 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68  ****.** Below th
2e7b0 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20  is point is the 
2e7c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2e7d0 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
2e7e0 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75  e() scalar.** fu
2e7f0 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a  nction only..*/.
2e800 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
2e810 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77  segment-data row
2e820 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  id from the %_da
2e830 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  ta table. This f
2e840 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68  unction is.** th
2e850 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61  e opposite of ma
2e860 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  cro FTS5_SEGMENT
2e870 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61  _ROWID()..*/.sta
2e880 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
2e890 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20  odeRowid(.  i64 
2e8a0 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2e8c0 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61  owid from %_data
2e8d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2e8e0 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  *piSegid,       
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e900 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a  UT: Segment id *
2e910 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64 78  /.  int *pbDlidx
2e920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e930 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64      /* OUT: Dlid
2e940 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20  x flag */.  int 
2e950 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20 20  *piHeight,      
2e960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e970 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20  UT: Height */.  
2e980 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20  int *piPgno     
2e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9a0 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d  /* OUT: Page num
2e9b0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50  ber */.){.  *piP
2e9c0 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  gno = (int)(iRow
2e9d0 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
2e9e0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
2e9f0 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77  B) - 1));.  iRow
2ea00 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
2ea10 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48  _PAGE_B;..  *piH
2ea20 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52  eight = (int)(iR
2ea30 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
2ea40 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  << FTS5_DATA_HEI
2ea50 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  GHT_B) - 1));.  
2ea60 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
2ea70 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a  DATA_HEIGHT_B;..
2ea80 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69 6e    *pbDlidx = (in
2ea90 74 29 28 69 52 6f 77 69 64 20 26 20 30 78 30 30  t)(iRowid & 0x00
2eaa0 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  01);.  iRowid >>
2eab0 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f  = FTS5_DATA_DLI_
2eac0 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20 3d  B;..  *piSegid =
2ead0 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
2eae0 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
2eaf0 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31 29  _DATA_ID_B) - 1)
2eb00 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
2eb10 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64  d fts5DebugRowid
2eb20 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
2eb30 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34  uffer *pBuf, i64
2eb40 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 53   iKey){.  int iS
2eb50 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69  egid, iHeight, i
2eb60 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20 20  Pgno, bDlidx;   
2eb70 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d      /* Rowid com
2eb80 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73  penents */.  fts
2eb90 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b 65  5DecodeRowid(iKe
2eba0 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c  y, &iSegid, &bDl
2ebb0 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26  idx, &iHeight, &
2ebc0 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69  iPgno);..  if( i
2ebd0 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
2ebe0 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41  if( iKey==FTS5_A
2ebf0 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b  VERAGES_ROWID ){
2ec00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2ec10 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2ec20 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2ec30 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29 3b 0a  "{averages} ");.
2ec40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ec50 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2ec60 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2ec70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74 72 75  Rc, pBuf, "{stru
2ec80 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d 0a  cture}");.    }.
2ec90 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20    }.  else{.    
2eca0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2ecb0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2ecc0 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73 65 67  c, pBuf, "{%sseg
2ecd0 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d  id=%d h=%d pgno=
2ece0 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 62 44  %d}",.        bD
2ecf0 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22 20  lidx ? "dlidx " 
2ed00 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69 48  : "", iSegid, iH
2ed10 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20  eight, iPgno.   
2ed20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
2ed30 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
2ed40 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74  Structure(.  int
2ed50 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ed70 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f  IN/OUT: error co
2ed80 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2ed90 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73 35  er *pBuf,.  Fts5
2eda0 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a  Structure *p.){.
2edb0 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
2edc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2edd0 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
2ede0 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65 67  ough levels, seg
2edf0 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28  ments */..  for(
2ee00 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e  iLvl=0; iLvl<p->
2ee10 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
2ee20 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
2ee30 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
2ee40 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  &p->aLevel[iLvl]
2ee50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2ee60 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2ee70 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a  ntf(pRc, pBuf, .
2ee80 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25          " {lvl=%
2ee90 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65 67  d nMerge=%d nSeg
2eea0 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  =%d", iLvl, pLvl
2eeb0 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d 3e  ->nMerge, pLvl->
2eec0 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  nSeg.    );.    
2eed0 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
2eee0 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65  <pLvl->nSeg; iSe
2eef0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  g++){.      Fts5
2ef00 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2ef10 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
2ef20 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
2ef30 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2ef40 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2ef50 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b 69 64  pRc, pBuf, " {id
2ef60 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25  =%d leaves=%d..%
2ef70 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d}", .          
2ef80 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 53  pSeg->iSegid, pS
2ef90 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70  eg->pgnoFirst, p
2efa0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20  Seg->pgnoLast.  
2efb0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
2efc0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2efd0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2efe0 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a  Rc, pBuf, "}");.
2eff0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2f000 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  s is part of the
2f010 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
2f020 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a  ebugging aid..**
2f030 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42  .** Arguments pB
2f040 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69  lob/nBlob contai
2f050 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46  n a serialized F
2f060 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
2f070 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ect. This.** fun
2f080 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
2f090 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72  human-readable r
2f0a0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2f0b0 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74   the same object
2f0c0 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65  .** to the buffe
2f0d0 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
2f0e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2f0f0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
2f100 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63   fts5DecodeStruc
2f110 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ture(.  int *pRc
2f120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f130 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2f140 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: error code */
2f150 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2f160 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20  Buf,.  const u8 
2f170 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
2f180 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  b.){.  int rc;  
2f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2f1b0 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53   code */.  Fts5S
2f1c0 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b  tructure *p = 0;
2f1d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
2f1e0 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65 20  coded structure 
2f1f0 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20  object */..  rc 
2f200 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  = fts5StructureD
2f210 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c  ecode(pBlob, nBl
2f220 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66  ob, 0, &p);.  if
2f230 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f240 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  ){.    *pRc = rc
2f250 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2f260 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53 74  }..  fts5DebugSt
2f270 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42 75  ructure(pRc, pBu
2f280 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72  f, p);.  fts5Str
2f290 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 29  uctureRelease(p)
2f2a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2f2b0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
2f2c0 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62  ts5_decode() deb
2f2d0 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a  ugging aid..**.*
2f2e0 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f  * Arguments pBlo
2f2f0 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20  b/nBlob contain 
2f300 61 6e 20 22 61 76 65 72 61 67 65 73 22 20 72 65  an "averages" re
2f310 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e 63 74  cord. This funct
2f320 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64 73 20  ion .** appends 
2f330 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
2f340 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2f350 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74 68 65  of record to the
2f360 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 0a   buffer passed .
2f370 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
2f380 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73   argument. .*/.s
2f390 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2f3a0 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 0a 20  ecodeAverages(. 
2f3b0 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
2f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3d0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f   /* IN/OUT: erro
2f3e0 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
2f3f0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20  Buffer *pBuf,.  
2f400 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c  const u8 *pBlob,
2f410 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20   int nBlob.){.  
2f420 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f 6e  int i = 0;.  con
2f430 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63 65 20  st char *zSpace 
2f440 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65 28 20  = "";..  while( 
2f450 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 75  i<nBlob ){.    u
2f460 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b  64 iVal;.    i +
2f470 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
2f480 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b 69 5d  Varint(&pBlob[i]
2f490 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 73 71  , &iVal);.    sq
2f4a0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2f4b0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2f4c0 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c 20 7a   pBuf, "%s%d", z
2f4d0 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56 61 6c  Space, (int)iVal
2f4e0 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20 3d 20  );.    zSpace = 
2f4f0 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  " ";.  }.}../*.*
2f500 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20 69  * Buffer (a/n) i
2f510 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
2f520 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 73  tain a list of s
2f530 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74  erialized varint
2f540 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68 20  s. Read.** each 
2f550 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e  varint and appen
2f560 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65 70  d its string rep
2f570 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62  resentation to b
2f580 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74 75  uffer pBuf. Retu
2f590 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74 68  rn.** after eith
2f5a0 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  er the input buf
2f5b0 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65 64  fer is exhausted
2f5c0 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69 73   or a 0 value is
2f5d0 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   read..**.** The
2f5e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
2f5f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2f600 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ytes read from t
2f610 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e  he input buffer.
2f620 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2f630 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
2f640 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
2f650 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e  uffer *pBuf, con
2f660 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29  st u8 *a, int n)
2f670 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30  {.  int iOff = 0
2f680 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c  ;.  while( iOff<
2f690 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61  n ){.    int iVa
2f6a0 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  l;.    iOff += f
2f6b0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2f6c0 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a  a[iOff], iVal);.
2f6d0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2f6e0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2f6f0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25  f(pRc, pBuf, " %
2f700 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20  d", iVal);.  }. 
2f710 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a   return iOff;.}.
2f720 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72 74  ./*.** The start
2f730 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e 29   of buffer (a/n)
2f740 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74   contains the st
2f750 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  art of a doclist
2f760 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a  . The doclist.**
2f770 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
2f780 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74 68  finish within th
2f790 65 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66  e buffer. This f
2f7a0 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
2f7b0 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65 73  a text.** repres
2f7c0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2f7d0 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63 6c  part of the docl
2f7e0 69 73 74 20 74 68 61 74 20 69 73 20 70 72 65 73  ist that is pres
2f7f0 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a  ent to buffer.**
2f800 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68   pBuf. .**.** Th
2f810 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2f820 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2f830 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
2f840 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2f850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f860 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
2f870 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
2f880 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
2f890 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
2f8a0 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64 20  ){.  i64 iDocid 
2f8b0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20  = 0;.  int iOff 
2f8c0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20  = 0;..  if( n>0 
2f8d0 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 73 71  ){.    iOff = sq
2f8e0 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2f8f0 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69 44 6f  nt(a, (u64*)&iDo
2f900 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  cid);.    sqlite
2f910 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2f920 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2f930 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69  f, " id=%lld", i
2f940 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68  Docid);.  }.  wh
2f950 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
2f960 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
2f970 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20 20 69   int bDel;.    i
2f980 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f  Off += fts5GetPo
2f990 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66  slistSize(&a[iOf
2f9a0 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 65 6c  f], &nPos, &bDel
2f9b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2f9c0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2f9d0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2f9e0 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20 6e 50  " nPos=%d%s", nP
2f9f0 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22 22 29  os, bDel?"*":"")
2fa00 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
2fa10 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
2fa20 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b 69 4f  pRc, pBuf, &a[iO
2fa30 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c  ff], MIN(n-iOff,
2fa40 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69 66 28   nPos));.    if(
2fa50 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
2fa60 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   i64 iDelta;.   
2fa70 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
2fa80 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2fa90 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
2faa0 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
2fab0 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61  iDocid += iDelta
2fac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
2fad0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2fae0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2faf0 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f   " id=%lld", iDo
2fb00 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  cid);.    }.  }.
2fb10 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
2fb20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2fb30 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  nction is part o
2fb40 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
2fb50 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 66 75  e() debugging fu
2fb60 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 0a 2a  nction. It is .*
2fb70 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  * only ever used
2fb80 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e   with detail=non
2fb90 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  e tables..**.** 
2fba0 42 75 66 66 65 72 20 28 70 44 61 74 61 2f 6e 44  Buffer (pData/nD
2fbb0 61 74 61 29 20 63 6f 6e 74 61 69 6e 73 20 61 20  ata) contains a 
2fbc0 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 65 20 66  doclist in the f
2fbd0 6f 72 6d 61 74 20 75 73 65 64 20 62 79 20 64 65  ormat used by de
2fbe0 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74 61 62  tail=none.** tab
2fbf0 6c 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  les. This functi
2fc00 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d  on appends a hum
2fc10 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65 72 73  an-readable vers
2fc20 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ion of that list
2fc30 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42   to.** buffer pB
2fc40 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  uf..**.** If *pR
2fc50 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20  c is other than 
2fc60 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
2fc70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2fc80 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a  called, it is a.
2fc90 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e 20  ** no-op. If an 
2fca0 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20 65 72 72  OOM or other err
2fcb0 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
2fcc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2fcd0 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65 74 20 74  *pRc is.** set t
2fce0 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  o an SQLite erro
2fcf0 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72 65  r code before re
2fd00 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 66 69 6e  turning. The fin
2fd10 61 6c 20 73 74 61 74 65 20 6f 66 20 62 75 66 66  al state of buff
2fd20 65 72 0a 2a 2a 20 70 42 75 66 20 69 73 20 75 6e  er.** pBuf is un
2fd30 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
2fd40 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
2fd50 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 52  void fts5DecodeR
2fd60 6f 77 69 64 4c 69 73 74 28 0a 20 20 69 6e 74 20  owidList(.  int 
2fd70 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
2fd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2fd90 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
2fda0 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
2fdb0 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
2fdc0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
2fdd0 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78 74 20   to append text 
2fde0 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  to */.  const u8
2fdf0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
2fe00 74 61 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20  ta      /* Data 
2fe10 74 6f 20 64 65 63 6f 64 65 20 6c 69 73 74 2d 6f  to decode list-o
2fe20 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d 20 2a 2f  f-rowids from */
2fe30 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  .){.  int i = 0;
2fe40 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20  .  i64 iRowid = 
2fe50 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e  0;..  while( i<n
2fe60 44 61 74 61 20 29 7b 0a 20 20 20 20 63 6f 6e 73  Data ){.    cons
2fe70 74 20 63 68 61 72 20 2a 7a 41 70 70 20 3d 20 22  t char *zApp = "
2fe80 22 3b 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b  ";.    u64 iVal;
2fe90 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  .    i += sqlite
2fea0 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
2feb0 70 44 61 74 61 5b 69 5d 2c 20 26 69 56 61 6c 29  pData[i], &iVal)
2fec0 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20  ;.    iRowid += 
2fed0 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66 28 20 69  iVal;..    if( i
2fee0 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74 61 5b  <nData && pData[
2fef0 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20 20  i]==0x00 ){.    
2ff00 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    i++;.      if(
2ff10 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74   i<nData && pDat
2ff20 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20  a[i]==0x00 ){.  
2ff30 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
2ff40 20 20 20 7a 41 70 70 20 3d 20 22 2b 22 3b 0a 20     zApp = "+";. 
2ff50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ff60 20 20 20 20 7a 41 70 70 20 3d 20 22 2a 22 3b 0a      zApp = "*";.
2ff70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2ff80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ff90 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ffa0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25 6c  (pRc, pBuf, " %l
2ffb0 6c 64 25 73 22 2c 20 69 52 6f 77 69 64 2c 20 7a  ld%s", iRowid, z
2ffc0 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  App);.  }.}../*.
2ffd0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
2ffe0 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65  ation of user-de
2fff0 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
30000 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64  ction fts5_decod
30010 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
30020 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46 75  oid fts5DecodeFu
30030 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
30040 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
30050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
30060 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
30070 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
30080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30090 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
300a0 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79  r of args (alway
300b0 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s 2) */.  sqlite
300c0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
300d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
300e0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
300f0 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77  */.){.  i64 iRow
30100 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
30110 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
30120 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e   for record bein
30130 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69  g decoded */.  i
30140 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69 67 68  nt iSegid,iHeigh
30150 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f  t,iPgno,bDlidx;/
30160 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e  * Rowid componen
30170 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ts */.  const u8
30180 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20   *aBlob; int n; 
30190 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72          /* Recor
301a0 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20  d to decode */. 
301b0 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74   u8 *a = 0;.  Ft
301c0 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20 20  s5Buffer s;     
301d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
301e0 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20 74   Build up text t
301f0 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f  o return here */
30200 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30210 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30220 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30230 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63  e */.  int nSpac
30240 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 44 65  e = 0;.  int eDe
30250 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71 6c 69  tailNone = (sqli
30260 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
30270 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73 73 65  tx)!=0);..  asse
30280 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20  rt( nArg==2 );. 
30290 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e 41   UNUSED_PARAM(nA
302a0 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  rg);.  memset(&s
302b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
302c0 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f 77  Buffer));.  iRow
302d0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
302e0 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30  ue_int64(apVal[0
302f0 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  ]);..  /* Make a
30300 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
30310 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61 20  ond argument (a 
30320 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b 5d  blob) in aBlob[]
30330 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20 20  . The aBlob[].  
30340 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c 6f  ** copy is follo
30350 77 65 64 20 62 79 20 46 54 53 35 5f 44 41 54 41  wed by FTS5_DATA
30360 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30 78  _ZERO_PADDING 0x
30370 30 30 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  00 bytes, which 
30380 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62 75  prevents.  ** bu
30390 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 20 65  ffer overreads e
303a0 76 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f 72  ven if the recor
303b0 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 2a  d is corrupt.  *
303c0 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  /.  n = sqlite3_
303d0 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61  value_bytes(apVa
303e0 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d  l[1]);.  aBlob =
303f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
30400 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  lob(apVal[1]);. 
30410 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46 54   nSpace = n + FT
30420 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
30430 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a  DING;.  a = (u8*
30440 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
30450 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61  ocZero(&rc, nSpa
30460 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20  ce);.  if( a==0 
30470 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75  ) goto decode_ou
30480 74 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 20 6d  t;.  if( n>0 ) m
30490 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20  emcpy(a, aBlob, 
304a0 6e 29 3b 0a 0a 20 20 66 74 73 35 44 65 63 6f 64  n);..  fts5Decod
304b0 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26  eRowid(iRowid, &
304c0 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c  iSegid, &bDlidx,
304d0 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e   &iHeight, &iPgn
304e0 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67  o);..  fts5Debug
304f0 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69  Rowid(&rc, &s, i
30500 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44  Rowid);.  if( bD
30510 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35  lidx ){.    Fts5
30520 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20  Data dlidx;.    
30530 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c  Fts5DlidxLvl lvl
30540 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d  ;..    dlidx.p =
30550 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e   a;.    dlidx.nn
30560 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65   = n;..    memse
30570 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(&lvl, 0, sizeo
30580 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
30590 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20  ;.    lvl.pData 
305a0 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76  = &dlidx;.    lv
305b0 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50  l.iLeafPgno = iP
305c0 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74  gno;..    for(ft
305d0 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
305e0 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d  lvl); lvl.bEof==
305f0 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  0; fts5DlidxLvlN
30600 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20  ext(&lvl)){.    
30610 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
30620 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
30630 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20  &rc, &s, .      
30640 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c      " %d(%lld)",
30650 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20   lvl.iLeafPgno, 
30660 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20  lvl.iRowid.     
30670 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
30680 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20  e if( iSegid==0 
30690 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  ){.    if( iRowi
306a0 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  d==FTS5_AVERAGES
306b0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
306c0 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67  fts5DecodeAverag
306d0 65 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e  es(&rc, &s, a, n
306e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
306f0 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53 74      fts5DecodeSt
30700 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c  ructure(&rc, &s,
30710 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   a, n);.    }.  
30720 7d 65 6c 73 65 20 69 66 28 20 65 44 65 74 61 69  }else if( eDetai
30730 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46 74 73  lNone ){.    Fts
30740 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
30750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
30760 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20  rrent term read 
30770 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20  from page */.   
30780 20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20 20 20   int szLeaf;.   
30790 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 20 3d   int iPgidxOff =
307a0 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65   szLeaf = fts5Ge
307b0 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20  tU16(&a[2]);.   
307c0 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20   int iTermOff;. 
307d0 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
307e0 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ;.    int iOff;.
307f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72  .    memset(&ter
30800 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
30810 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
30820 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 65 6e  /* Decode any en
30830 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72  tries that occur
30840 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
30850 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 69  t term. */.    i
30860 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20  f( szLeaf<n ){. 
30870 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b       iPgidxOff +
30880 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
30890 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c  2(&a[iPgidxOff],
308a0 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20   iTermOff);.    
308b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 54 65  }else{.      iTe
308c0 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a  rmOff = szLeaf;.
308d0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65      }.    fts5De
308e0 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72  codeRowidList(&r
308f0 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 54  c, &s, &a[4], iT
30900 65 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20  ermOff-4);..    
30910 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
30920 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66  .    while( iOff
30930 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  <szLeaf ){.     
30940 20 69 6e 74 20 6e 41 70 70 65 6e 64 3b 0a 0a 20   int nAppend;.. 
30950 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
30960 20 74 65 72 6d 20 64 61 74 61 20 66 6f 72 20 74   term data for t
30970 68 65 20 6e 65 78 74 20 74 65 72 6d 2a 2f 0a 20  he next term*/. 
30980 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
30990 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
309a0 69 4f 66 66 5d 2c 20 6e 41 70 70 65 6e 64 29 3b  iOff], nAppend);
309b0 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20  .      term.n = 
309c0 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 66 74 73  nKeep;.      fts
309d0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
309e0 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 41  b(&rc, &term, nA
309f0 70 70 65 6e 64 2c 20 26 61 5b 69 4f 66 66 5d 29  ppend, &a[iOff])
30a00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
30a10 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
30a20 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
30a30 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d   &rc, &s, " term
30a40 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20  =%.*s", term.n, 
30a50 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72  (const char*)ter
30a60 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  m.p.      );.   
30a70 20 20 20 69 4f 66 66 20 2b 3d 20 6e 41 70 70 65     iOff += nAppe
30a80 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69  nd;..      /* Fi
30a90 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74  gure out where t
30aa0 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  he doclist for t
30ab0 68 69 73 20 74 65 72 6d 20 65 6e 64 73 20 2a 2f  his term ends */
30ac0 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64  .      if( iPgid
30ad0 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  xOff<n ){.      
30ae0 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 20 20 20    int nIncr;.   
30af0 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b       iPgidxOff +
30b00 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
30b10 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c  2(&a[iPgidxOff],
30b20 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20   nIncr);.       
30b30 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e   iTermOff += nIn
30b40 63 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  cr;.      }else{
30b50 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66  .        iTermOf
30b60 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  f = szLeaf;.    
30b70 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 44    }..      fts5D
30b80 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26  ecodeRowidList(&
30b90 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
30ba0 2c 20 69 54 65 72 6d 4f 66 66 2d 69 4f 66 66 29  , iTermOff-iOff)
30bb0 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  ;.      iOff = i
30bc0 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20 69  TermOff;.      i
30bd0 66 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29  f( iOff<szLeaf )
30be0 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
30bf0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
30c00 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
30c10 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
30c20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  }..    fts5Buffe
30c30 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
30c40 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42  }else{.    Fts5B
30c50 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
30c60 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
30c70 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72  ent term read fr
30c80 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  om page */.    i
30c90 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20  nt szLeaf;      
30ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30cb0 4f 66 66 73 65 74 20 6f 66 20 70 67 69 64 78 20  Offset of pgidx 
30cc0 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  in a[] */.    in
30cd0 74 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20 20  t iPgidxOff;.   
30ce0 20 69 6e 74 20 69 50 67 69 64 78 50 72 65 76 20   int iPgidxPrev 
30cf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
30d00 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * Previous value
30d10 20 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64 78   read from pgidx
30d20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65 72   */.    int iTer
30d30 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mOff = 0;.    in
30d40 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b  t iRowidOff = 0;
30d50 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
30d60 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b     int nDoclist;
30d70 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65  ..    memset(&te
30d80 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  rm, 0, sizeof(Ft
30d90 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
30da0 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20   if( n<4 ){.    
30db0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
30dc0 66 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20  ferSet(&rc, &s, 
30dd0 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63  7, (const u8*)"c
30de0 6f 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20  orrupt");.      
30df0 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b  goto decode_out;
30e00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30e10 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
30e20 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b  s5GetU16(&a[0]);
30e30 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66  .      iPgidxOff
30e40 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35   = szLeaf = fts5
30e50 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20  GetU16(&a[2]);. 
30e60 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f       if( iPgidxO
30e70 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
30e80 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
30e90 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69  &a[iPgidxOff], i
30ea0 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20  TermOff);.      
30eb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
30ec0 44 65 63 6f 64 65 20 74 68 65 20 70 6f 73 69 74  Decode the posit
30ed0 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20 61 74  ion list tail at
30ee0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
30ef0 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66  e page */.    if
30f00 28 20 69 52 6f 77 69 64 4f 66 66 21 3d 30 20 29  ( iRowidOff!=0 )
30f10 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  {.      iOff = i
30f20 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65  RowidOff;.    }e
30f30 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
30f40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66  !=0 ){.      iOf
30f50 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  f = iTermOff;.  
30f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
30f70 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  Off = szLeaf;.  
30f80 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f    }.    fts5Deco
30f90 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26  dePoslist(&rc, &
30fa0 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34  s, &a[4], iOff-4
30fb0 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64  );..    /* Decod
30fc0 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69  e any more docli
30fd0 73 74 20 64 61 74 61 20 74 68 61 74 20 61 70 70  st data that app
30fe0 65 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ears on the page
30ff0 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
31000 2a 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a  ** first term. *
31010 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d  /.    nDoclist =
31020 20 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54 65   (iTermOff ? iTe
31030 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29 20  rmOff : szLeaf) 
31040 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35  - iOff;.    fts5
31050 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72  DecodeDoclist(&r
31060 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
31070 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20   nDoclist);..   
31080 20 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66   while( iPgidxOf
31090 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  f<n ){.      int
310a0 20 62 46 69 72 73 74 20 3d 20 28 69 50 67 69 64   bFirst = (iPgid
310b0 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20  xOff==szLeaf);  
310c0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66     /* True for f
310d0 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67  irst term on pag
310e0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
310f0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
31100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31110 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74   /* Bytes of dat
31120 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  a */.      int i
31130 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  End;.      .    
31140 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66    iPgidxOff += f
31150 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
31160 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42  a[iPgidxOff], nB
31170 79 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67 69  yte);.      iPgi
31180 64 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b  dxPrev += nByte;
31190 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 50  .      iOff = iP
311a0 67 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20 20  gidxPrev;..     
311b0 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
311c0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
311d0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
311e0 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65  PgidxOff], nByte
311f0 29 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20  );.        iEnd 
31200 3d 20 69 50 67 69 64 78 50 72 65 76 20 2b 20 6e  = iPgidxPrev + n
31210 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Byte;.      }els
31220 65 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20  e{.        iEnd 
31230 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20  = szLeaf;.      
31240 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 62 46 69  }..      if( bFi
31250 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
31260 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
31270 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
31280 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
31290 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79      term.n = nBy
312a0 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
312b0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
312c0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
312d0 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
312e0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
312f0 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72  ndBlob(&rc, &ter
31300 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66  m, nByte, &a[iOf
31310 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  f]);.      iOff 
31320 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20  += nByte;..     
31330 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
31340 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a  erAppendPrintf(.
31350 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
31360 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
31370 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
31380 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
31390 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66     );.      iOff
313a0 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f   += fts5DecodeDo
313b0 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
313c0 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f  a[iOff], iEnd-iO
313d0 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ff);.    }..    
313e0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
313f0 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64  term);.  }.  . d
31400 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c  ecode_out:.  sql
31410 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
31420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31430 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
31440 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
31450 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
31460 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45  s.p, s.n, SQLITE
31470 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
31480 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
31490 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
314a0 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20  ode(pCtx, rc);. 
314b0 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
314c0 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree(&s);.}../*.*
314d0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
314e0 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
314f0 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
31500 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28  tion fts5_rowid(
31510 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
31520 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74  d fts5RowidFunct
31530 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
31540 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
31550 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
31560 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
31570 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
31580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31590 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
315a0 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32  f args (always 2
315b0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) */.  sqlite3_v
315c0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
315d0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
315e0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
315f0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
31600 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72  *zArg;.  if( nAr
31610 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  g==0 ){.    sqli
31620 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
31630 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62  (pCtx, "should b
31640 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75  e: fts5_rowid(su
31650 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d  bject, ....)", -
31660 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
31670 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63   zArg = (const c
31680 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
31690 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
316a0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  );.    if( 0==sq
316b0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
316c0 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29  rg, "segment") )
316d0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
316e0 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65  id;.      int se
316f0 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20  gid, pgno;.     
31700 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a   if( nArg!=3 ){.
31710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31720 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
31730 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  x, .            
31740 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35  "should be: fts5
31750 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27  _rowid('segment'
31760 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29 22  , segid, pgno))"
31770 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a  , -1.        );.
31780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31790 20 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c       segid = sql
317a0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
317b0 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20  pVal[1]);.      
317c0 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33    pgno = sqlite3
317d0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
317e0 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52  [2]);.        iR
317f0 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
31800 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
31810 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
31820 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
31830 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69  nt64(pCtx, iRowi
31840 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
31850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
31860 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
31870 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
31880 20 22 66 69 72 73 74 20 61 72 67 20 74 6f 20 66   "first arg to f
31890 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74  ts5_rowid() must
318a0 20 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20 2c   be 'segment'" ,
318b0 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   -1.      );.   
318c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
318d0 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
318e0 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74  s part of regist
318f0 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d  ering the FTS5 m
31900 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62  odule with datab
31910 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
31920 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65  n db. It registe
31930 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d  rs several user-
31940 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
31950 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a  unctions useful.
31960 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a  ** with FTS5..**
31970 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
31980 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
31990 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
319a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f  error occurs, so
319b0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69  me other.** SQLi
319c0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
319d0 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
319e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
319f0 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73  3Fts5IndexInit(s
31a00 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
31a10 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
31a20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
31a30 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35  .      db, "fts5
31a40 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c  _decode", 2, SQL
31a50 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
31a60 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c  5DecodeFunction,
31a70 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 20 20 69 66   0, 0.  );..  if
31a80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31a90 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
31aa0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
31ab0 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ion(.        db,
31ac0 20 22 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e 6f   "fts5_decode_no
31ad0 6e 65 22 2c 20 32 2c 20 0a 20 20 20 20 20 20 20  ne", 2, .       
31ae0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
31af0 6f 69 64 2a 29 64 62 2c 20 66 74 73 35 44 65 63  oid*)db, fts5Dec
31b00 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
31b10 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  0.    );.  }..  
31b20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31b30 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
31b40 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
31b50 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64  ction(.        d
31b60 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c  b, "fts5_rowid",
31b70 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
31b80 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75  , 0, fts5RowidFu
31b90 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20  nction, 0, 0.   
31ba0 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
31bb0 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c   rc;.}...int sql
31bc0 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 73  ite3Fts5IndexRes
31bd0 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  et(Fts5Index *p)
31be0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
31bf0 53 74 72 75 63 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Struct==0 || p->
31c00 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 21 3d  iStructVersion!=
31c10 30 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 49  0 );.  if( fts5I
31c20 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e 28  ndexDataVersion(
31c30 70 29 21 3d 70 2d 3e 69 53 74 72 75 63 74 56 65  p)!=p->iStructVe
31c40 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 66 74 73  rsion ){.    fts
31c50 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
31c60 64 61 74 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  date(p);.  }.  r
31c70 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
31c80 65 74 75 72 6e 28 70 29 3b 0a 7d 0a              eturn(p);.}.