/ Hex Artifact Content
Login

Artifact 3e5582dbe95aeefbb07ff6db1589024bc3f229fd:


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: 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50  PageWriter Fts5P
24e0: 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  ageWriter;.typed
24f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2500: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2510: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2520: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2530: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2540: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2550: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2560: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2580: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2590: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
25a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
25b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
25c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
25d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
25f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2600: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72 75  reSegment;..stru
2610: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2620: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2660: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2670: 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nn;             
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2690: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
26a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26b0: 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26d0: 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69 74 68  ize of leaf with
26e0: 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  out page-index *
26f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2700: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2710: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2720: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2740: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2750: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2760: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2780: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2790: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27a0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27b0: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
27e0: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
27f0: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2800: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2810: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2820: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2830: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2840: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2850: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2860: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2870: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2880: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2890: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
28c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
28d0: 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69  .  int nMaxPendi
28e0: 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  ngData;         
28f0: 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e     /* Max pendin
2900: 67 20 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c  g data before fl
2910: 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ush to disk */. 
2920: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74   int nPendingDat
2930: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2940: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2950: 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74  s of pending dat
2960: 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74  a */.  i64 iWrit
2970: 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  eRowid;         
2980: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2990: 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20  for current doc 
29a0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
29b0: 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65 3b 20  .  int bDelete; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
29e0: 69 74 65 20 69 73 20 61 20 64 65 6c 65 74 65 20  ite is a delete 
29f0: 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73  */..  /* Error s
2a00: 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  tate. */.  int r
2a10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2a30: 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  rrent error code
2a40: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   */..  /* State 
2a50: 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  used by the fts5
2a60: 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69  DataXXX() functi
2a70: 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2a80: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b  3_blob *pReader;
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20            /* RO 
2aa0: 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f  incr-blob open o
2ab0: 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  n %_data table *
2ac0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2ad0: 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
2ae0: 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e      /* "INSERT .
2af0: 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53  .. %_data VALUES
2b00: 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  (?,?)" */.  sqli
2b10: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
2b20: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22  er;         /* "
2b30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
2b40: 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44  ta ... id>=? AND
2b50: 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73 71 6c   id<=?" */.  sql
2b60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 57  ite3_stmt *pIdxW
2b70: 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20  riter;       /* 
2b80: 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 69 64  "INSERT ... %_id
2b90: 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  x VALUES(?,?,?,?
2ba0: 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  )" */.  sqlite3_
2bb0: 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65 74 65  stmt *pIdxDelete
2bc0: 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45  r;      /* "DELE
2bd0: 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20 57 48  TE FROM %_idx WH
2be0: 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f 0a 20  ERE segid=? */. 
2bf0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2c00: 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74  IdxSelect;.  int
2c10: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c30: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2c40: 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d  blocks read */.}
2c50: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f  ;..struct Fts5Do
2c60: 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75 38  clistIter {.  u8
2c70: 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20 20   *aEof;         
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
2ca0: 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64  te past end of d
2cb0: 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a 20  oclist */..  /* 
2cc0: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
2cd0: 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74  . aPoslist==0 at
2ce0: 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 52   EOF */.  i64 iR
2cf0: 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73  owid;.  u8 *aPos
2d00: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73  list;.  int nPos
2d10: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69 7a  list;.  int nSiz
2d20: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e;.};../*.** The
2d30: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d40: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
2d50: 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ord for each ind
2d60: 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ex are represent
2d70: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46  ed.** using an F
2d80: 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63  ts5Structure rec
2d90: 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57  ord in memory. W
2da0: 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e  hich uses instan
2db0: 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f  ces of the .** o
2dc0: 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75  ther Fts5Structu
2dd0: 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63  reXXX types as c
2de0: 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74  omponents..*/.st
2df0: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
2e00: 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e  reSegment {.  in
2e10: 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20  t iSegid;       
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e30: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
2e40: 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20   int pgnoFirst; 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70   /* First leaf p
2e70: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
2e80: 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70  gment */.  int p
2e90: 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20  gnoLast;        
2ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
2eb0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
2ec0: 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
2ed0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
2ee0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b  StructureLevel {
2ef0: 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20  .  int nMerge;  
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f20: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72  segments in incr
2f30: 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20  -merge */.  int 
2f40: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f60: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
2f70: 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
2f80: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
2f90: 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67  ureSegment *aSeg
2fa0: 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ;     /* Array o
2fb0: 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67  f segments. aSeg
2fc0: 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a  [0] is oldest. *
2fd0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
2fe0: 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69 6e  Structure {.  in
2ff0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3010: 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   Object referenc
3020: 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36 34  e count */.  u64
3030: 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20   nWriteCounter; 
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69  Total leaves wri
3060: 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20  tten to level 0 
3070: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
3080: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3090: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65       /* Total se
30a0: 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73  gments in this s
30b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
30c0: 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20  t nLevel;       
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   Number of level
30f0: 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20  s in this index 
3100: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
3110: 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 31  reLevel aLevel[1
3120: 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  ];   /* Array of
3130: 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62   nLevel level ob
3140: 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  jects */.};../*.
3150: 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20  ** An object of 
3160: 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69 74  type Fts5SegWrit
3170: 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77 72  er is used to wr
3180: 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e  ite to segments.
3190: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50  .*/.struct Fts5P
31a0: 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e  ageWriter {.  in
31b0: 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  t pgno;         
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
31e0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
31f0: 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b 20  int iPrevPgidx; 
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75  /* Previous valu
3220: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  e written into p
3230: 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42 75  gidx */.  Fts5Bu
3240: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
3250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3260: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6c  fer containing l
3270: 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  eaf data */.  Ft
3280: 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b 20  s5Buffer pgidx; 
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
32b0: 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a 2f  ng page-index */
32c0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
32d0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
32e0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
32f0: 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73  taining previous
3300: 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
3310: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 44  .};.struct Fts5D
3320: 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20 69  lidxWriter {.  i
3330: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3350: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3360: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3370: 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64 3b   int bPrevValid;
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72 65   /* True if iPre
33a0: 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  v is valid */.  
33b0: 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20 20  i64 iPrev;      
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
33e0: 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  d value written 
33f0: 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74 73  to page */.  Fts
3400: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3420: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3430: 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  g page data */.}
3440: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67  ;.struct Fts5Seg
3450: 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 69  Writer {.  int i
3460: 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  Segid;          
3470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
3480: 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  gid to write to 
3490: 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  */.  Fts5PageWri
34a0: 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20  ter writer;     
34b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69 74       /* PageWrit
34c0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
34d0: 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20  64 iPrevRowid;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34f0: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64  * Previous rowid
3500: 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72   written to curr
3510: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38  ent leaf */.  u8
3520: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f   bFirstRowidInDo
3530: 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  clist;        /*
3540: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3550: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3560: 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20  doclist */.  u8 
3570: 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
3580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3590: 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77  True if next row
35a0: 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 70  id is first in p
35b0: 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44 4f  age */.  /* TODO
35c0: 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69 74  1: Can use (writ
35d0: 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20 69  er.pgidx.n==0) i
35e0: 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73 74  nstead of bFirst
35f0: 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20 20  TermInPage */.  
3600: 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e 50  u8 bFirstTermInP
3610: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
3620: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3630: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69 72  term will be fir
3640: 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  st in leaf */.  
3650: 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e  int nLeafWritten
3660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3670: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
3680: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
3690: 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b  */.  int nEmpty;
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36c0: 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72  f contiguous ter
36d0: 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a  m-less nodes */.
36e0: 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20 20  .  int nDlidx;  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3710: 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b 5d  size of aDlidx[]
3720: 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35   array */.  Fts5
3730: 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c  DlidxWriter *aDl
3740: 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  idx;        /* A
3750: 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69 64  rray of Fts5Dlid
3760: 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20  xWriter objects 
3770: 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73 20  */..  /* Values 
3780: 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  to insert into t
3790: 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a  he %_idx table *
37a0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
37b0: 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  tterm;          
37c0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72 6d      /* Next term
37d0: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
37e0: 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a 20  %_idx table */. 
37f0: 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20 20   int iBtPage;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3820: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
3830: 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a 2f   btterm */.};../
3840: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
3850: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
3860: 68 20 74 68 65 20 6d 65 72 67 65 64 20 72 65 73  h the merged res
3870: 75 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d  ults of one or m
3880: 6f 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a  ore segments,.**
3890: 20 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74   visiting each t
38a0: 65 72 6d 2f 72 6f 77 69 64 20 70 61 69 72 20 69  erm/rowid pair i
38b0: 6e 20 74 68 65 20 6d 65 72 67 65 64 20 64 61 74  n the merged dat
38c0: 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73  a..**.** nSeg is
38d0: 20 61 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20   always a power 
38e0: 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
38f0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
3900: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
3910: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74   segments that t
3920: 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65  his object is me
3930: 72 67 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e  rging data from.
3940: 20 42 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d   Both the aSeg[]
3950: 20 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d   and.** aFirst[]
3960: 20 61 72 72 61 79 73 20 61 72 65 20 73 69 7a 65   arrays are size
3970: 64 20 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65  d at nSeg entrie
3980: 73 2e 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72  s. The aSeg[] ar
3990: 72 61 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a  ray is padded.**
39a0: 20 77 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a   with zeroed obj
39b0: 65 63 74 73 20 2d 20 74 68 65 73 65 20 61 72 65  ects - these are
39c0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74   handled as if t
39d0: 68 65 79 20 77 65 72 65 20 69 74 65 72 61 74 6f  hey were iterato
39e0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
39f0: 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a  empty segments..
3a00: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
3a10: 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73  s of comparing s
3a20: 65 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20  egments aSeg[N] 
3a30: 61 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77  and aSeg[N+1], w
3a40: 68 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20  here N is an.** 
3a50: 65 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20  even number, is 
3a60: 73 74 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74  stored in aFirst
3a70: 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68  [(nSeg+N)/2]. Th
3a80: 65 20 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68  e "result" of th
3a90: 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  e .** comparison
3aa0: 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74   in this context
3ab0: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
3ac0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68   the iterator th
3ad0: 61 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  at currently.** 
3ae0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d  points to the sm
3af0: 61 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64  aller term/rowid
3b00: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74   combination. It
3b10: 65 72 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61  erators at EOF a
3b20: 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  re.** considered
3b30: 20 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 74   to be greater t
3b40: 68 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74  han all other it
3b50: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61  erators..**.** a
3b60: 46 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e  First[1] contain
3b70: 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61  s the index in a
3b80: 53 65 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65  Seg[] of the ite
3b90: 72 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  rator that point
3ba0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c  s to.** the smal
3bb0: 6c 65 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c  lest key overall
3bc0: 2e 20 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75  . aFirst[0] is u
3bd0: 6e 75 73 65 64 2e 20 0a 2a 2f 0a 0a 74 79 70 65  nused. .*/..type
3be0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43  def struct Fts5C
3bf0: 52 65 73 75 6c 74 20 46 74 73 35 43 52 65 73 75  Result Fts5CResu
3c00: 6c 74 3b 0a 73 74 72 75 63 74 20 46 74 73 35 43  lt;.struct Fts5C
3c10: 52 65 73 75 6c 74 20 7b 0a 20 20 75 31 36 20 69  Result {.  u16 i
3c20: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
3c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
3c40: 65 67 5b 5d 20 69 6e 64 65 78 20 6f 66 20 66 69  eg[] index of fi
3c50: 72 73 74 65 73 74 20 69 74 65 72 61 74 6f 72 20  rstest iterator 
3c60: 2a 2f 0a 20 20 75 38 20 62 54 65 72 6d 45 71 3b  */.  u8 bTermEq;
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3c90: 74 68 65 20 74 65 72 6d 73 20 61 72 65 20 65 71  the terms are eq
3ca0: 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ual */.};../*.**
3cb0: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
3cc0: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20  ating through a 
3cd0: 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2c 20  single segment, 
3ce0: 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65  visiting each te
3cf0: 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20 70 61 69 72  rm/rowid.** pair
3d00: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e   in the segment.
3d10: 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a 2a 2a 20  .**.** pSeg:.** 
3d20: 20 20 54 68 65 20 73 65 67 6d 65 6e 74 20 74 6f    The segment to
3d30: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3d40: 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 50 67 6e  ..**.** iLeafPgn
3d50: 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65 6e 74 20  o:.**   Current 
3d60: 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
3d70: 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 2e   within segment.
3d80: 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f 66 66 73  .**.** iLeafOffs
3d90: 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65 20 6f 66  et:.**   Byte of
3da0: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
3db0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 74 68 61  current leaf tha
3dc0: 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 62  t is the first b
3dd0: 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  yte of the .**  
3de0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
3df0: 61 74 61 20 28 6f 6e 65 20 62 79 74 65 20 70 61  ata (one byte pa
3e00: 73 73 65 64 20 74 68 65 20 70 6f 73 69 74 69 6f  ssed the positio
3e10: 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
3e20: 64 29 2e 0a 2a 2a 20 20 20 72 6f 77 69 64 20 66  d)..**   rowid f
3e30: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
3e40: 65 6e 74 20 65 6e 74 72 79 2e 20 55 73 75 61 6c  ent entry. Usual
3e50: 6c 79 20 74 68 69 73 20 69 73 20 74 68 65 20 73  ly this is the s
3e60: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
3e70: 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c  .**   position l
3e80: 69 73 74 20 64 61 74 61 2e 20 54 68 65 20 65 78  ist data. The ex
3e90: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
3ea0: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
3eb0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 0a 2a  current entry .*
3ec0: 2a 20 20 20 69 73 20 74 68 65 20 6c 61 73 74 20  *   is the last 
3ed0: 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 61  thing on the lea
3ee0: 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 4c  f page..**.** pL
3ef0: 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66 66 65 72  eaf:.**   Buffer
3f00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72   containing curr
3f10: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 64 61  ent leaf page da
3f20: 74 61 2e 20 53 65 74 20 74 6f 20 4e 55 4c 4c 20  ta. Set to NULL 
3f30: 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 54  at EOF..**.** iT
3f40: 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20 69 54 65  ermLeafPgno, iTe
3f50: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a  rmLeafOffset:.**
3f60: 20 20 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d     Leaf page num
3f70: 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ber containing t
3f80: 68 65 20 6c 61 73 74 20 74 65 72 6d 20 72 65 61  he last term rea
3f90: 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65  d from the segme
3fa0: 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20 74 68 65  nt. And.**   the
3fb0: 20 6f 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74   offset immediat
3fc0: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
3fd0: 65 20 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a  e term data..**.
3fe0: 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20 20 20 4d  ** flags:.**   M
3ff0: 61 73 6b 20 6f 66 20 46 54 53 35 5f 53 45 47 49  ask of FTS5_SEGI
4000: 54 45 52 5f 58 58 58 20 76 61 6c 75 65 73 2e 20  TER_XXX values. 
4010: 49 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  Interpreted as f
4020: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
4030: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
4040: 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20 49 66 20  TERM:.**     If 
4050: 73 65 74 2c 20 73 65 74 20 74 68 65 20 69 74 65  set, set the ite
4060: 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  rator to point t
4070: 6f 20 45 4f 46 20 61 66 74 65 72 20 74 68 65 20  o EOF after the 
4080: 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20  current doclist 
4090: 0a 2a 2a 20 20 20 20 20 68 61 73 20 62 65 65 6e  .**     has been
40a0: 20 65 78 68 61 75 73 74 65 64 2e 20 44 6f 20 6e   exhausted. Do n
40b0: 6f 74 20 70 72 6f 63 65 65 64 20 74 6f 20 74 68  ot proceed to th
40c0: 65 20 6e 65 78 74 20 74 65 72 6d 20 69 6e 20 74  e next term in t
40d0: 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  he segment..**.*
40e0: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
40f0: 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20 20 20 20  _REVERSE:.**    
4100: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 6f 6e   This flag is on
4110: 6c 79 20 65 76 65 72 20 73 65 74 20 69 66 20 46  ly ever set if F
4120: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
4130: 45 52 4d 20 69 73 20 61 6c 73 6f 20 73 65 74 2e  ERM is also set.
4140: 20 49 66 0a 2a 2a 20 20 20 20 20 69 74 20 69 73   If.**     it is
4150: 20 73 65 74 2c 20 69 74 65 72 61 74 65 20 74 68   set, iterate th
4160: 72 6f 75 67 68 20 72 6f 77 69 64 20 69 6e 20 64  rough rowid in d
4170: 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  escending order 
4180: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 0a 2a  instead of the.*
4190: 2a 20 20 20 20 20 64 65 66 61 75 6c 74 20 61 73  *     default as
41a0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
41b0: 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f 66 66 73 65  *.** iRowidOffse
41c0: 74 2f 6e 52 6f 77 69 64 4f 66 66 73 65 74 2f 61  t/nRowidOffset/a
41d0: 52 6f 77 69 64 4f 66 66 73 65 74 3a 0a 2a 2a 20  RowidOffset:.** 
41e0: 20 20 20 20 54 68 65 73 65 20 61 72 65 20 75 73      These are us
41f0: 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53  ed if the FTS5_S
4200: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66  EGITER_REVERSE f
4210: 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  lag is set..**.*
4220: 2a 20 20 20 20 20 46 6f 72 20 65 61 63 68 20 72  *     For each r
4230: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
4240: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
4250: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  o the current te
4260: 72 6d 2c 20 74 68 65 0a 2a 2a 20 20 20 20 20 63  rm, the.**     c
4270: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 52 6f  orresponding aRo
4280: 77 69 64 4f 66 66 73 65 74 5b 5d 20 65 6e 74 72  widOffset[] entr
4290: 79 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  y is set to the 
42a0: 62 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74  byte offset of t
42b0: 68 65 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20  he.**     start 
42c0: 6f 66 20 74 68 65 20 22 70 6f 73 69 74 69 6f 6e  of the "position
42d0: 2d 6c 69 73 74 2d 73 69 7a 65 22 20 66 69 65 6c  -list-size" fiel
42e0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  d within the pag
42f0: 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72 6d 49 64  e..**.** iTermId
4300: 78 3a 0a 2a 2a 20 20 20 20 20 49 6e 64 65 78 20  x:.**     Index 
4310: 6f 66 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  of current term 
4320: 6f 6e 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  on iTermLeafPgno
4330: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
4340: 53 65 67 49 74 65 72 20 7b 0a 20 20 46 74 73 35  SegIter {.  Fts5
4350: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
4360: 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 53   *pSeg;     /* S
4370: 65 67 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74  egment to iterat
4380: 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69  e through */.  i
4390: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43b0: 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e 66 69 67  * Mask of config
43c0: 75 72 61 74 69 6f 6e 20 66 6c 61 67 73 20 2a 2f  uration flags */
43d0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
43e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43f0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
4400: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  af page number *
4410: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  /.  Fts5Data *pL
4420: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
4430: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
4440: 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  eaf data */.  Ft
4450: 73 35 44 61 74 61 20 2a 70 4e 65 78 74 4c 65 61  s5Data *pNextLea
4460: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
4470: 20 4c 65 61 66 20 70 61 67 65 20 28 69 4c 65 61   Leaf page (iLea
4480: 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a 20 20 69 6e  fPgno+1) */.  in
4490: 74 20 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  t iLeafOffset;  
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
44b0: 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74   Byte offset wit
44c0: 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66  hin current leaf
44d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61   */..  /* The pa
44e0: 67 65 20 61 6e 64 20 6f 66 66 73 65 74 20 66 72  ge and offset fr
44f0: 6f 6d 20 77 68 69 63 68 20 74 68 65 20 63 75 72  om which the cur
4500: 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 72 65  rent term was re
4510: 61 64 2e 20 54 68 65 20 6f 66 66 73 65 74 20 0a  ad. The offset .
4520: 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 66 66 73    ** is the offs
4530: 65 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  et of the first 
4540: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 63 75 72  rowid in the cur
4550: 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e 20 20 2a  rent doclist.  *
4560: 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61  /.  int iTermLea
4570: 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 54 65  fPgno;.  int iTe
4580: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20  rmLeafOffset;.. 
4590: 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 3b 20   int iPgidxOff; 
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20   /* Next offset 
45c0: 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e  in pgidx */.  in
45d0: 74 20 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b  t iEndofDoclist;
45e0: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
45f0: 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75 73  wing are only us
4600: 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53  ed if the FTS5_S
4610: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66  EGITER_REVERSE f
4620: 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20  lag is set. */. 
4630: 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65   int iRowidOffse
4640: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4650: 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e 74 72   /* Current entr
4660: 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66 73 65  y in aRowidOffse
4670: 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  t[] */.  int nRo
4680: 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  widOffset;      
4690: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
46a0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 52  cated size of aR
46b0: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72  owidOffset[] arr
46c0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f  ay */.  int *aRo
46d0: 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  widOffset;      
46e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
46f0: 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20 72 6f   of offset to ro
4700: 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20  wid fields */.. 
4710: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
4720: 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20  pDlidx;         
4730: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
4740: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
4750: 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  */..  /* Variabl
4760: 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73  es populated bas
4770: 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e  ed on current en
4780: 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75  try. */.  Fts5Bu
4790: 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
47a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
47b0: 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  rent term */.  i
47c0: 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47e0: 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20  * Current rowid 
47f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20  */.  int nPos;  
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4820: 66 20 62 79 74 65 73 20 69 6e 20 63 75 72 72 65  f bytes in curre
4830: 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
4840: 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 3b 20   */.  int bDel; 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4870: 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67   the delete flag
4880: 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a 2f   is set */.};../
4890: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 73  *.** Argument is
48a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
48b0: 20 46 74 73 35 44 61 74 61 20 73 74 72 75 63 74   Fts5Data struct
48c0: 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ure that contain
48d0: 73 20 61 20 0a 2a 2a 20 6c 65 61 66 20 70 61 67  s a .** leaf pag
48e0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 53  e..*/.#define AS
48f0: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 78  SERT_SZLEAF_OK(x
4900: 29 20 61 73 73 65 72 74 28 20 5c 0a 20 20 20 20  ) assert( \.    
4910: 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 28 78 29  (x)->szLeaf==(x)
4920: 2d 3e 6e 6e 20 7c 7c 20 28 78 29 2d 3e 73 7a 4c  ->nn || (x)->szL
4930: 65 61 66 3d 3d 66 74 73 35 47 65 74 55 31 36 28  eaf==fts5GetU16(
4940: 26 28 78 29 2d 3e 70 5b 32 5d 29 20 5c 0a 29 0a  &(x)->p[2]) \.).
4950: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45  .#define FTS5_SE
4960: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78  GITER_ONETERM 0x
4970: 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  01.#define FTS5_
4980: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
4990: 30 78 30 32 0a 0a 0a 2f 2a 20 0a 2a 2a 20 41 72  0x02.../* .** Ar
49a0: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
49b0: 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44 61  ter to an Fts5Da
49c0: 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ta structure tha
49d0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 65 61  t contains a lea
49e0: 66 0a 2a 2a 20 70 61 67 65 2e 20 54 68 69 73 20  f.** page. This 
49f0: 6d 61 63 72 6f 20 65 76 61 6c 75 61 74 65 73 20  macro evaluates 
4a00: 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 6c  to true if the l
4a10: 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  eaf contains no 
4a20: 74 65 72 6d 73 2c 20 6f 72 0a 2a 2a 20 66 61 6c  terms, or.** fal
4a30: 73 65 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e  se if it contain
4a40: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  s at least one t
4a50: 65 72 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  erm..*/.#define 
4a60: 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
4a70: 73 73 28 78 29 20 28 28 78 29 2d 3e 73 7a 4c 65  ss(x) ((x)->szLe
4a80: 61 66 20 3e 3d 20 28 78 29 2d 3e 6e 6e 29 0a 0a  af >= (x)->nn)..
4a90: 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61 66  #define fts5Leaf
4aa0: 54 65 72 6d 4f 66 66 28 78 2c 20 69 29 20 28 66  TermOff(x, i) (f
4ab0: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4ac0: 70 5b 28 78 29 2d 3e 73 7a 4c 65 61 66 20 2b 20  p[(x)->szLeaf + 
4ad0: 28 69 29 2a 32 5d 29 29 0a 0a 23 64 65 66 69 6e  (i)*2]))..#defin
4ae0: 65 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  e fts5LeafFirstR
4af0: 6f 77 69 64 4f 66 66 28 78 29 20 28 66 74 73 35  owidOff(x) (fts5
4b00: 47 65 74 55 31 36 28 28 78 29 2d 3e 70 29 29 0a  GetU16((x)->p)).
4b10: 0a 2f 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74 3a 0a  ./*.** poslist:.
4b20: 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73 71 6c  **   Used by sql
4b30: 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
4b40: 69 73 74 28 29 20 77 68 65 6e 20 74 68 65 20 70  ist() when the p
4b50: 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74 6f 20  oslist needs to 
4b60: 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a 2a 20  be buffered..** 
4b70: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61    There is no wa
4b80: 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74 68 69  y to tell if thi
4b90: 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  s is populated o
4ba0: 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  r not..*/.struct
4bb0: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b   Fts5IndexIter {
4bc0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
4bd0: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
4be0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74     /* Index that
4bf0: 20 6f 77 6e 73 20 74 68 69 73 20 69 74 65 72 61   owns this itera
4c00: 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  tor */.  Fts5Str
4c10: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
4c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4c30: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20 66  base structure f
4c40: 6f 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  or this iterator
4c50: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
4c60: 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20   poslist;       
4c70: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
4c80: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65  containing curre
4c90: 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 0a 20  nt poslist */.. 
4ca0: 20 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20   int nSeg;      
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67   /* Size of aSeg
4cd0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  [] array */.  in
4ce0: 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d00: 20 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65   True to iterate
4d10: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
4d20: 72 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45  r */.  u8 bSkipE
4d30: 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  mpty;           
4d40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
4d50: 6f 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65  o skip deleted e
4d60: 6e 74 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 62  ntries */.  u8 b
4d70: 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Eof;            
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4d90: 72 75 65 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20  rue at EOF */.  
4da0: 75 38 20 62 46 69 6c 74 65 72 65 64 3b 20 20 20  u8 bFiltered;   
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  /* True if colum
4dd0: 6e 2d 66 69 6c 74 65 72 20 61 6c 72 65 61 64 79  n-filter already
4de0: 20 61 70 70 6c 69 65 64 20 2a 2f 0a 0a 20 20 69   applied */..  i
4df0: 36 34 20 69 53 77 69 74 63 68 52 6f 77 69 64 3b  64 iSwitchRowid;
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4e10: 2a 20 46 69 72 73 74 65 73 74 20 72 6f 77 69 64  * Firstest rowid
4e20: 20 6f 66 20 6f 74 68 65 72 20 74 68 61 6e 20 61   of other than a
4e30: 46 69 72 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74  First[1] */.  Ft
4e40: 73 35 43 52 65 73 75 6c 74 20 2a 61 46 69 72 73  s5CResult *aFirs
4e50: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
4e60: 20 43 75 72 72 65 6e 74 20 6d 65 72 67 65 20 73   Current merge s
4e70: 74 61 74 65 20 28 73 65 65 20 61 62 6f 76 65 29  tate (see above)
4e80: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
4e90: 72 20 61 53 65 67 5b 31 5d 3b 20 20 20 20 20 20  r aSeg[1];      
4ea0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
4eb0: 66 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  f segment iterat
4ec0: 6f 72 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  ors */.};.../*.*
4ed0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4ee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
4ef0: 79 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ype is used to i
4f00: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
4f10: 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
4f20: 66 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  f a doclist-inde
4f30: 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  x record..**.** 
4f40: 70 44 61 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f  pData:.**   Reco
4f50: 72 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  rd containing th
4f60: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
4f70: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66  data..**.** bEof
4f80: 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 72  :.**   Set to tr
4f90: 75 65 20 6f 6e 63 65 20 69 74 65 72 61 74 6f 72  ue once iterator
4fa0: 20 68 61 73 20 72 65 61 63 68 65 64 20 45 4f 46   has reached EOF
4fb0: 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a  ..**.** iOff:.**
4fc0: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75     Set to the cu
4fd0: 72 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74  rrent offset wit
4fe0: 68 69 6e 20 72 65 63 6f 72 64 20 70 44 61 74 61  hin record pData
4ff0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
5000: 44 6c 69 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73  DlidxLvl {.  Fts
5010: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20  5Data *pData;   
5020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5030: 74 61 20 66 6f 72 20 63 75 72 72 65 6e 74 20 70  ta for current p
5040: 61 67 65 20 6f 66 20 74 68 69 73 20 6c 65 76 65  age of this leve
5050: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b  l */.  int iOff;
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
5080: 6f 66 66 73 65 74 20 69 6e 74 6f 20 70 44 61 74  offset into pDat
5090: 61 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b  a */.  int bEof;
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61       /* At EOF a
50c0: 6c 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20  lready */.  int 
50d0: 69 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20  iFirstOff;      
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
50f0: 64 20 62 79 20 72 65 76 65 72 73 65 20 69 74 65  d by reverse ite
5100: 72 61 74 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  rators */..  /* 
5110: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
5120: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
5130: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
5140: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
5150: 65 72 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65  er of current le
5160: 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 36 34  af page */.  i64
5170: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
5180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
5190: 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61  rst rowid on lea
51a0: 66 20 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d  f iLeafPgno */.}
51b0: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  ;.struct Fts5Dli
51c0: 64 78 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e  dxIter {.  int n
51d0: 4c 76 6c 3b 0a 20 20 69 6e 74 20 69 53 65 67 69  Lvl;.  int iSegi
51e0: 64 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76  d;.  Fts5DlidxLv
51f0: 6c 20 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73  l aLvl[1];.};..s
5200: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
5210: 75 74 55 31 36 28 75 38 20 2a 61 4f 75 74 2c 20  utU16(u8 *aOut, 
5220: 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75  u16 iVal){.  aOu
5230: 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29  t[0] = (iVal>>8)
5240: 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69  ;.  aOut[1] = (i
5250: 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74  Val&0xFF);.}..st
5260: 61 74 69 63 20 75 31 36 20 66 74 73 35 47 65 74  atic u16 fts5Get
5270: 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a 61 49  U16(const u8 *aI
5280: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75  n){.  return ((u
5290: 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20  16)aIn[0] << 8) 
52a0: 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a  + aIn[1];.} ../*
52b0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
52c0: 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72   return a buffer
52d0: 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20   at least nByte 
52e0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
52f0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
5300: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
5310: 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  red, return NULL
5320: 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72   and set the err
5330: 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68  or code in.** th
5340: 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  e Fts5Index hand
5350: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
5360: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
5370: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5380: 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46  *fts5IdxMalloc(F
5390: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
53a0: 20 6e 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72   nByte){.  retur
53b0: 6e 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  n sqlite3Fts5Mal
53c0: 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20  locZero(&p->rc, 
53d0: 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nByte);.}../*.**
53e0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   Compare the con
53f0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65  tents of the pLe
5400: 66 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74  ft buffer with t
5410: 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74  he pRight/nRight
5420: 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   blob..**.** Ret
5430: 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74  urn -ve if pLeft
5440: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
5450: 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68   pRight, 0 if th
5460: 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a  ey are equal or.
5470: 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74  ** +ve if pRight
5480: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
5490: 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72   pLeft. In other
54a0: 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   words:.**.**   
54b0: 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d    res = *pLeft -
54c0: 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 23 69 66 64   *pRight.*/.#ifd
54d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
54e0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42  static int fts5B
54f0: 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
5500: 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
5510: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
5520: 20 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64      /* Left hand
5530: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
5540: 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  son */.  const u
5550: 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e  8 *pRight, int n
5560: 52 69 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68  Right    /* Righ
5570: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63  t hand side of c
5580: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a  omparison */.){.
5590: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
55a0: 28 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68  (pLeft->n, nRigh
55b0: 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  t);.  int res = 
55c0: 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c  memcmp(pLeft->p,
55d0: 20 70 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a   pRight, nCmp);.
55e0: 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30    return (res==0
55f0: 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e   ? (pLeft->n - n
5600: 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d  Right) : res);.}
5610: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
5620: 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
5630: 6e 74 73 20 6f 66 20 74 68 65 20 74 77 6f 20 62  nts of the two b
5640: 75 66 66 65 72 73 20 75 73 69 6e 67 20 6d 65 6d  uffers using mem
5650: 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65 20 62 75  cmp(). If one bu
5660: 66 66 65 72 0a 2a 2a 20 69 73 20 61 20 70 72 65  ffer.** is a pre
5670: 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72  fix of the other
5680: 2c 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72  , it is consider
5690: 65 64 20 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a  ed the lesser..*
56a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20  *.** Return -ve 
56b0: 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c  if pLeft is smal
56c0: 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c  ler than pRight,
56d0: 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65   0 if they are e
56e0: 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69  qual or.** +ve i
56f0: 66 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c  f pRight is smal
5700: 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20  ler than pLeft. 
5710: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a  In other words:.
5720: 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20  **.**     res = 
5730: 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74  *pLeft - *pRight
5740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
5750: 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
5760: 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65  (Fts5Buffer *pLe
5770: 66 74 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  ft, Fts5Buffer *
5780: 70 52 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e  pRight){.  int n
5790: 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d  Cmp = MIN(pLeft-
57a0: 3e 6e 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a  >n, pRight->n);.
57b0: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
57c0: 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69  mp(pLeft->p, pRi
57d0: 67 68 74 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20  ght->p, nCmp);. 
57e0: 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20   return (res==0 
57f0: 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52  ? (pLeft->n - pR
5800: 69 67 68 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b  ight->n) : res);
5810: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
5820: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5830: 6e 74 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61  nt fts5BlobCompa
5840: 72 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  re(.  const u8 *
5850: 70 4c 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74  pLeft, int nLeft
5860: 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
5870: 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68  Right, int nRigh
5880: 74 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  t.){.  int nCmp 
5890: 3d 20 4d 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69  = MIN(nLeft, nRi
58a0: 67 68 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ght);.  int res 
58b0: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20  = memcmp(pLeft, 
58c0: 70 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20  pRight, nCmp);. 
58d0: 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20   return (res==0 
58e0: 3f 20 28 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68  ? (nLeft - nRigh
58f0: 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e  t) : res);.}.#en
5900: 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
5910: 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72  fts5LeafFirstTer
5920: 6d 4f 66 66 28 46 74 73 35 44 61 74 61 20 2a 70  mOff(Fts5Data *p
5930: 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 72 65 74  Leaf){.  int ret
5940: 3b 0a 20 20 66 74 73 35 47 65 74 56 61 72 69 6e  ;.  fts5GetVarin
5950: 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 4c  t32(&pLeaf->p[pL
5960: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 72 65  eaf->szLeaf], re
5970: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  t);.  return ret
5980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
5990: 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62   the read-only b
59a0: 6c 6f 62 20 68 61 6e 64 6c 65 2c 20 69 66 20 69  lob handle, if i
59b0: 74 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74  t is open..*/.st
59c0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 6c  atic void fts5Cl
59d0: 6f 73 65 52 65 61 64 65 72 28 46 74 73 35 49 6e  oseReader(Fts5In
59e0: 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dex *p){.  if( p
59f0: 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20  ->pReader ){.   
5a00: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5a10: 52 65 61 64 65 72 20 3d 20 70 2d 3e 70 52 65 61  Reader = p->pRea
5a20: 64 65 72 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61  der;.    p->pRea
5a30: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  der = 0;.    sql
5a40: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
5a50: 70 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a  pReader);.  }.}.
5a60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
5a70: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
5a80: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
5a90: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
5aa0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
5ab0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
5ac0: 61 6e 20 65 72 72 6f 72 20 6c 65 66 74 20 69 6e  an error left in
5ad0: 20 74 68 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64   the .** Fts5Ind
5ae0: 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  ex object..*/.st
5af0: 61 74 69 63 20 46 74 73 35 44 61 74 61 20 2a 66  atic Fts5Data *f
5b00: 74 73 35 44 61 74 61 52 65 61 64 28 46 74 73 35  ts5DataRead(Fts5
5b10: 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52  Index *p, i64 iR
5b20: 6f 77 69 64 29 7b 0a 20 20 46 74 73 35 44 61 74  owid){.  Fts5Dat
5b30: 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  a *pRet = 0;.  i
5b40: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
5b50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
5b60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
5b70: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64      if( p->pRead
5b80: 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  er ){.      /* T
5b90: 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74  his call may ret
5ba0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
5bb0: 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
5bc0: 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20  en a savepoint. 
5bd0: 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
5be0: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
5bf0: 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73  st used. In this
5c00: 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62   case a new blob
5c10: 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a   handle.      **
5c20: 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
5c30: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
5c40: 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d  blob *pBlob = p-
5c50: 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20  >pReader;.      
5c60: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
5c70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5c80: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70  e3_blob_reopen(p
5c90: 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20  Blob, iRowid);. 
5ca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
5cb0: 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20  pReader==0 );.  
5cc0: 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d      p->pReader =
5cd0: 20 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66   pBlob;.      if
5ce0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5cf0: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43  ){.        fts5C
5d00: 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
5d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5d20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52   rc==SQLITE_ABOR
5d30: 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
5d40: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
5d50: 2a 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61  * If the blob ha
5d60: 6e 64 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  ndle is not open
5d70: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
5d80: 6f 70 65 6e 20 69 74 20 61 6e 64 20 73 65 65 6b  open it and seek
5d90: 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
5da0: 72 65 71 75 65 73 74 65 64 20 65 6e 74 72 79 2e  requested entry.
5db0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
5dc0: 70 52 65 61 64 65 72 3d 3d 30 20 26 26 20 72 63  pReader==0 && rc
5dd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5de0: 20 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20       Fts5Config 
5df0: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
5e00: 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20 72 63 20  onfig;.      rc 
5e10: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
5e20: 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  pen(pConfig->db,
5e30: 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
5e40: 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61  fig->zDb, p->zDa
5e50: 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20  taTbl, "block", 
5e60: 69 52 6f 77 69 64 2c 20 30 2c 20 26 70 2d 3e 70  iRowid, 0, &p->p
5e70: 52 65 61 64 65 72 0a 20 20 20 20 20 20 29 3b 0a  Reader.      );.
5e80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
5e90: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73   either of the s
5ea0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
5eb0: 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 6c  () or sqlite3_bl
5ec0: 6f 62 5f 72 65 6f 70 65 6e 28 29 20 63 61 6c 6c  ob_reopen() call
5ed0: 73 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 72  s.    ** above r
5ee0: 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 45  eturned SQLITE_E
5ef0: 52 52 4f 52 2c 20 72 65 74 75 72 6e 20 53 51 4c  RROR, return SQL
5f00: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
5f10: 20 69 6e 73 74 65 61 64 2e 0a 20 20 20 20 2a 2a   instead..    **
5f20: 20 41 6c 6c 20 74 68 65 20 72 65 61 73 6f 6e 73   All the reasons
5f30: 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73   those functions
5f40: 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51   might return SQ
5f50: 4c 49 54 45 5f 45 52 52 4f 52 20 2d 20 6d 69 73  LITE_ERROR - mis
5f60: 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 61 62 6c  sing.    ** tabl
5f70: 65 2c 20 6d 69 73 73 69 6e 67 20 72 6f 77 2c 20  e, missing row, 
5f80: 6e 6f 6e 2d 62 6c 6f 62 2f 74 65 78 74 20 69 6e  non-blob/text in
5f90: 20 62 6c 6f 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20   block column - 
5fa0: 69 6e 64 69 63 61 74 65 20 0a 20 20 20 20 2a 2a  indicate .    **
5fb0: 20 62 61 63 6b 69 6e 67 20 73 74 6f 72 65 20 63   backing store c
5fc0: 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
5fd0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5fe0: 45 5f 45 52 52 4f 52 20 29 20 72 63 20 3d 20 46  E_ERROR ) rc = F
5ff0: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
6000: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6010: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 38 20  _OK ){.      u8 
6020: 2a 61 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20  *aOut = 0;      
6030: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
6040: 20 62 6c 6f 62 20 64 61 74 61 20 69 6e 74 6f 20   blob data into 
6050: 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
6060: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
6070: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
6080: 74 65 73 28 70 2d 3e 70 52 65 61 64 65 72 29 3b  tes(p->pReader);
6090: 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  .      int nAllo
60a0: 63 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44  c = sizeof(Fts5D
60b0: 61 74 61 29 20 2b 20 6e 42 79 74 65 20 2b 20 46  ata) + nByte + F
60c0: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
60d0: 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 28  ;.      pRet = (
60e0: 46 74 73 35 44 61 74 61 2a 29 73 71 6c 69 74 65  Fts5Data*)sqlite
60f0: 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29  3_malloc(nAlloc)
6100: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
6110: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74   ){.        pRet
6120: 2d 3e 6e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20  ->nn = nByte;.  
6130: 20 20 20 20 20 20 61 4f 75 74 20 3d 20 70 52 65        aOut = pRe
6140: 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 52 65  t->p = (u8*)&pRe
6150: 74 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t[1];.      }els
6160: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
6170: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6180: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
6190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
61a0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
61b0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
61c0: 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 61 4f 75  (p->pReader, aOu
61d0: 74 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  t, nByte, 0);.  
61e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
61f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6200: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6210: 5f 66 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20  _free(pRet);.   
6220: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
6230: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6240: 20 20 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 46 69      /* TODO1: Fi
6250: 78 20 74 68 69 73 20 2a 2f 0a 20 20 20 20 20 20  x this */.      
6260: 20 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 20 3d    pRet->szLeaf =
6270: 20 66 74 73 35 47 65 74 55 31 36 28 26 70 52 65   fts5GetU16(&pRe
6280: 74 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 20 20  t->p[2]);.      
6290: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  }.    }.    p->r
62a0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e  c = rc;.    p->n
62b0: 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61  Read++;.  }..  a
62c0: 73 73 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29  ssert( (pRet==0)
62d0: 3d 3d 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  ==(p->rc!=SQLITE
62e0: 5f 4f 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  _OK) );.  return
62f0: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
6300: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6310: 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f  nce to data reco
6320: 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  rd returned by a
6330: 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
6340: 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61  o.** fts5DataRea
6350: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
6360: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65  oid fts5DataRele
6370: 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44  ase(Fts5Data *pD
6380: 61 74 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ata){.  sqlite3_
6390: 66 72 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a  free(pData);.}..
63a0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
63b0: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
63c0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
63d0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
63e0: 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72  **ppStmt,.  char
63f0: 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20   *zSql.){.  if( 
6400: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
6410: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
6420: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
6430: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6440: 65 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d  e_v2(p->pConfig-
6450: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  >db, zSql, -1, p
6460: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
6470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
6480: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6490: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
64a0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
64b0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
64c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45  ;.}.../*.** INSE
64d0: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20  RT OR REPLACE a 
64e0: 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
64f0: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f  %_data table..*/
6500: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6510: 35 44 61 74 61 57 72 69 74 65 28 46 74 73 35 49  5DataWrite(Fts5I
6520: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f  ndex *p, i64 iRo
6530: 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  wid, const u8 *p
6540: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
6550: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  {.  if( p->rc!=S
6560: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6570: 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72  n;..  if( p->pWr
6580: 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46  iter==0 ){.    F
6590: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
65a0: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
65b0: 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
65c0: 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
65d0: 3e 70 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65  >pWriter, sqlite
65e0: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
65f0: 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e       "REPLACE IN
6600: 54 4f 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61  TO '%q'.'%q_data
6610: 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c  '(id, block) VAL
6620: 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20 20 20 20  UES(?,?)", .    
6630: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
6640: 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
6650: 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69  me.    ));.    i
6660: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
6670: 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  n;.  }..  sqlite
6680: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
6690: 70 57 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77  pWriter, 1, iRow
66a0: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  id);.  sqlite3_b
66b0: 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69  ind_blob(p->pWri
66c0: 74 65 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e  ter, 2, pData, n
66d0: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41  Data, SQLITE_STA
66e0: 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
66f0: 73 74 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29  step(p->pWriter)
6700: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
6710: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72  te3_reset(p->pWr
6720: 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iter);.}../*.** 
6730: 45 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c  Execute the foll
6740: 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a  owing SQL:.**.**
6750: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
6760: 20 25 5f 64 61 74 61 20 57 48 45 52 45 20 69 64   %_data WHERE id
6770: 20 42 45 54 57 45 45 4e 20 24 69 46 69 72 73 74   BETWEEN $iFirst
6780: 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73   AND $iLast.*/.s
6790: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
67a0: 61 74 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e  ataDelete(Fts5In
67b0: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72  dex *p, i64 iFir
67c0: 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a  st, i64 iLast){.
67d0: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
67e0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
67f0: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65  ..  if( p->pDele
6800: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ter==0 ){.    in
6810: 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f  t rc;.    Fts5Co
6820: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
6830: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
6840: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
6850: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
6860: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
6870: 4f 4d 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61  OM '%q'.'%q_data
6880: 27 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e  ' WHERE id>=? AN
6890: 44 20 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20  D id<=?", .     
68a0: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
68b0: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
68c0: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
68d0: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
68e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
68f0: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
6900: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6910: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43  e3_prepare_v2(pC
6920: 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c  onfig->db, zSql,
6930: 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65   -1, &p->pDelete
6940: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
6950: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
6960: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
6970: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6980: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
6990: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
69a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
69b0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
69c0: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20  p->pDeleter, 1, 
69d0: 69 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74  iFirst);.  sqlit
69e0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d  e3_bind_int64(p-
69f0: 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c  >pDeleter, 2, iL
6a00: 61 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ast);.  sqlite3_
6a10: 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72  step(p->pDeleter
6a20: 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  );.  p->rc = sql
6a30: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44  ite3_reset(p->pD
6a40: 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eleter);.}../*.*
6a50: 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63  * Remove all rec
6a60: 6f 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20  ords associated 
6a70: 77 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65  with segment iSe
6a80: 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  gid..*/.static v
6a90: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f  oid fts5DataRemo
6aa0: 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e  veSegment(Fts5In
6ab0: 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67  dex *p, int iSeg
6ac0: 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73  id){.  i64 iFirs
6ad0: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
6ae0: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30  _ROWID(iSegid, 0
6af0: 29 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d  );.  i64 iLast =
6b00: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
6b10: 57 49 44 28 69 53 65 67 69 64 2b 31 2c 20 30 29  WID(iSegid+1, 0)
6b20: 2d 31 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65  -1;.  fts5DataDe
6b30: 6c 65 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20  lete(p, iFirst, 
6b40: 69 4c 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d  iLast);.  if( p-
6b50: 3e 70 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20  >pIdxDeleter==0 
6b60: 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
6b70: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
6b80: 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73  pConfig;.    fts
6b90: 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
6ba0: 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c  t(p, &p->pIdxDel
6bb0: 65 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  eter, sqlite3_mp
6bc0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
6bd0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25   "DELETE FROM '%
6be0: 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52  q'.'%q_idx' WHER
6bf0: 45 20 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20  E segid=?",.    
6c00: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
6c10: 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
6c20: 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20  me.    ));.  }. 
6c30: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
6c40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6c50: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
6c60: 3e 70 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c  >pIdxDeleter, 1,
6c70: 20 69 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71   iSegid);.    sq
6c80: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49  lite3_step(p->pI
6c90: 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20  dxDeleter);.    
6ca0: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
6cb0: 72 65 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c  reset(p->pIdxDel
6cc0: 65 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eter);.  }.}../*
6cd0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
6ce0: 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74  ference to an Ft
6cf0: 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
6d00: 63 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  ct returned by a
6d10: 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61  n earlier .** ca
6d20: 6c 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74  ll to fts5Struct
6d30: 75 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73  ureRead() or fts
6d40: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
6d50: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
6d60: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
6d70: 52 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75  Release(Fts5Stru
6d80: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
6d90: 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26  .  if( pStruct &
6da0: 26 20 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d  & 0>=(--pStruct-
6db0: 3e 6e 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e  >nRef) ){.    in
6dc0: 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
6dd0: 20 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d   pStruct->nRef==
6de0: 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 );.    for(i=0
6df0: 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  ; i<pStruct->nLe
6e00: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
6e10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
6e20: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  truct->aLevel[i]
6e30: 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20  .aSeg);.    }.  
6e40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6e50: 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Struct);.  }.}..
6e60: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6e70: 53 74 72 75 63 74 75 72 65 52 65 66 28 46 74 73  StructureRef(Fts
6e80: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
6e90: 75 63 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d  uct){.  pStruct-
6ea0: 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nRef++;.}../*.*
6eb0: 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e  * Deserialize an
6ec0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72  d return the str
6ed0: 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 63 75  ucture record cu
6ee0: 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
6ef0: 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20  n serialized.** 
6f00: 66 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66  form within buff
6f10: 65 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a  er pData/nData..
6f20: 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74  **.** The Fts5St
6f30: 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d  ructure.aLevel[]
6f40: 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74   and each Fts5St
6f50: 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65  ructureLevel.aSe
6f60: 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  g[] array.** are
6f70: 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20   over-allocated 
6f80: 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69  by one slot. Thi
6f90: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72  s allows the str
6fa0: 75 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a  ucture contents.
6fb0: 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61  ** to be more ea
6fc0: 73 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a  sily edited..**.
6fd0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
6fe0: 63 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73  ccurs, *ppOut is
6ff0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
7000: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
7010: 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65   code.** returne
7020: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70  d. Otherwise, *p
7030: 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70  pOut is set to p
7040: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
7050: 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51  object and.** SQ
7060: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
7070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7080: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
7090: 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20  ode(.  const u8 
70a0: 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  *pData,         
70b0: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
70c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69   containing seri
70d0: 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65  alized structure
70e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c   */.  int nData,
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
7110: 20 62 75 66 66 65 72 20 70 44 61 74 61 20 69 6e   buffer pData in
7120: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
7130: 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20  *piCookie,      
7140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7150: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
7160: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46  kie value */.  F
7170: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
7180: 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f  pOut           /
7190: 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69  * OUT: Deseriali
71a0: 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  zed object */.){
71b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
71c0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d  TE_OK;.  int i =
71d0: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a   0;.  int iLvl;.
71e0: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30    int nLevel = 0
71f0: 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  ;.  int nSegment
7200: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74   = 0;.  int nByt
7210: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7220: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
7230: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
7240: 6f 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f  ocate at pRet */
7250: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
7260: 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
7270: 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20     /* Structure 
7280: 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e  object to return
7290: 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74   */..  /* Grab t
72a0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  he cookie value 
72b0: 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69  */.  if( piCooki
72c0: 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20  e ) *piCookie = 
72d0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32  sqlite3Fts5Get32
72e0: 28 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34  (pData);.  i = 4
72f0: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
7300: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
7310: 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d   levels and segm
7320: 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74  ents from the st
7330: 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
7340: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
7350: 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73  .  */.  i += fts
7360: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
7370: 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b  ata[i], nLevel);
7380: 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56  .  i += fts5GetV
7390: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
73a0: 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20  ], nSegment);.  
73b0: 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20  nByte = (.      
73c0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
73d0: 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20  ture) +         
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
73f0: 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  in structure */.
7400: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7410: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
7420: 20 2a 20 28 6e 4c 65 76 65 6c 2d 31 29 20 20 20   * (nLevel-1)   
7430: 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72   /* aLevel[] arr
7440: 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65  ay */.  );.  pRe
7450: 74 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  t = (Fts5Structu
7460: 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  re*)sqlite3Fts5M
7470: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
7480: 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52  Byte);..  if( pR
7490: 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e  et ){.    pRet->
74a0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 52  nRef = 1;.    pR
74b0: 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65  et->nLevel = nLe
74c0: 76 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  vel;.    pRet->n
74d0: 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65  Segment = nSegme
74e0: 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c  nt;.    i += sql
74f0: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
7500: 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52  t(&pData[i], &pR
7510: 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  et->nWriteCounte
7520: 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76  r);..    for(iLv
7530: 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l=0; rc==SQLITE_
7540: 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65  OK && iLvl<nLeve
7550: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
7560: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
7570: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52  evel *pLvl = &pR
7580: 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  et->aLevel[iLvl]
7590: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74  ;.      int nTot
75a0: 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  al;.      int iS
75b0: 65 67 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20  eg;..      i += 
75c0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
75d0: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
75e0: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
75f0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7600: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7610: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61  nTotal);.      a
7620: 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70  ssert( nTotal>=p
7630: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20  Lvl->nMerge );. 
7640: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
7650: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
7660: 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33  Segment*)sqlite3
7670: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
7680: 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e  rc, .          n
7690: 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46  Total * sizeof(F
76a0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
76b0: 65 6e 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20  ent).      );.. 
76c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
76d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
76e0: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
76f0: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7700: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
7710: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
7720: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7730: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7740: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7750: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
7760: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  id);.          i
7770: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7780: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
7790: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
77a0: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20  pgnoFirst);.    
77b0: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
77c0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
77d0: 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  a[i], pLvl->aSeg
77e0: 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29  [iSeg].pgnoLast)
77f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7810: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7820: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
7830: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
7840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7850: 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65  ..  *ppOut = pRe
7860: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
7870: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
7880: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
7890: 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e  ctureAddLevel(in
78a0: 74 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75  t *pRc, Fts5Stru
78b0: 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
78c0: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
78d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
78e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
78f0: 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
7900: 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76  ct;.    int nLev
7910: 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c  el = pStruct->nL
7920: 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42  evel;.    int nB
7930: 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20  yte = (.        
7940: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7950: 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20  ture) +         
7960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
7970: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7980: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7990: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
79a0: 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f   * (nLevel+1)  /
79b0: 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79  * aLevel[] array
79c0: 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20   */.    );..    
79d0: 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65  pStruct = sqlite
79e0: 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63  3_realloc(pStruc
79f0: 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  t, nByte);.    i
7a00: 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
7a10: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72      memset(&pStr
7a20: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76  uct->aLevel[nLev
7a30: 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  el], 0, sizeof(F
7a40: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7a50: 6c 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75  l));.      pStru
7a60: 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20  ct->nLevel++;.  
7a70: 20 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20      *ppStruct = 
7a80: 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c  pStruct;.    }el
7a90: 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d  se{.      *pRc =
7aa0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7ab0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
7ac0: 2a 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69  * Extend level i
7ad0: 4c 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72  Lvl so that ther
7ae0: 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74  e is room for at
7af0: 20 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f   least nExtra mo
7b00: 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a  re.** segments..
7b10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7b20: 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
7b30: 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a  ndLevel(.  int *
7b40: 70 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75  pRc, .  Fts5Stru
7b50: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20  cture *pStruct, 
7b60: 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20  .  int iLvl, .  
7b70: 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69  int nExtra, .  i
7b80: 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20  nt bInsert.){.  
7b90: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
7ba0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
7bb0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
7bc0: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
7bd0: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
7be0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
7bf0: 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20  egment *aNew;.  
7c00: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20    int nByte;..  
7c10: 20 20 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d    nByte = (pLvl-
7c20: 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20  >nSeg + nExtra) 
7c30: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
7c40: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
7c50: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
7c60: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d  e3_realloc(pLvl-
7c70: 3e 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20  >aSeg, nByte);. 
7c80: 20 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20     if( aNew ){. 
7c90: 20 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74       if( bInsert
7ca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==0 ){.        m
7cb0: 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c  emset(&aNew[pLvl
7cc0: 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65  ->nSeg], 0, size
7cd0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7ce0: 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72  Segment) * nExtr
7cf0: 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
7d00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f  .        int nMo
7d10: 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20  ve = pLvl->nSeg 
7d20: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
7d30: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
7d40: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
7d50: 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61  &aNew[nExtra], a
7d60: 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20  New, nMove);.   
7d70: 20 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77       memset(aNew
7d80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
7d90: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7da0: 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  ) * nExtra);.   
7db0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d     }.      pLvl-
7dc0: 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20  >aSeg = aNew;.  
7dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
7de0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
7df0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  EM;.    }.  }.}.
7e00: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73  ./*.** Read, des
7e10: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74  erialize and ret
7e20: 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  urn the structur
7e30: 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  e record..**.** 
7e40: 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  The Fts5Structur
7e50: 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65  e.aLevel[] and e
7e60: 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72  ach Fts5Structur
7e70: 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72  eLevel.aSeg[] ar
7e80: 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d  ray.** are over-
7e90: 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73  allocated as des
7ea0: 63 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74  cribed for funct
7eb0: 69 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75 72  ion fts5Structur
7ec0: 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62  eDecode() .** ab
7ed0: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ove..**.** If an
7ee0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
7ef0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
7f00: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
7f10: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a  e left in the.**
7f20: 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
7f30: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
7f40: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
7f50: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
7f60: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
7f70: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
7f80: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  op..*/.static Ft
7f90: 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73  s5Structure *fts
7fa0: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 46  5StructureRead(F
7fb0: 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
7fc0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
7fd0: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
7fe0: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
7ff0: 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  e *pRet = 0;    
8000: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
8010: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
8020: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8040: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  Configuration co
8050: 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  okie */.  Fts5Da
8060: 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44  ta *pData;..  pD
8070: 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
8080: 61 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43  ad(p, FTS5_STRUC
8090: 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69  TURE_ROWID);.  i
80a0: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
80b0: 6e 20 30 3b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  n 0;.  /* TODO: 
80c0: 44 6f 20 77 65 20 6e 65 65 64 20 74 68 69 73 20  Do we need this 
80d0: 69 66 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65  if the leaf-inde
80e0: 78 20 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50  x is appended? P
80f0: 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20  robably... */.  
8100: 6d 65 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70  memset(&pData->p
8110: 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20  [pData->nn], 0, 
8120: 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
8130: 47 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74  G);.  p->rc = ft
8140: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
8150: 65 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74  e(pData->p, pDat
8160: 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c  a->nn, &iCookie,
8170: 20 26 70 52 65 74 29 3b 0a 20 20 69 66 28 20 70   &pRet);.  if( p
8180: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8190: 26 26 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f  && pConfig->iCoo
81a0: 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a  kie!=iCookie ){.
81b0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
81c0: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61  te3Fts5ConfigLoa
81d0: 64 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b  d(pConfig, iCook
81e0: 69 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ie);.  }..  fts5
81f0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
8200: 61 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  a);.  if( p->rc!
8210: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8220: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
8230: 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20  elease(pRet);.  
8240: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
8250: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
8260: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8270: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8280: 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69  of segments in i
8290: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
82a0: 53 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20  Struct. This.** 
82b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
82c0: 20 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61   ever used as pa
82d0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63  rt of assert() c
82e0: 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69  onditions..*/.#i
82f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8300: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  G.static int fts
8310: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8320: 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75  egments(Fts5Stru
8330: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8340: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
8350: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8360: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
8370: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
8380: 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
8390: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
83c0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
83d0: 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f  levels */.    fo
83e0: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
83f0: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
8400: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  iLvl++){.      n
8410: 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75  Segment += pStru
8420: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
8430: 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nSeg;.    }.  }
8440: 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d  ..  return nSegm
8450: 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ent;.}.#endif../
8460: 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61  *.** Serialize a
8470: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74  nd store the "st
8480: 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e  ructure" record.
8490: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
84a0: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
84b0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
84c0: 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  n the Fts5Index 
84d0: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a  object. If an.**
84e0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
84f0: 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
8500: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
8510: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
8520: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
8530: 75 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64  ureWrite(Fts5Ind
8540: 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
8550: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
8560: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
8580: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
8590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
85a0: 75 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69  uffer to seriali
85b0: 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a  ze record into *
85c0: 2f 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  /.    int iLvl; 
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85e0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
85f0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
8600: 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  evels */.    int
8610: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
8620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
8630: 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74  okie value to st
8640: 6f 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ore */..    asse
8650: 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
8660: 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
8670: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
8680: 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
8690: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
86a0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
86b0: 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  fer));..    /* A
86c0: 70 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e  ppend the curren
86d0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
86e0: 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43  cookie */.    iC
86f0: 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66  ookie = p->pConf
8700: 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20  ig->iCookie;.   
8710: 20 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29   if( iCookie<0 )
8720: 20 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20   iCookie = 0;.  
8730: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8740: 6e 64 33 32 28 26 70 2d 3e 72 63 2c 20 26 62 75  nd32(&p->rc, &bu
8750: 66 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20  f, iCookie);..  
8760: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8770: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8780: 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e   &buf, pStruct->
8790: 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 66 74 73  nLevel);.    fts
87a0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
87b0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
87c0: 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  , pStruct->nSegm
87d0: 65 6e 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75  ent);.    fts5Bu
87e0: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
87f0: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28  (&p->rc, &buf, (
8800: 69 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72  i64)pStruct->nWr
8810: 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  iteCounter);..  
8820: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
8830: 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
8840: 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
8850: 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20     int iSeg;    
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8870: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
8880: 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d  ate through segm
8890: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74  ents */.      Ft
88a0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
88b0: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
88c0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
88d0: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
88e0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
88f0: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8900: 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20  ->nMerge);.     
8910: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8920: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8930: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67  &buf, pLvl->nSeg
8940: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8950: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70   pLvl->nMerge<=p
8960: 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20  Lvl->nSeg );..  
8970: 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
8980: 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
8990: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
89a0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
89b0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
89c0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
89d0: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
89e0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
89f0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8a00: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
8a10: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
8a20: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
8a30: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
8a40: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
8a50: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
8a60: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73  eg[iSeg].pgnoLas
8a70: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
8a80: 7d 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61 57  }..    fts5DataW
8a90: 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52  rite(p, FTS5_STR
8aa0: 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75  UCTURE_ROWID, bu
8ab0: 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
8ac0: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
8ad0: 26 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  &buf);.  }.}..#i
8ae0: 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20  f 0.static void 
8af0: 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
8b00: 72 65 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66  re(int*,Fts5Buff
8b10: 65 72 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72  er*,Fts5Structur
8b20: 65 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  e*);.static void
8b30: 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74   fts5PrintStruct
8b40: 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ure(const char *
8b50: 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74  zCaption, Fts5St
8b60: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
8b70: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
8b80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42  LITE_OK;.  Fts5B
8b90: 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
8ba0: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
8bb0: 65 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73  eof(buf));.  fts
8bc0: 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
8bd0: 26 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75  &rc, &buf, pStru
8be0: 63 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  ct);.  fprintf(s
8bf0: 74 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e  tdout, "%s: %s\n
8c00: 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66  ", zCaption, buf
8c10: 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74  .p);.  fflush(st
8c20: 64 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66  dout);.  fts5Buf
8c30: 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
8c40: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8c50: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
8c60: 72 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a  re(x,y).#endif..
8c70: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
8c80: 65 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53  egmentSize(Fts5S
8c90: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
8ca0: 2a 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e  *pSeg){.  return
8cb0: 20 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   1 + pSeg->pgnoL
8cc0: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
8cd0: 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  First;.}../*.** 
8ce0: 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  Return a copy of
8cf0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
8d00: 20 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74   pStruct. Except
8d10: 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e  , promote as man
8d20: 79 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61  y .** segments a
8d30: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65  s possible to le
8d40: 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66  vel iPromote. If
8d50: 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20   an OOM occurs, 
8d60: 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75  NULL is .** retu
8d70: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
8d80: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
8d90: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46  rePromoteTo(.  F
8da0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
8db0: 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69  nt iPromote,.  i
8dc0: 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20  nt szPromote,.  
8dd0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8de0: 53 74 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Struct.){.  int 
8df0: 69 6c 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74  il, is;.  Fts5St
8e00: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f  ructureLevel *pO
8e10: 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
8e20: 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b  Level[iPromote];
8e30: 0a 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d  ..  if( pOut->nM
8e40: 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  erge==0 ){.    f
8e50: 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31  or(il=iPromote+1
8e60: 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  ; il<pStruct->nL
8e70: 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20  evel; il++){.   
8e80: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
8e90: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
8ea0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8eb0: 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  l];.      if( pL
8ec0: 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74  vl->nMerge ) ret
8ed0: 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  urn;.      for(i
8ee0: 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20  s=pLvl->nSeg-1; 
8ef0: 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20  is>=0; is--){.  
8f00: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66        int sz = f
8f10: 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26  ts5SegmentSize(&
8f20: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b  pLvl->aSeg[is]);
8f30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
8f40: 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75  szPromote ) retu
8f50: 72 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  rn;.        fts5
8f60: 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
8f70: 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
8f80: 72 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20  ruct, iPromote, 
8f90: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  1, 1);.        i
8fa0: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
8fb0: 6e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  n;.        memcp
8fc0: 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70  y(pOut->aSeg, &p
8fd0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73  Lvl->aSeg[is], s
8fe0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
8ff0: 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20  ureSegment));.  
9000: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67        pOut->nSeg
9010: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c  ++;.        pLvl
9020: 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20  ->nSeg--;.      
9030: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
9040: 2a 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65  *.** A new segme
9050: 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  nt has just been
9060: 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65   written to leve
9070: 6c 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20  l iLvl of index 
9080: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74  structure.** pSt
9090: 72 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ruct. This funct
90a0: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69  ion determines i
90b0: 66 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73  f any segments s
90c0: 68 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65  hould be promote
90d0: 64 0a 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74  d.** as a result
90e0: 2e 20 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70  . Segments are p
90f0: 72 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73  romoted in two s
9100: 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
9110: 20 20 61 29 20 49 66 20 74 68 65 20 73 65 67 6d    a) If the segm
9120: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9130: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
9140: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
9150: 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69  ments.**      wi
9160: 74 68 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  thin the previou
9170: 73 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65  s populated leve
9180: 6c 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65  l, it is promote
9190: 64 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  d to the previou
91a0: 73 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61  s.**      popula
91b0: 74 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ted level..**.**
91c0: 20 20 20 62 29 20 49 66 20 74 68 65 20 73 65 67     b) If the seg
91d0: 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  ment just writte
91e0: 6e 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  n is larger than
91f0: 20 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d   the newest segm
9200: 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74  ent on.**      t
9210: 68 65 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65  he next populate
9220: 64 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68  d level, then th
9230: 61 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20  at segment, and 
9240: 61 6e 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65  any other adjace
9250: 6e 74 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65  nt.**      segme
9260: 6e 74 73 20 74 68 61 74 20 61 72 65 20 61 6c 73  nts that are als
9270: 6f 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  o smaller than t
9280: 68 65 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74  he one just writ
9290: 74 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20  ten, are .**    
92a0: 20 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a    promoted. .**.
92b0: 2a 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** If one or mor
92c0: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70  e segments are p
92d0: 72 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72  romoted, the str
92e0: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73  ucture object is
92f0: 20 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72   updated.** to r
9300: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a  eflect this..*/.
9310: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9320: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9330: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
9340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9350: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
9360: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
9370: 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20  int iLvl,       
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 2f 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a  /* Index level j
93a0: 75 73 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20  ust updated */. 
93b0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
93c0: 70 53 74 72 75 63 74 20 20 20 20 20 20 20 20 20  pStruct         
93d0: 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
93e0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ure */.){.  if( 
93f0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9400: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74   ){.    int iTst
9410: 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f  ;.    int iPromo
9420: 74 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  te = -1;.    int
9430: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20   szPromote = 0; 
9440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9450: 6f 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74  omote anything t
9460: 68 69 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c  his size or smal
9470: 6c 65 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53  ler */.    Fts5S
9480: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
9490: 2a 70 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d  *pSeg;   /* Segm
94a0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
94b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65   */.    int szSe
94c0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
94d0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
94e0: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
94f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
9500: 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d   nSeg = pStruct-
9510: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
9520: 65 67 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 65  eg;..    if( nSe
9530: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  g==0 ) return;. 
9540: 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75     pSeg = &pStru
9550: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
9560: 2e 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61  .aSeg[pStruct->a
9570: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
9580: 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d  -1];.    szSeg =
9590: 20 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f   (1 + pSeg->pgno
95a0: 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e  Last - pSeg->pgn
95b0: 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a  oFirst);..    /*
95c0: 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69   Check for condi
95d0: 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20  tion (a) */.    
95e0: 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b  for(iTst=iLvl-1;
95f0: 20 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72   iTst>=0 && pStr
9600: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74  uct->aLevel[iTst
9610: 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d  ].nSeg==0; iTst-
9620: 2d 29 3b 0a 20 20 20 20 69 66 28 20 69 54 73 74  -);.    if( iTst
9630: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
9640: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   i;.      int sz
9650: 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 46  Max = 0;.      F
9660: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
9670: 6c 20 2a 70 54 73 74 20 3d 20 26 70 53 74 72 75  l *pTst = &pStru
9680: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d  ct->aLevel[iTst]
9690: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
96a0: 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20  pTst->nMerge==0 
96b0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
96c0: 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20  ; i<pTst->nSeg; 
96d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
96e0: 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65  t sz = pTst->aSe
96f0: 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20  g[i].pgnoLast - 
9700: 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67  pTst->aSeg[i].pg
9710: 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20  noFirst + 1;.   
9720: 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61       if( sz>szMa
9730: 78 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a  x ) szMax = sz;.
9740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9750: 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29  ( szMax>=szSeg )
9760: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  {.        /* Con
9770: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 74 72  dition (a) is tr
9780: 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65 20  ue. Promote the 
9790: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
97a0: 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20 20 20 20  n level .       
97b0: 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65   ** iLvl to leve
97c0: 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20  l iTst.  */.    
97d0: 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69      iPromote = i
97e0: 54 73 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 50  Tst;.        szP
97f0: 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a  romote = szMax;.
9800: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9810: 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69     /* If conditi
9820: 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74 20 6d 65  on (a) is not me
9830: 74 2c 20 61 73 73 75 6d 65 20 28 62 29 20 69 73  t, assume (b) is
9840: 20 74 72 75 65 2e 20 53 74 72 75 63 74 75 72 65   true. Structure
9850: 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20  PromoteTo().    
9860: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ** is a no-op if
9870: 20 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a   it is not.  */.
9880: 20 20 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65      if( iPromote
9890: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 50 72 6f  <0 ){.      iPro
98a0: 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  mote = iLvl;.   
98b0: 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73     szPromote = s
98c0: 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zSeg;.    }.    
98d0: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
98e0: 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f  moteTo(p, iPromo
98f0: 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70  te, szPromote, p
9900: 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Struct);.  }.}..
9910: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
9920: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
9930: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
9940: 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  rgument. If the 
9950: 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64  end of the .** d
9960: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67  oclist-index pag
9970: 65 20 69 73 20 72 65 61 63 68 65 64 2c 20 72 65  e is reached, re
9980: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
9990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
99a0: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74  5DlidxLvlNext(Ft
99b0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
99c0: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
99d0: 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61  Data = pLvl->pDa
99e0: 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d  ta;..  if( pLvl-
99f0: 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >iOff==0 ){.    
9a00: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45  assert( pLvl->bE
9a10: 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  of==0 );.    pLv
9a20: 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20  l->iOff = 1;.   
9a30: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66   pLvl->iOff += f
9a40: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
9a50: 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76  pData->p[1], pLv
9a60: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  l->iLeafPgno);. 
9a70: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d     pLvl->iOff +=
9a80: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
9a90: 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69  pData->p[pLvl->i
9aa0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76  Off], (u64*)&pLv
9ab0: 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  l->iRowid);.    
9ac0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
9ad0: 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20  = pLvl->iOff;.  
9ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
9af0: 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66  Off;.    for(iOf
9b00: 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f  f=pLvl->iOff; iO
9b10: 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f  ff<pData->nn; iO
9b20: 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ff++){.      if(
9b30: 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20   pData->p[iOff] 
9b40: 29 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a  ) break; .    }.
9b50: 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44  .    if( iOff<pD
9b60: 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20  ata->nn ){.     
9b70: 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20   i64 iVal;.     
9b80: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
9b90: 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c   += (iOff - pLvl
9ba0: 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20  ->iOff) + 1;.   
9bb0: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
9bc0: 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
9bd0: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
9be0: 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c  &iVal);.      pL
9bf0: 76 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56  vl->iRowid += iV
9c00: 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  al;.      pLvl->
9c10: 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20  iOff = iOff;.   
9c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
9c30: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
9c40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
9c50: 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a  n pLvl->bEof;.}.
9c60: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
9c70: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
9c80: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
9c90: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
9ca0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
9cb0: 49 74 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e  IterNextR(Fts5In
9cc0: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
9cd0: 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
9ce0: 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44  t iLvl){.  Fts5D
9cf0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
9d00: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76  &pIter->aLvl[iLv
9d10: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  l];..  assert( i
9d20: 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  Lvl<pIter->nLvl 
9d30: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  );.  if( fts5Dli
9d40: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20  dxLvlNext(pLvl) 
9d50: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c  ){.    if( (iLvl
9d60: 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76  +1) < pIter->nLv
9d70: 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  l ){.      fts5D
9d80: 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c  lidxIterNextR(p,
9d90: 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b   pIter, iLvl+1);
9da0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b  .      if( pLvl[
9db0: 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  1].bEof==0 ){.  
9dc0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
9dd0: 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
9de0: 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  a);.        mems
9df0: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
9e00: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
9e10: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
9e20: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
9e30: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
9e40: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
9e50: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
9e60: 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  egid, iLvl, pLvl
9e70: 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  [1].iLeafPgno). 
9e80: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
9e90: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
9ea0: 61 20 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  a ) fts5DlidxLvl
9eb0: 4e 65 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20  Next(pLvl);.    
9ec0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9ed0: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
9ee0: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73  Lvl[0].bEof;.}.s
9ef0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
9f00: 69 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35  idxIterNext(Fts5
9f10: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
9f20: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
9f30: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c  .  return fts5Dl
9f40: 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20  idxIterNextR(p, 
9f50: 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  pIter, 0);.}../*
9f60: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
9f70: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
9f80: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61  irst argument ha
9f90: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
9fa0: 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73  fields set.** as
9fb0: 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66   follows. This f
9fc0: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20  unction sets up 
9fd0: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
9fe0: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
9ff0: 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f   it.** points to
a000: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
a010: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d   in the doclist-
a020: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70  index..**.**   p
a030: 44 61 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69  Data:.**     poi
a040: 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d  nter to doclist-
a050: 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a  index record, .*
a060: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
a070: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a080: 64 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  d pIter->iLeafPg
a090: 6e 6f 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  no is the page n
a0a0: 75 6d 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63  umber the.** doc
a0b0: 6c 69 73 74 20 69 73 20 61 73 73 6f 63 69 61 74  list is associat
a0c0: 65 64 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65  ed with (the one
a0d0: 20 66 65 61 74 75 72 69 6e 67 20 74 68 65 20 74   featuring the t
a0e0: 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erm)..*/.static 
a0f0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
a100: 72 46 69 72 73 74 28 46 74 73 35 44 6c 69 64 78  rFirst(Fts5Dlidx
a110: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
a120: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
a130: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
a140: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44   i++){.    fts5D
a150: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74  lidxLvlNext(&pIt
a160: 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20  er->aLvl[i]);.  
a170: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  }.  return pIter
a180: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
a190: 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  }...static int f
a1a0: 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
a1b0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
a1c0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
a1d0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  er){.  return p-
a1e0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
a1f0: 7c 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  | pIter->aLvl[0]
a200: 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63  .bEof;.}..static
a210: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
a220: 74 65 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65  terLast(Fts5Inde
a230: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
a240: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
a250: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61  nt i;..  /* Adva
a260: 6e 63 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74  nce each level t
a270: 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
a280: 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67   on the last pag
a290: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74  e */.  for(i=pIt
a2a0: 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72  er->nLvl-1; p->r
a2b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
a2c0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
a2d0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
a2e0: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
a2f0: 6c 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[i];.    while(
a300: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
a310: 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20  t(pLvl)==0 );.  
a320: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30    pLvl->bEof = 0
a330: 3b 0a 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  ;..    if( i>0 )
a340: 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  {.      Fts5Dlid
a350: 78 4c 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26  xLvl *pChild = &
a360: 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20  pLvl[-1];.      
a370: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
a380: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a  pChild->pData);.
a390: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68        memset(pCh
a3a0: 69 6c 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ild, 0, sizeof(F
a3b0: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
a3c0: 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61       pChild->pDa
a3d0: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
a3e0: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
a3f0: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
a400: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
a410: 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  i-1, pLvl->iLeaf
a420: 50 67 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20  Pgno).      );. 
a430: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a440: 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
a450: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
a460: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
a470: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
a480: 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  entry..*/.static
a490: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76   int fts5DlidxLv
a4a0: 6c 50 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c  lPrev(Fts5DlidxL
a4b0: 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74  vl *pLvl){.  int
a4c0: 20 69 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f   iOff = pLvl->iO
a4d0: 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ff;..  assert( p
a4e0: 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a  Lvl->bEof==0 );.
a4f0: 20 20 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c    if( iOff<=pLvl
a500: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
a510: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
a520: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
a530: 75 38 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44  u8 *a = pLvl->pD
a540: 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20  ata->p;.    i64 
a550: 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c  iVal;.    int iL
a560: 69 6d 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69  imit;.    int ii
a570: 3b 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20  ;.    int nZero 
a580: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72  = 0;..    /* Cur
a590: 72 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e  rently iOff poin
a5a0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
a5b0: 62 79 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74  byte of a varint
a5c0: 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20  . This block .  
a5d0: 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20    ** decrements 
a5e0: 69 4f 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f  iOff until it po
a5f0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
a600: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 72  t byte of the pr
a610: 65 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76  evious .    ** v
a620: 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61  arint. Taking ca
a630: 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61  re not to read a
a640: 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ny memory locati
a650: 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20  ons that occur. 
a660: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65     ** before the
a670: 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72   buffer in memor
a680: 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69  y.  */.    iLimi
a690: 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f  t = (iOff>9 ? iO
a6a0: 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66  ff-9 : 0);.    f
a6b0: 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e  or(iOff--; iOff>
a6c0: 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b  iLimit; iOff--){
a6d0: 0a 20 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f  .      if( (a[iO
a6e0: 66 66 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30  ff-1] & 0x80)==0
a6f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
a700: 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69  .    fts5GetVari
a710: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
a720: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70  4*)&iVal);.    p
a730: 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  Lvl->iRowid -= i
a740: 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  Val;.    pLvl->i
a750: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20  LeafPgno--;..   
a760: 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72   /* Skip backwar
a770: 64 73 20 70 61 73 74 20 61 6e 79 20 30 78 30 30  ds past any 0x00
a780: 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20   varints. */.   
a790: 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20   for(ii=iOff-1; 
a7a0: 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  ii>=pLvl->iFirst
a7b0: 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78  Off && a[ii]==0x
a7c0: 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20  00; ii--){.     
a7d0: 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a   nZero++;.    }.
a7e0: 20 20 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c      if( ii>=pLvl
a7f0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 28  ->iFirstOff && (
a800: 61 5b 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b  a[ii] & 0x80) ){
a810: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79  .      /* The by
a820: 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  te immediately b
a830: 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30  efore the last 0
a840: 78 30 30 20 62 79 74 65 20 68 61 73 20 74 68 65  x00 byte has the
a850: 20 30 78 38 30 20 62 69 74 0a 20 20 20 20 20 20   0x80 bit.      
a860: 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c  ** set. So the l
a870: 61 73 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79  ast 0x00 is only
a880: 20 61 20 76 61 72 69 6e 74 20 30 20 69 66 20 74   a varint 0 if t
a890: 68 65 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20  here are 8 more 
a8a0: 30 78 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79  0x80.      ** by
a8b0: 74 65 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d  tes before a[ii]
a8c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  . */.      int b
a8d0: 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Zero = 0;       
a8e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a8f0: 66 20 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e  f last 0x00 coun
a900: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
a910: 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46  (ii-8)>=pLvl->iF
a920: 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20  irstOff ){.     
a930: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
a940: 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20    for(j=1; j<=8 
a950: 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78  && (a[ii-j] & 0x
a960: 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20  80); j++);.     
a970: 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29     bZero = (j>8)
a980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a990: 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e  if( bZero==0 ) n
a9a0: 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Zero--;.    }.  
a9b0: 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e    pLvl->iLeafPgn
a9c0: 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20  o -= nZero;.    
a9d0: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  pLvl->iOff = iOf
a9e0: 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a  f - nZero;.  }..
a9f0: 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62    return pLvl->b
aa00: 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Eof;.}..static i
aa10: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
aa20: 50 72 65 76 52 28 46 74 73 35 49 6e 64 65 78 20  PrevR(Fts5Index 
aa30: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
aa40: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c  r *pIter, int iL
aa50: 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  vl){.  Fts5Dlidx
aa60: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  Lvl *pLvl = &pIt
aa70: 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a  er->aLvl[iLvl];.
aa80: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c  .  assert( iLvl<
aa90: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20  pIter->nLvl );. 
aaa0: 20 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76   if( fts5DlidxLv
aab0: 6c 50 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20  lPrev(pLvl) ){. 
aac0: 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20     if( (iLvl+1) 
aad0: 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b  < pIter->nLvl ){
aae0: 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
aaf0: 49 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74  IterPrevR(p, pIt
ab00: 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20  er, iLvl+1);.   
ab10: 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62     if( pLvl[1].b
ab20: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
ab30: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
ab40: 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
ab50: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
ab60: 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Lvl, 0, sizeof(F
ab70: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
ab80: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61         pLvl->pDa
ab90: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
aba0: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
abb0: 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
abc0: 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64  ID(pIter->iSegid
abd0: 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e  , iLvl, pLvl[1].
abe0: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
abf0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
ac00: 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b  ( pLvl->pData ){
ac10: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
ac20: 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ( fts5DlidxLvlNe
ac30: 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20  xt(pLvl)==0 );. 
ac40: 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62           pLvl->b
ac50: 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Eof = 0;.       
ac60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ac70: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
ac80: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
ac90: 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  of;.}.static int
aca0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
acb0: 65 76 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ev(Fts5Index *p,
acc0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
acd0: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
ace0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
acf0: 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29  evR(p, pIter, 0)
ad00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
ad10: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
ad20: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
ad30: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73  allocated by fts
ad40: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29  5DlidxIterInit()
ad50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ad60: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
ad70: 65 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  ee(Fts5DlidxIter
ad80: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
ad90: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
ada0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
adb0: 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
adc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
add0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
ade0: 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61  r->aLvl[i].pData
adf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ae00: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
ae10: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
ae20: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66  Fts5DlidxIter *f
ae30: 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
ae40: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
ae50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ae60: 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b      /* Fts5 Back
ae70: 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
ae80: 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ithin */.  int b
ae90: 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
aea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
aeb0: 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20  ue for ORDER BY 
aec0: 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ASC */.  int iSe
aed0: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
aee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
aef0: 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
af00: 69 4c 65 61 66 50 67 20 20 20 20 20 20 20 20 20  iLeafPg         
af10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
af20: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
af30: 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f  to load dlidx fo
af40: 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c  r */.){.  Fts5Dl
af50: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  idxIter *pIter =
af60: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
af70: 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20  nt bDone = 0;.. 
af80: 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
af90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44  =SQLITE_OK && bD
afa0: 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  one==0; i++){.  
afb0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
afc0: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74  zeof(Fts5DlidxIt
afd0: 65 72 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66  er) + i * sizeof
afe0: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a  (Fts5DlidxLvl);.
aff0: 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65      Fts5DlidxIte
b000: 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e  r *pNew;..    pN
b010: 65 77 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49  ew = (Fts5DlidxI
b020: 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ter*)sqlite3_rea
b030: 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74  lloc(pIter, nByt
b040: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
b050: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
b060: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
b070: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
b080: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
b090: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
b0a0: 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65  D(iSegid, i, iLe
b0b0: 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73  afPg);.      Fts
b0c0: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
b0d0: 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d  = &pNew->aLvl[i]
b0e0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20  ;.      pIter = 
b0f0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73  pNew;.      mems
b100: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
b110: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b120: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
b130: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
b140: 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a  ead(p, iRowid);.
b150: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
b160: 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e  pData && (pLvl->
b170: 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78  pData->p[0] & 0x
b180: 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0001)==0 ){.    
b190: 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
b1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
b1b0: 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a  er->nLvl = i+1;.
b1c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
b1d0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b1e0: 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
b1f0: 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
b200: 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
b210: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
b220: 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74  idxIterFirst(pIt
b230: 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
b240: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
b250: 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72  terLast(p, pIter
b260: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
b270: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
b280: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35  E_OK ){.    fts5
b290: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49  DlidxIterFree(pI
b2a0: 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20  ter);.    pIter 
b2b0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
b2c0: 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61  rn pIter;.}..sta
b2d0: 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64  tic i64 fts5Dlid
b2e0: 78 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44  xIterRowid(Fts5D
b2f0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b300: 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  {.  return pIter
b310: 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64  ->aLvl[0].iRowid
b320: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
b330: 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
b340: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
b350: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
b360: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
b370: 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  iLeafPgno;.}../*
b380: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78  .** Load the nex
b390: 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f  t leaf page into
b3a0: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65   the segment ite
b3b0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
b3c0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
b3d0: 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73  rNextPage(.  Fts
b3e0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b400: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
b410: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
b420: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
b430: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
b440: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
b450: 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  to next page */.
b460: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
b470: 4c 65 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75  Leaf;.  Fts5Stru
b480: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
b490: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
b4a0: 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
b4b0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
b4c0: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
b4d0: 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70  fPgno++;.  if( p
b4e0: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
b4f0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  ){.    pIter->pL
b500: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  eaf = pIter->pNe
b510: 78 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65  xtLeaf;.    pIte
b520: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30  r->pNextLeaf = 0
b530: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ;.  }else if( pI
b540: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d  ter->iLeafPgno<=
b550: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
b560: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
b570: 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
b580: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54  d(p, .        FT
b590: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
b5a0: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
b5b0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  Iter->iLeafPgno)
b5c0: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
b5d0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
b5e0: 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65  f = 0;.  }.  pLe
b5f0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
b600: 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20  f;..  if( pLeaf 
b610: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  ){.    pIter->iP
b620: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
b630: 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28  >szLeaf;.    if(
b640: 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
b650: 65 73 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20  ess(pLeaf) ){.  
b660: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
b670: 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66  fDoclist = pLeaf
b680: 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  ->nn+1;.    }els
b690: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
b6a0: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
b6b0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
b6c0: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50  eaf->p[pIter->iP
b6d0: 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20  gidxOff],.      
b6e0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
b6f0: 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29  fDoclist.      )
b700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
b710: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
b720: 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
b730: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
b740: 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74  varint to be int
b750: 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a  erpreted as a.**
b760: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
b770: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
b780: 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72  the varint and r
b790: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
b7a0: 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61   of bytes.** rea
b7b0: 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  d. Before return
b7c0: 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74  ing, set *pnSz t
b7d0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
b7e0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73  bytes in the pos
b7f0: 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61  ition.** list, a
b800: 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75  nd *pbDel to tru
b810: 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20  e if the delete 
b820: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20  flag is set, or 
b830: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
b840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
b850: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
b860: 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69  e(const u8 *p, i
b870: 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70  nt *pnSz, int *p
b880: 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a  bDel){.  int nSz
b890: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
b8a0: 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
b8b0: 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b  nt32(p, n, nSz);
b8c0: 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53  .  assert_nc( nS
b8d0: 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20  z>=0 );.  *pnSz 
b8e0: 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65  = nSz/2;.  *pbDe
b8f0: 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31  l = nSz & 0x0001
b900: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
b910: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
b920: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
b930: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
b940: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
b950: 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69  e of a.** positi
b960: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
b970: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c  ld. Read the val
b980: 75 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  ue of the field 
b990: 61 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20  and store it.** 
b9a0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
b9b0: 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
b9c0: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
b9d0: 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65  nPos.**   Fts5Se
b9e0: 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a  gIter.bDel.**.**
b9f0: 20 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74   Leave Fts5SegIt
ba00: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
ba10: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
ba20: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
ba30: 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69   .** position li
ba40: 73 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61  st content (if a
ba50: 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ny)..*/.static v
ba60: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
ba70: 6f 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65  oadNPos(Fts5Inde
ba80: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
ba90: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
baa0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
bab0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  K ){.    int iOf
bac0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
bad0: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
bae0: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
baf0: 0a 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20  .    int nSz;.  
bb00: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
bb10: 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  OK(pIter->pLeaf)
bb20: 3b 0a 20 20 20 20 66 74 73 35 46 61 73 74 47 65  ;.    fts5FastGe
bb30: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d  tVarint32(pIter-
bb40: 3e 70 4c 65 61 66 2d 3e 70 2c 20 69 4f 66 66 2c  >pLeaf->p, iOff,
bb50: 20 6e 53 7a 29 3b 0a 20 20 20 20 70 49 74 65 72   nSz);.    pIter
bb60: 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20  ->bDel = (nSz & 
bb70: 30 78 30 30 30 31 29 3b 0a 20 20 20 20 70 49 74  0x0001);.    pIt
bb80: 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e  er->nPos = nSz>>
bb90: 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  1;.    pIter->iL
bba0: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
bbb0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
bbc0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
bbd0: 4c 6f 61 64 52 6f 77 69 64 28 46 74 73 35 49 6e  LoadRowid(Fts5In
bbe0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
bbf0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75  ter *pIter){.  u
bc00: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
bc10: 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f  eaf->p;        /
bc20: 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64  * Buffer to read
bc30: 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20   data from */.  
bc40: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
bc50: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a  ->iLeafOffset;..
bc60: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
bc70: 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  OK(pIter->pLeaf)
bc80: 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49  ;.  if( iOff>=pI
bc90: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
bca0: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
bcb0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
bcc0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28   pIter);.    if(
bcd0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
bce0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
bcf0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
bd00: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
bd10: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74  RRUPT;.      ret
bd20: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
bd30: 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d  Off = 4;.    a =
bd40: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
bd50: 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20  ;.  }.  iOff += 
bd60: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
bd70: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
bd80: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
bd90: 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  wid);.  pIter->i
bda0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
bdb0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35  f;.}../*.** Fts5
bdc0: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
bdd0: 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  set currently po
bde0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
bdf0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
be00: 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c  * "nSuffix" fiel
be10: 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e  d of a term. Fun
be20: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
be30: 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74  nKeep contains t
be40: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
be50: 68 65 20 22 6e 50 72 65 66 69 78 22 20 66 69 65  he "nPrefix" fie
be60: 6c 64 20 28 69 66 20 74 68 65 72 65 20 77 61 73  ld (if there was
be70: 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73   one - it is pas
be80: 73 65 64 20 30 20 69 66 20 74 68 69 73 20 69 73  sed 0 if this is
be90: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 65  .** the first te
bea0: 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
beb0: 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  t)..**.** This f
bec0: 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65  unction populate
bed0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53  s:.**.**   Fts5S
bee0: 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20  egIter.term.**  
bef0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77   Fts5SegIter.row
bf00: 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69  id.**.** accordi
bf10: 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20  ngly and leaves 
bf20: 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65  (Fts5SegIter.iLe
bf30: 61 66 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f  afOffset) set to
bf40: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
bf50: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f 73  ** the first pos
bf60: 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20  ition list. The 
bf70: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65  position list be
bf80: 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d  longing to docum
bf90: 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67  ent .** (Fts5Seg
bfa0: 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f  Iter.iRowid)..*/
bfb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
bfc0: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
bfd0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
bfe0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
bff0: 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20  r, int nKeep){. 
c000: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
c010: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
c020: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
c030: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
c040: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
c050: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
c060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
c070: 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20  ead at */.  int 
c080: 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
c090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
c0a0: 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61  ytes of new data
c0b0: 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66   */..  iOff += f
c0c0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
c0d0: 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  a[iOff], nNew);.
c0e0: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
c0f0: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
c100: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
c110: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
c120: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
c130: 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  Off]);.  iOff +=
c140: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
c150: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
c160: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
c170: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
c180: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
c190: 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  o;.  pIter->iLea
c1a0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
c1b0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50  .  if( pIter->iP
c1c0: 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  gidxOff>=pIter->
c1d0: 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pLeaf->nn ){.   
c1e0: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
c1f0: 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
c200: 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
c210: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
c220: 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  tra;.    pIter->
c230: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
c240: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
c250: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
c260: 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
c270: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
c280: 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a  list += nExtra;.
c290: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
c2a0: 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70  erLoadRowid(p, p
c2b0: 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Iter);.}../*.** 
c2c0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69  Initialize the i
c2d0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
c2e0: 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20  Iter to iterate 
c2f0: 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74 72  through the entr
c300: 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e  ies in.** segmen
c310: 74 20 70 53 65 67 2e 20 54 68 65 20 69 74 65 72  t pSeg. The iter
c320: 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  ator is left poi
c330: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
c340: 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20 0a 2a  st entry when .*
c350: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
c360: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
c370: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
c380: 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
c390: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
c3a0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
c3b0: 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
c3c0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
c3d0: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
c3e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
c3f0: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
c400: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
c410: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
c420: 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
c430: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
c440: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
c450: 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
c460: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
c470: 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20  egment *pSeg,   
c480: 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
c490: 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20   of segment */. 
c4a0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c4b0: 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
c4c0: 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f   /* Object to po
c4d0: 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  pulate */.){.  i
c4e0: 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  f( pSeg->pgnoFir
c4f0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  st==0 ){.    /* 
c500: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
c510: 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 62  the segment is b
c520: 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e 20  eing used as an 
c530: 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63 72  input to an incr
c540: 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d  emental.    ** m
c550: 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61 74  erge and all dat
c560: 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
c570: 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53 65  en "trimmed". Se
c580: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a  e function.    *
c590: 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e  * fts5TrimSegmen
c5a0: 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  ts() for details
c5b0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
c5c0: 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  eave the iterato
c5d0: 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20  r empty..    ** 
c5e0: 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
c5f0: 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d 3e  see the (pIter->
c600: 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61 73  pLeaf==0) and as
c610: 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74 6f  sume the iterato
c620: 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20 45  r is.    ** at E
c630: 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20  OF already. */. 
c640: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
c650: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  ->pLeaf==0 );.  
c660: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
c670: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
c680: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d  TE_OK ){.    mem
c690: 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
c6a0: 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
c6b0: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d     pIter->pSeg =
c6c0: 20 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72   pSeg;.    pIter
c6d0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53  ->iLeafPgno = pS
c6e0: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b  eg->pgnoFirst-1;
c6f0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
c700: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
c710: 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
c720: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c730: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  ){.    pIter->iL
c740: 65 61 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20  eafOffset = 4;. 
c750: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49     assert_nc( pI
c760: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34  ter->pLeaf->nn>4
c770: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c780: 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72  fts5LeafFirstTer
c790: 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61  mOff(pIter->pLea
c7a0: 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49 74  f)==4 );.    pIt
c7b0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
c7c0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
c7d0: 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66 74 73 35  Leaf+1;.    fts5
c7e0: 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
c7f0: 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20  p, pIter, 0);.  
c800: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
c810: 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
c820: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
c830: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
c840: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
c850: 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72 65  on iterators cre
c860: 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  ated by calls to
c870: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75 65  .** Fts5IndexQue
c880: 72 79 28 29 20 77 69 74 68 20 74 68 65 20 46 54  ry() with the FT
c890: 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
c8a0: 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  SC flag set..**.
c8b0: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
c8c0: 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61 6c  is in an unusual
c8d0: 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
c8e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
c8f0: 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73 35  led: the.** Fts5
c900: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
c910: 73 65 74 20 76 61 72 69 61 62 6c 65 20 69 73 20  set variable is 
c920: 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
c930: 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f  t of the start o
c940: 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f  f.** the positio
c950: 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
c960: 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  d for the first 
c970: 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f  relevant rowid o
c980: 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 46  n the page..** F
c990: 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64  ts5SegIter.rowid
c9a0: 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50 6f   is set, but nPo
c9b0: 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20 6e  s and bDel are n
c9c0: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ot..**.** This f
c9d0: 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73  unction advances
c9e0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
c9f0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
ca00: 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20  to the last .** 
ca10: 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f  relevant rowid o
ca20: 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c 20  n the page and, 
ca30: 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e  if necessary, in
ca40: 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a 2a  itializes the .*
ca50: 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  * aRowidOffset[]
ca60: 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65   and iRowidOffse
ca70: 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74 20  t variables. At 
ca80: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 69  this point the i
ca90: 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e  terator.** is in
caa0: 20 69 74 73 20 72 65 67 75 6c 61 72 20 73 74 61   its regular sta
cab0: 74 65 20 2d 20 46 74 73 35 53 65 67 49 74 65 72  te - Fts5SegIter
cac0: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69  .iLeafOffset poi
cad0: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
cae0: 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65 20  .** byte of the 
caf0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
cb00: 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ntent associated
cb10: 20 77 69 74 68 20 73 61 69 64 20 72 6f 77 69 64   with said rowid
cb20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cb30: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
cb40: 72 73 65 49 6e 69 74 50 61 67 65 28 46 74 73 35  rseInitPage(Fts5
cb50: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
cb60: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
cb70: 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
cb80: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
cb90: 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e   int i = pIter->
cba0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75  iLeafOffset;.  u
cbb0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
cbc0: 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52  eaf->p;.  int iR
cbd0: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a  owidOffset = 0;.
cbe0: 0a 20 20 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e  .  if( n>pIter->
cbf0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
cc00: 0a 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e  .    n = pIter->
cc10: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20  iEndofDoclist;. 
cc20: 20 7d 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c   }..  ASSERT_SZL
cc30: 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c  EAF_OK(pIter->pL
cc40: 65 61 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  eaf);.  while( 1
cc50: 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c   ){.    i64 iDel
cc60: 74 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ta = 0;.    int 
cc70: 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44  nPos;.    int bD
cc80: 75 6d 6d 79 3b 0a 0a 20 20 20 20 69 20 2b 3d 20  ummy;..    i += 
cc90: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
cca0: 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c  ze(&a[i], &nPos,
ccb0: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69   &bDummy);.    i
ccc0: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 69 66   += nPos;.    if
ccd0: 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a  ( i>=n ) break;.
cce0: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
ccf0: 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75  Varint(&a[i], (u
cd00: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
cd10: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
cd20: 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
cd30: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74  if( iRowidOffset
cd40: 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  >=pIter->nRowidO
cd50: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
cd60: 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d  nt nNew = pIter-
cd70: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20  >nRowidOffset + 
cd80: 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e  8;.      int *aN
cd90: 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ew = (int*)sqlit
cda0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72  e3_realloc(pIter
cdb0: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20  ->aRowidOffset, 
cdc0: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29  nNew*sizeof(int)
cdd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
cde0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
cdf0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
ce00: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72  OMEM;.        br
ce10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ce20: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
ce30: 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20  Offset = aNew;. 
ce40: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77       pIter->nRow
ce50: 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b  idOffset = nNew;
ce60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65  .    }..    pIte
ce70: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
ce80: 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20  iRowidOffset++] 
ce90: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
cea0: 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  fset;.    pIter-
ceb0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
cec0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69  ;.  }.  pIter->i
ced0: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52  RowidOffset = iR
cee0: 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74  owidOffset;.  ft
cef0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
cf00: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  s(p, pIter);.}..
cf10: 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
cf20: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
cf30: 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 46  ReverseNewPage(F
cf40: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
cf50: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
cf60: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
cf70: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
cf80: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
cf90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
cfa0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
cfb0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
cfc0: 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52   );..  fts5DataR
cfd0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
cfe0: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
cff0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  Leaf = 0;.  whil
d000: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
d010: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c  _OK && pIter->iL
d020: 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
d030: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  TermLeafPgno ){.
d040: 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e      Fts5Data *pN
d050: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ew;.    pIter->i
d060: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  LeafPgno--;.    
d070: 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
d080: 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
d090: 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20  ENT_ROWID(.     
d0a0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67       pIter->pSeg
d0b0: 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d  ->iSegid, pIter-
d0c0: 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29  >iLeafPgno.    )
d0d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
d0e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 54 65 72  ){.      /* iTer
d0f0: 6d 4c 65 61 66 4f 66 66 73 65 74 20 6d 61 79 20  mLeafOffset may 
d100: 62 65 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65  be equal to szLe
d110: 61 66 20 69 66 20 74 68 65 20 74 65 72 6d 20 69  af if the term i
d120: 73 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20  s the last.     
d130: 20 2a 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68 65   ** thing on the
d140: 20 70 61 67 65 20 2d 20 69 2e 65 2e 20 74 68 65   page - i.e. the
d150: 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 73 20   first rowid is 
d160: 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  on the following
d170: 20 70 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20   page..      ** 
d180: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65 61  In this case lea
d190: 66 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  f pIter->pLeaf==
d1a0: 30 2c 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  0, this iterator
d1b0: 20 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20   is at EOF. */. 
d1c0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
d1d0: 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72  iLeafPgno==pIter
d1e0: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
d1f0: 0a 20 20 20 20 20 20 20 26 26 20 70 49 74 65 72  .       && pIter
d200: 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
d210: 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 0a  t<pNew->szLeaf .
d220: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
d230: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
d240: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 49  pNew;.        pI
d250: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d260: 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c   = pIter->iTermL
d270: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  eafOffset;.     
d280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d290: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  int iRowidOff;. 
d2a0: 20 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66         iRowidOff
d2b0: 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
d2c0: 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a  RowidOff(pNew);.
d2d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
d2e0: 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  idOff ){.       
d2f0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
d300: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
d310: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d320: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
d330: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d340: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
d350: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
d360: 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26         u8 *a = &
d370: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
d380: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d390: 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74  et];.        pIt
d3a0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d3b0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
d3c0: 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  (a, (u64*)&pIter
d3d0: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
d3e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d3f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
d400: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
d410: 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
d420: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
d430: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
d440: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
d450: 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Doclist = pIter-
d460: 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20  >pLeaf->nn+1;.  
d470: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
d480: 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
d490: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
d4a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
d4b0: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
d4c0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
d4d0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
d4e0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
d4f0: 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20 6d  ts to a delete m
d500: 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65 20  arker. A delete 
d510: 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e 74  marker is an ent
d520: 72 79 20 77 69 74 68 20 61 20 30 20 62 79 74 65  ry with a 0 byte
d530: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
d540: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
d550: 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
d560: 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78 20  Empty(Fts5Index 
d570: 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65  *p, Fts5IndexIte
d580: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
d590: 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
d5a0: 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49   &pIter->aSeg[pI
d5b0: 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
d5c0: 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e  First];.  return
d5d0: 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
d5e0: 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61  OK && pSeg->pLea
d5f0: 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d  f && pSeg->nPos=
d600: 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  =0);.}../*.** Ad
d610: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70  vance iterator p
d620: 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  Iter to the next
d630: 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49   entry. .**.** I
d640: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d650: 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
d660: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
d670: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
d680: 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e  ode. It .** is n
d690: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e  ot considered an
d6a0: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69 74   error if the it
d6b0: 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45  erator reaches E
d6c0: 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  OF. If an error 
d6d0: 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
d6e0: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
d6f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d700: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
d710: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
d720: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d730: 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Next(.  Fts5Inde
d740: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
d750: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
d760: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
d770: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
d780: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
d790: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
d7a0: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
d7b0: 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20  int *pbNewTerm  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20  /* OUT: Set for 
d7e0: 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20  new term */.){. 
d7f0: 20 61 73 73 65 72 74 28 20 70 62 4e 65 77 54 65   assert( pbNewTe
d800: 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54  rm==0 || *pbNewT
d810: 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  erm==0 );.  if( 
d820: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
d830: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65   ){.    if( pIte
d840: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
d850: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
d860: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d870: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
d880: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f==0 );.      if
d890: 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f  ( pIter->iRowidO
d8a0: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 20  ffset>0 ){.     
d8b0: 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72     u8 *a = pIter
d8c0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
d8d0: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
d8e0: 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
d8f0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d          int bDum
d900: 6d 79 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  my;.        i64 
d910: 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 20 20 20  iDelta;..       
d920: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
d930: 66 73 65 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  fset--;.        
d940: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d950: 65 74 20 3d 20 69 4f 66 66 20 3d 20 70 49 74 65  et = iOff = pIte
d960: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
d970: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
d980: 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 4f  set];.        iO
d990: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73  ff += fts5GetPos
d9a0: 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66  listSize(&a[iOff
d9b0: 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d  ], &nPos, &bDumm
d9c0: 79 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  y);.        iOff
d9d0: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20   += nPos;.      
d9e0: 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
d9f0: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
da00: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
da10: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
da20: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  -= iDelta;.     
da30: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
da40: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
da50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
da60: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
da70: 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
da80: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
da90: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
daa0: 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
dab0: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
dac0: 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  eaf;.      int i
dad0: 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  Off;.      int b
dae0: 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
daf0: 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
db00: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 61 72  ;..      /* Sear
db10: 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  ch for the end o
db20: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
db30: 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20 63  ist within the c
db40: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a  urrent page. */.
db50: 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c        u8 *a = pL
db60: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e  eaf->p;.      in
db70: 74 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  t n = pLeaf->szL
db80: 65 61 66 3b 0a 0a 20 20 20 20 20 20 41 53 53 45  eaf;..      ASSE
db90: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
dba0: 61 66 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  af);.      iOff 
dbb0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
dbc0: 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50  fset + pIter->nP
dbd0: 6f 73 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  os;..      if( i
dbe0: 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
dbf0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74   /* The next ent
dc00: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
dc10: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
dc20: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
dc30: 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69 45   iOff<=pIter->iE
dc40: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 3b 0a 20  ndofDoclist );. 
dc50: 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e         if( iOff>
dc60: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
dc70: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  clist ){.       
dc80: 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b     bNewTerm = 1;
dc90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
dca0: 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72  Off!=fts5LeafFir
dcb0: 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29  stTermOff(pLeaf)
dcc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
dcd0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
dce0: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
dcf0: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
dd00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
dd10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75  lse{.          u
dd20: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
dd30: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
dd40: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
dd50: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65  t(&a[iOff], &iDe
dd60: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
dd70: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
dd80: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20   iDelta;.       
dd90: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 44     assert_nc( iD
dda0: 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20 20 20  elta>0 );.      
ddb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74 65    }.        pIte
ddc0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
ddd0: 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 7d 65   iOff;..      }e
dde0: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
ddf0: 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Seg==0 ){.      
de00: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73    const u8 *pLis
de10: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  t = 0;.        c
de20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
de30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
de40: 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t nList = 0;.   
de50: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74       if( 0==(pIt
de60: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
de70: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
de80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
de90: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
dea0: 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29  anNext(p->pHash)
deb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
dec0: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
ded0: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
dee0: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
def0: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nList);.        
df00: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  }.        if( pL
df10: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
df20: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
df30: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
df40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
df50: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
df60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
df70: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
df80: 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70  Leaf->p = (u8*)p
df90: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  List;.          
dfa0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
dfb0: 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20   = nList;.      
dfc0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
dfd0: 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74  ->szLeaf = nList
dfe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
dff0: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
e000: 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20   = nList+1;.    
e010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
e020: 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
e030: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
e040: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65   (int)strlen(zTe
e050: 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rm),.           
e060: 20 20 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a     (u8*)zTerm);.
e070: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e080: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
e090: 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69  ts5GetVarint(pLi
e0a0: 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  st, (u64*)&pIter
e0b0: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
e0c0: 20 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65       if( pbNewTe
e0d0: 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20  rm ) *pbNewTerm 
e0e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
e0f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e100: 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20      iOff = 0;.  
e110: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e        /* Next en
e120: 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68  try is not on th
e130: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a  e current page *
e140: 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
e150: 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20   iOff==0 ){.    
e160: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
e170: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
e180: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  er);.          p
e190: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
e1a0: 65 61 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eaf;.          i
e1b0: 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72  f( pLeaf==0 ) br
e1c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 41  eak;.          A
e1d0: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
e1e0: 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
e1f0: 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74    if( (iOff = ft
e200: 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
e210: 4f 66 66 28 70 4c 65 61 66 29 29 20 26 26 20 69  Off(pLeaf)) && i
e220: 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  Off<pLeaf->szLea
e230: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
e240: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
e250: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
e260: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Leaf->p[iOff], (
e270: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
e280: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
e290: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e2a0: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20  fset = iOff;..  
e2b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
e2c0: 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73  eaf->nn>pLeaf->s
e2d0: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
e2e0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50         pIter->iP
e2f0: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
e300: 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65  >szLeaf + fts5Ge
e310: 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20  tVarint32(.     
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c               &pL
e330: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
e340: 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45  Leaf], pIter->iE
e350: 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20  ndofDoclist.    
e360: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
e370: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
e380: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e390: 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66    else if( pLeaf
e3a0: 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ->nn>pLeaf->szLe
e3b0: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
e3c0: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
e3d0: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
e3e0: 61 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69  af + fts5GetVari
e3f0: 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20  nt32(.          
e400: 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b        &pLeaf->p[
e410: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20  pLeaf->szLeaf], 
e420: 69 4f 66 66 0a 20 20 20 20 20 20 20 20 20 20 20  iOff.           
e430: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
e440: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e450: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
e460: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45         pIter->iE
e470: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 4f  ndofDoclist = iO
e480: 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ff;.            
e490: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
e4a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e4b0: 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c      if( iOff>=pL
e4c0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
e4d0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
e4e0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
e4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
e500: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  urn;.          }
e510: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e520: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   }..      /* Che
e530: 63 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ck if the iterat
e540: 6f 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46  or is now at EOF
e550: 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20  . If so, return 
e560: 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  early. */.      
e570: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
e580: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e590: 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20  bNewTerm ){.    
e5a0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
e5b0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e5c0: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b  GITER_ONETERM ){
e5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
e5e0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
e5f0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
e600: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
e610: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
e620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e630: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
e640: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
e650: 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ter, nKeep);.   
e660: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
e670: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
e680: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
e690: 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72      if( pbNewTer
e6a0: 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d  m ) *pbNewTerm =
e6b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
e6c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e6d0: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
e6e0: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
e6f0: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
e700: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
e710: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53    }.}..#define S
e720: 57 41 50 56 41 4c 28 54 2c 20 61 2c 20 62 29 20  WAPVAL(T, a, b) 
e730: 7b 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20  { T tmp; tmp=a; 
e740: 61 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 2f  a=b; b=tmp; }../
e750: 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49  *.** Iterator pI
e760: 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
e770: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
e780: 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63  t rowid in a doc
e790: 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  list. This.** fu
e7a0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
e7b0: 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74  iterator up so t
e7c0: 68 61 74 20 69 74 65 72 61 74 65 73 20 69 6e 20  hat iterates in 
e7d0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68  reverse order th
e7e0: 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63  rough.** the doc
e7f0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
e800: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
e810: 52 65 76 65 72 73 65 28 46 74 73 35 49 6e 64 65  Reverse(Fts5Inde
e820: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
e830: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
e840: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
e850: 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69  dx = pIter->pDli
e860: 64 78 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  dx;.  Fts5Data *
e870: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pLast = 0;.  int
e880: 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a   pgnoLast = 0;..
e890: 20 20 69 66 28 20 70 44 6c 69 64 78 20 29 7b 0a    if( pDlidx ){.
e8a0: 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
e8b0: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
e8c0: 65 67 69 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61  egid;.    pgnoLa
e8d0: 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  st = fts5DlidxIt
e8e0: 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
e8f0: 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74 73 35      pLast = fts5
e900: 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
e910: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
e920: 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61 73 74 29  Segid, pgnoLast)
e930: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e940: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
e950: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20  = pIter->pLeaf; 
e960: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
e970: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
e980: 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  .    /* Currentl
e990: 79 2c 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  y, Fts5SegIter.i
e9a0: 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74  LeafOffset point
e9b0: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
e9c0: 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 6f  yte of.    ** po
e9d0: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74  sition-list cont
e9e0: 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  ent for the curr
e9f0: 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20  ent rowid. Back 
ea00: 69 74 20 75 70 20 73 6f 20 74 68 61 74 20 69 74  it up so that it
ea10: 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74  .    ** points t
ea20: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
ea30: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
ea40: 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a   size field. */.
ea50: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ea60: 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69 74 65  Offset -= sqlite
ea70: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65  3Fts5GetVarintLe
ea80: 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b  n(pIter->nPos*2+
ea90: 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 0a 20  pIter->bDel);.. 
eaa0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f     /* If this co
eab0: 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
eac0: 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74  then the largest
ead0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
eae0: 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65  urrent.    ** te
eaf0: 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74  rm may not be st
eb00: 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
eb10: 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61  ent page. So sea
eb20: 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20  rch forward to. 
eb30: 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20     ** see where 
eb40: 73 61 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c  said rowid reall
eb50: 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66  y is.  */.    if
eb60: 28 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  ( pIter->iEndofD
eb70: 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73  oclist>=pLeaf->s
eb80: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  zLeaf ){.      i
eb90: 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46  nt pgno;.      F
eba0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
ebb0: 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
ebc0: 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20  r->pSeg;..      
ebd0: 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69  /* The last rowi
ebe0: 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
ebf0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74   may not be on t
ec00: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
ec10: 20 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a   Search.      **
ec20: 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64   forward to find
ec30: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
ec40: 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f  ning the last ro
ec50: 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  wid.  */.      f
ec60: 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69  or(pgno=pIter->i
ec70: 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e  LeafPgno+1; !p->
ec80: 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67  rc && pgno<=pSeg
ec90: 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f  ->pgnoLast; pgno
eca0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ++){.        i64
ecb0: 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47   iAbs = FTS5_SEG
ecc0: 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
ecd0: 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a  >iSegid, pgno);.
ece0: 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61          Fts5Data
ecf0: 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74   *pNew = fts5Dat
ed00: 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a  aRead(p, iAbs);.
ed10: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
ed20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
ed30: 74 20 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c  t iRowid, bTerml
ed40: 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ess;.          i
ed50: 52 6f 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66  Rowid = fts5Leaf
ed60: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e  FirstRowidOff(pN
ed70: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ew);.          b
ed80: 54 65 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c  Termless = fts5L
ed90: 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e  eafIsTermless(pN
eda0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ew);.          i
edb0: 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  f( iRowid ){.   
edc0: 20 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c           SWAPVAL
edd0: 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77  (Fts5Data*, pNew
ede0: 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  , pLast);.      
edf0: 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d        pgnoLast =
ee00: 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20   pgno;.         
ee10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
ee20: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
ee30: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
ee40: 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29  ( bTermless==0 )
ee50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ee60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
ee70: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61    }..  /* If pLa
ee80: 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68  st is NULL at th
ee90: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
eea0: 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f  he last rowid fo
eeb0: 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20  r this doclist. 
eec0: 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20   ** lies on the 
eed0: 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69  page currently i
eee0: 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
eef0: 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69  iterator. In thi
ef00: 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74  s case .  ** pIt
ef10: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
ef20: 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
ef30: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
ef40: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
ef50: 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73  e.  ** field ass
ef60: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
ef70: 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20   first relevant 
ef80: 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
ef90: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c  e..  **.  ** Or,
efa0: 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e   if pLast is non
efb0: 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69  -NULL, then it i
efc0: 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
efd0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73  contains the las
efe0: 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e  t.  ** rowid. In
eff0: 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69   this case confi
f000: 67 75 72 65 20 74 68 65 20 69 74 65 72 61 74 6f  gure the iterato
f010: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
f020: 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  nts to the.  ** 
f030: 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74  first rowid on t
f040: 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  his page..  */. 
f050: 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20   if( pLast ){.  
f060: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
f070: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
f080: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
f090: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
f0a0: 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74  = pLast;.    pIt
f0b0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
f0c0: 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f  pgnoLast;.    iO
f0d0: 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
f0e0: 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74  stRowidOff(pLast
f0f0: 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
f100: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
f110: 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ast->p[iOff], (u
f120: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
f130: 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  id);.    pIter->
f140: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
f150: 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73  ff;..    if( fts
f160: 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
f170: 70 4c 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pLast) ){.      
f180: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
f190: 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e  list = pLast->nn
f1a0: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
f1b0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
f1c0: 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35  ofDoclist = fts5
f1d0: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
f1e0: 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a  (pLast);.    }..
f1f0: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
f200: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
f210: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  e(p, pIter);.}..
f220: 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
f230: 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
f240: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
f250: 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f  st rowid of a do
f260: 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20  clist..** There 
f270: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
f280: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
f290: 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72  th the final ter
f2a0: 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  m on the current
f2b0: 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68   .** page. If th
f2c0: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
f2d0: 73 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  s the last term 
f2e0: 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61  on the page, loa
f2f0: 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  d the .** doclis
f300: 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73  t-index from dis
f310: 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  k and initialize
f320: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20   an iterator at 
f330: 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e  (pIter->pDlidx).
f340: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f350: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
f360: 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  lidx(Fts5Index *
f370: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
f380: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53  pIter){.  int iS
f390: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
f3a0: 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20  ->iSegid;.  int 
f3b0: 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66  bRev = (pIter->f
f3c0: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
f3d0: 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20  TER_REVERSE);.  
f3e0: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
f3f0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20  = pIter->pLeaf; 
f400: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
f410: 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  data */..  asser
f420: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
f430: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
f440: 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
f450: 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
f460: 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  x==0 );..  /* Ch
f470: 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65  eck if the curre
f480: 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20  nt doclist ends 
f490: 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49 66  on this page. If
f4a0: 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e   it does, return
f4b0: 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68  .  ** early with
f4c0: 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  out loading the 
f4d0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61  doclist-index (a
f4e0: 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20  s it belongs to 
f4f0: 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a  a different.  **
f500: 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20   term. */.  if( 
f510: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
f520: 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno==pIter->iLe
f530: 61 66 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49  afPgno .   && pI
f540: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
f550: 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  st<pLeaf->szLeaf
f560: 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
f570: 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  n;.  }..  pIter-
f580: 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c  >pDlidx = fts5Dl
f590: 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62  idxIterInit(p, b
f5a0: 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72  Rev, iSeg, pIter
f5b0: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
f5c0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  ;.}..#define fts
f5d0: 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74  5IndexSkipVarint
f5e0: 28 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20 20  (a, iOff) {     
f5f0: 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 69         \.  int i
f600: 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20  End = iOff+9;   
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 77             \.  w
f630: 68 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d  hile( (a[iOff++]
f640: 20 26 20 30 78 38 30 29 20 26 26 20 69 4f 66 66   & 0x80) && iOff
f650: 3c 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20 5c  <iEnd );       \
f660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
f670: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
f680: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
f690: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
f6a0: 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  ently contains.*
f6b0: 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65  * no valid value
f6c0: 73 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  s except for the
f6d0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65   Fts5SegIter.pLe
f6e0: 61 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  af member variab
f6f0: 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  le. This.** func
f700: 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68  tion searches th
f710: 65 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20  e leaf page for 
f720: 61 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20  a term matching 
f730: 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a  (pTerm/nTerm)..*
f740: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63  *.** If the spec
f750: 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f  ified term is fo
f760: 75 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  und on the page,
f770: 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
f780: 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f  or is left.** po
f790: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66  inting to it. If
f7a0: 20 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73   argument bGe is
f7b0: 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65   zero and the te
f7c0: 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  rm is not found,
f7d0: 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72  .** the iterator
f7e0: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
f7f0: 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  g at EOF..**.** 
f800: 49 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65  If bGe is non-ze
f810: 72 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ro and the speci
f820: 66 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74  fied term is not
f830: 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
f840: 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20  .** iterator is 
f850: 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
f860: 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65   the smallest te
f870: 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
f880: 74 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  t that.** is lar
f890: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65  ger than the spe
f8a0: 63 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65  cified term, eve
f8b0: 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 69  n if this term i
f8c0: 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20  s not on the.** 
f8d0: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f  current page..*/
f8e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
f8f0: 35 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73  5LeafSeek(.  Fts
f900: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f920: 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
f930: 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  code here */.  i
f940: 6e 74 20 62 47 65 2c 20 20 20 20 20 20 20 20 20  nt bGe,         
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f960: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20  * True for a >= 
f970: 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35  search */.  Fts5
f980: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
f990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f9a0: 74 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20  terator to seek 
f9b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
f9c0: 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20  Term, int nTerm 
f9d0: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
f9e0: 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b  search for */.){
f9f0: 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63  .  int iOff;.  c
fa00: 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74  onst u8 *a = pIt
fa10: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
fa20: 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74  int szLeaf = pIt
fa30: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
fa40: 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74  f;.  int n = pIt
fa50: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a  er->pLeaf->nn;..
fa60: 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30    int nMatch = 0
fa70: 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20  ;.  int nKeep = 
fa80: 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  0;.  int nNew = 
fa90: 30 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66  0;.  int iTermOf
faa0: 66 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b  f;.  int iPgidx;
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
fad0: 6f 66 66 73 65 74 20 69 6e 20 70 67 69 64 78 20  offset in pgidx 
fae0: 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50  */.  int bEndOfP
faf0: 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
fb00: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
fb10: 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64  E_OK );..  iPgid
fb20: 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50  x = szLeaf;.  iP
fb30: 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
fb40: 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
fb50: 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20  x], iTermOff);. 
fb60: 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
fb70: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
fb80: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
fb90: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6e 65 77  out how many new
fba0: 20 62 79 74 65 73 20 61 72 65 20 69 6e 20 74 68   bytes are in th
fbb0: 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 66  is term */.    f
fbc0: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
fbd0: 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4e 65 77  32(a, iOff, nNew
fbe0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70  );.    if( nKeep
fbf0: 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  <nMatch ){.     
fc00: 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
fc10: 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
fc20: 61 73 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d 6e  assert( nKeep>=n
fc30: 4d 61 74 63 68 20 29 3b 0a 20 20 20 20 69 66 28  Match );.    if(
fc40: 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29   nKeep==nMatch )
fc50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70  {.      int nCmp
fc60: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
fc70: 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28       nCmp = MIN(
fc80: 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74  nNew, nTerm-nMat
fc90: 63 68 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ch);.      for(i
fca0: 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29  =0; i<nCmp; i++)
fcb0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 5b  {.        if( a[
fcc0: 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e  iOff+i]!=pTerm[n
fcd0: 4d 61 74 63 68 2b 69 5d 20 29 20 62 72 65 61 6b  Match+i] ) break
fce0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fcf0: 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20  nMatch += i;..  
fd00: 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 6e      if( nTerm==n
fd10: 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
fd20: 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a   if( i==nNew ){.
fd30: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
fd40: 65 61 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20  earch_success;. 
fd50: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
fd60: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61          goto sea
fd70: 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  rch_failed;.    
fd80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
fd90: 65 20 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20  e if( i<nNew && 
fda0: 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b  a[iOff+i]>pTerm[
fdb0: 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20  nMatch] ){.     
fdc0: 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66     goto search_f
fdd0: 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
fde0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50     }..    if( iP
fdf0: 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  gidx>=n ){.     
fe00: 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b   bEndOfPage = 1;
fe10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fe20: 20 20 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20    }..    iPgidx 
fe30: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
fe40: 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e  32(&a[iPgidx], n
fe50: 4b 65 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d  Keep);.    iTerm
fe60: 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20  Off += nKeep;.  
fe70: 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
fe80: 66 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  f;..    /* Read 
fe90: 74 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20  the nKeep field 
fea0: 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  of the next term
feb0: 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73  . */.    fts5Fas
fec0: 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20  tGetVarint32(a, 
fed0: 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  iOff, nKeep);.  
fee0: 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65  }.. search_faile
fef0: 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20  d:.  if( bGe==0 
ff00: 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  ){.    fts5DataR
ff10: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
ff20: 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
ff30: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
ff40: 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
ff50: 69 66 28 20 62 45 6e 64 4f 66 50 61 67 65 20 29  if( bEndOfPage )
ff60: 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
ff70: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
ff80: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
ff90: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
ffa0: 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75  >pLeaf==0 ) retu
ffb0: 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20 70 49  rn;.      a = pI
ffc0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
ffd0: 20 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61       if( fts5Lea
ffe0: 66 49 73 54 65 72 6d 6c 65 73 73 28 70 49 74 65  fIsTermless(pIte
fff0: 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a  r->pLeaf)==0 ){.
10000 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
10010 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e  arint32(&pIter->
10020 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e  pLeaf->p[pIter->
10030 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20  pLeaf->szLeaf], 
10040 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69  iOff);.        i
10050 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66  f( iOff<4 || iOf
10060 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
10070 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
10080 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
10090 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
100a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
100b0 20 20 20 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20      nKeep = 0;. 
100c0 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
100d0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
100e0 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29  (&a[iOff], nNew)
100f0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
10100 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10110 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
10120 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72   1 );.  }.. sear
10130 63 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20 70  ch_success:..  p
10140 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10150 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b  t = iOff + nNew;
10160 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
10170 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65  eafOffset = pIte
10180 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
10190 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
101a0 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e  afPgno = pIter->
101b0 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74  iLeafPgno;..  ft
101c0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
101d0 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
101e0 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b  , nKeep, pTerm);
101f0 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
10200 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
10210 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e  &pIter->term, nN
10220 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a  ew, &a[iOff]);..
10230 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20    if( iPgidx>=n 
10240 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45  ){.    pIter->iE
10250 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49  ndofDoclist = pI
10260 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31  ter->pLeaf->nn+1
10270 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10280 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 69  nt nExtra;.    i
10290 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74  Pgidx += fts5Get
102a0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
102b0 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20  dx], nExtra);.  
102c0 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
102d0 6f 63 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f 66  oclist = iTermOf
102e0 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a  f + nExtra;.  }.
102f0 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
10300 66 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20 20  ff = iPgidx;..  
10310 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52  fts5SegIterLoadR
10320 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a  owid(p, pIter);.
10330 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
10340 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
10350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
10360 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20  lize the object 
10370 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74  pIter to point t
10380 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65  o term pTerm/nTe
10390 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e  rm within segmen
103a0 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74 68  t.** pSeg. If th
103b0 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74  ere is no such t
103c0 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78  erm in the index
103d0 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  , the iterator i
103e0 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a  s set to EOF..**
103f0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
10400 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
10410 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
10420 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
10430 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
10440 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
10450 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
10460 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
10470 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
10480 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10490 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
104a0 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 0a  egIterSeekInit(.
104b0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104d0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
104e0 64 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  d */.  Fts5Buffe
104f0 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
10500 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
10510 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 61 64   to use for load
10520 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 63  ing pages */.  c
10530 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
10540 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
10550 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
10560 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  o */.  int flags
10570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10580 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
10590 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20  f FTS5INDEX_XXX 
105a0 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53  flags */.  Fts5S
105b0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
105c0 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65  *pSeg,     /* De
105d0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67  scription of seg
105e0 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ment */.  Fts5Se
105f0 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
10600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
10610 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
10620 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20  */.){.  int iPg 
10630 3d 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d  = 1;.  int bGe =
10640 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
10650 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b  DEX_QUERY_SCAN);
10660 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20  .  int bDlidx = 
10670 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10680 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
10690 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
106a0 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 73 74 61  -index */..  sta
106b0 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20  tic int nCall = 
106c0 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a 20  0;.  nCall++;.. 
106d0 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20   assert( bGe==0 
106e0 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
106f0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
10700 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
10710 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d  ( pTerm && nTerm
10720 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74   );.  memset(pIt
10730 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
10740 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
10750 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20  >pSeg = pSeg;.. 
10760 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
10770 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ets stack variab
10780 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65  le iPg to the le
10790 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  af page number t
107a0 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e  hat may.  ** con
107b0 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d  tain term (pTerm
107c0 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69  /nTerm), if it i
107d0 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
107e0 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69   segment. */.  i
107f0 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  f( p->pIdxSelect
10800 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
10810 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
10820 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
10830 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
10840 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
10850 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33  xSelect, sqlite3
10860 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
10870 20 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f      "SELECT pgno
10880 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69   FROM '%q'.'%q_i
10890 64 78 27 20 57 48 45 52 45 20 22 0a 20 20 20 20  dx' WHERE ".    
108a0 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41        "segid=? A
108b0 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52  ND term<=? ORDER
108c0 20 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49   BY term DESC LI
108d0 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20  MIT 1",.        
108e0 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
108f0 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
10900 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
10910 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
10920 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
10930 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  int(p->pIdxSelec
10940 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65 67  t, 1, pSeg->iSeg
10950 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  id);.  sqlite3_b
10960 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78  ind_blob(p->pIdx
10970 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65 72 6d  Select, 2, pTerm
10980 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f  , nTerm, SQLITE_
10990 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 53  STATIC);.  if( S
109a0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
109b0 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 53  e3_step(p->pIdxS
109c0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36  elect) ){.    i6
109d0 34 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  4 val = sqlite3_
109e0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 70 49  column_int(p->pI
109f0 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  dxSelect, 0);.  
10a00 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76 61    iPg = (int)(va
10a10 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69 64  l>>1);.    bDlid
10a20 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30 30  x = (val & 0x000
10a30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20  1);.  }.  p->rc 
10a40 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
10a50 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a  p->pIdxSelect);.
10a60 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d  .  if( iPg<pSeg-
10a70 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20  >pgnoFirst ){.  
10a80 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67    iPg = pSeg->pg
10a90 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c  noFirst;.    bDl
10aa0 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  idx = 0;.  }..  
10ab0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
10ac0 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74   = iPg - 1;.  ft
10ad0 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
10ae0 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  e(p, pIter);..  
10af0 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
10b00 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65 61 66   ){.    fts5Leaf
10b10 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70 49 74  Seek(p, bGe, pIt
10b20 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  er, pTerm, nTerm
10b30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
10b40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
10b50 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20  & bGe==0 ){.    
10b60 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
10b70 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
10b80 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49  TERM;.    if( pI
10b90 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
10ba0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
10bb0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
10bc0 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  DESC ){.        
10bd0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
10be0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
10bf0 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERSE;.      }.  
10c00 20 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29      if( bDlidx )
10c10 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
10c20 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70  gIterLoadDlidx(p
10c30 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
10c40 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  }.      if( flag
10c50 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
10c60 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  ERY_DESC ){.    
10c70 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
10c80 65 76 65 72 73 65 28 70 2c 20 70 49 74 65 72 29  everse(p, pIter)
10c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10ca0 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
10cb0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29  :.  **.  **   1)
10cc0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
10cd0 63 75 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a 20  curred, or.  ** 
10ce0 20 20 32 29 20 74 68 65 20 69 74 65 72 61 74 6f    2) the iterato
10cf0 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 2c  r points to EOF,
10d00 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29 20 74 68   or.  **   3) th
10d10 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
10d20 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69  s to an entry wi
10d30 74 68 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e  th term (pTerm/n
10d40 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20 20  Term), or.  **  
10d50 20 34 29 20 74 68 65 20 46 54 53 35 49 4e 44 45   4) the FTS5INDE
10d60 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61  X_QUERY_SCAN fla
10d70 67 20 77 61 73 20 73 65 74 20 61 6e 64 20 74 68  g was set and th
10d80 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
10d90 73 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 61  s.  **      to a
10da0 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20 74  n entry with a t
10db0 65 72 6d 20 67 72 65 61 74 65 72 20 74 68 61 6e  erm greater than
10dc0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 28 70 54   or equal to (pT
10dd0 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f  erm/nTerm)..  */
10de0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
10df0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  !=SQLITE_OK     
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20       /* 1 */.   
10e30 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  || pIter->pLeaf=
10e40 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e70 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20 66   /* 2 */.   || f
10e80 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
10e90 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72  Blob(&pIter->ter
10ea0 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, pTerm, nTerm)
10eb0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ==0          /* 
10ec0 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65 20  3 */.   || (bGe 
10ed0 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  && fts5BufferCom
10ee0 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d  pareBlob(&pIter-
10ef0 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54  >term, pTerm, nT
10f00 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a 2f  erm)>0)  /* 4 */
10f10 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  .  );.}../*.** I
10f20 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62  nitialize the ob
10f30 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f  ject pIter to po
10f40 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72  int to term pTer
10f50 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 74  m/nTerm within t
10f60 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
10f70 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74  hash table. If t
10f80 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
10f90 74 65 72 6d 20 69 6e 20 74 68 65 20 68 61 73 68  term in the hash
10fa0 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20  -table, the .** 
10fb0 69 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20  iterator is set 
10fc0 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66  to EOF..**.** If
10fd0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10fe0 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69  , Fts5Index.rc i
10ff0 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72  s set to an appr
11000 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
11010 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  de. If .** an er
11020 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
11030 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
11040 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11050 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
11060 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
11070 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
11080 48 61 73 68 49 6e 69 74 28 0a 20 20 46 74 73 35  HashInit(.  Fts5
11090 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
110a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
110b0 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20  TS5 backend */. 
110c0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
110d0 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20  , int nTerm,    
110e0 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b   /* Term to seek
110f0 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   to */.  int fla
11100 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
11110 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
11120 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58   of FTS5INDEX_XX
11130 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
11140 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11160 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
11170 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  te */.){.  const
11180 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a   u8 *pList = 0;.
11190 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b    int nList = 0;
111a0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d  .  const u8 *z =
111b0 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b   0;.  int n = 0;
111c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
111d0 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65 72 74  Hash );.  assert
111e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
111f0 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 65  OK );..  if( pTe
11200 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  rm==0 || (flags 
11210 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
11220 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20 20 20 70  Y_SCAN) ){.    p
11230 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
11240 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70  s5HashScanInit(p
11250 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20  ->pHash, (const 
11260 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65  char*)pTerm, nTe
11270 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rm);.    sqlite3
11280 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72  Fts5HashScanEntr
11290 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  y(p->pHash, (con
112a0 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70  st char**)&z, &p
112b0 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
112c0 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e 74     n = (z ? (int
112d0 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63  )strlen((const c
112e0 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20  har*)z) : 0);.  
112f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
11300 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
11310 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b  SEGITER_ONETERM;
11320 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
11330 48 61 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61  HashQuery(p->pHa
11340 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  sh, (const char*
11350 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26  )pTerm, nTerm, &
11360 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
11370 20 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20      z = pTerm;. 
11380 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20     n = nTerm;.  
11390 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  }..  if( pList )
113a0 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
113b0 70 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c 69 74  pLeaf;.    sqlit
113c0 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
113d0 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
113e0 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20  term, n, z);.   
113f0 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49 64 78   pLeaf = fts5Idx
11400 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
11410 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20  (Fts5Data));.   
11420 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
11430 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61  return;.    pLea
11440 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73  f->p = (u8*)pLis
11450 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e  t;.    pLeaf->nn
11460 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
11470 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49   = nList;.    pI
11480 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65  ter->pLeaf = pLe
11490 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  af;.    pIter->i
114a0 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
114b0 35 47 65 74 56 61 72 69 6e 74 28 70 4c 65 61 66  5GetVarint(pLeaf
114c0 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ->p, (u64*)&pIte
114d0 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
114e0 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
114f0 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e  list = pLeaf->nn
11500 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61  +1;..    if( fla
11510 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
11520 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
11530 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
11540 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
11550 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66  REVERSE;.      f
11560 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
11570 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
11580 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
11590 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
115a0 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
115b0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  er);.    }.  }.}
115c0 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65  ../*.** Zero the
115d0 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
115e0 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
115f0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
11600 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
11610 72 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74  rClear(Fts5SegIt
11620 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74  er *pIter){.  ft
11630 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
11640 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  ter->term);.  ft
11650 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
11660 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66  ter->pLeaf);.  f
11670 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
11680 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29  Iter->pNextLeaf)
11690 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  ;.  fts5DlidxIte
116a0 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6c  rFree(pIter->pDl
116b0 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  idx);.  sqlite3_
116c0 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f 77  free(pIter->aRow
116d0 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d  idOffset);.  mem
116e0 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
116f0 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72  zeof(Fts5SegIter
11700 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ));.}..#ifdef SQ
11710 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a  LITE_DEBUG../*.*
11720 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11730 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
11740 6f 66 20 74 68 65 20 62 69 67 20 61 73 73 65 72  of the big asser
11750 74 28 29 20 70 72 6f 63 65 64 75 72 65 20 69 6d  t() procedure im
11760 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20  plemented by.** 
11770 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
11780 74 65 72 53 65 74 75 70 28 29 2e 20 49 74 20 65  terSetup(). It e
11790 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
117a0 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74 6c 79  result currently
117b0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70   stored.** in *p
117c0 52 65 73 20 69 73 20 74 68 65 20 63 6f 72 72 65  Res is the corre
117d0 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  ct result of com
117e0 70 61 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  paring the curre
117f0 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  nt positions of 
11800 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61  the.** two itera
11810 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tors..*/.static 
11820 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 43  void fts5AssertC
11830 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
11840 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
11850 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35   *pIter, .  Fts5
11860 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46  SegIter *p1,.  F
11870 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a  ts5SegIter *p2,.
11880 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
11890 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20  Res.){.  int i1 
118a0 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53  = p1 - pIter->aS
118b0 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70  eg;.  int i2 = p
118c0 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  2 - pIter->aSeg;
118d0 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61  ..  if( p1->pLea
118e0 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29  f || p2->pLeaf )
118f0 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c  {.    if( p1->pL
11900 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
11910 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
11920 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20  irst==i2 );.    
11930 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
11940 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
11950 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
11960 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20  irst==i1 );.    
11970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
11980 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e   nMin = MIN(p1->
11990 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d  term.n, p2->term
119a0 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  .n);.      int r
119b0 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e  es = memcmp(p1->
119c0 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d  term.p, p2->term
119d0 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20  .p, nMin);.     
119e0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
119f0 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d  s = p1->term.n -
11a00 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20   p2->term.n;..  
11a10 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
11a20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11a30 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
11a40 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
11a50 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64  sert( p1->iRowid
11a60 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a  !=p2->iRowid );.
11a70 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 28          res = ((
11a80 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d  p1->iRowid > p2-
11a90 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
11aa0 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b  >bRev) ? -1 : 1;
11ab0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
11ad0 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29  es->bTermEq==0 )
11ae0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
11af0 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
11b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
11b10 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29  es->iFirst==i1 )
11b20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11b30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11b40 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20  Res->iFirst==i2 
11b50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11b60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
11b70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11b80 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51   no-op unless SQ
11b90 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
11ba0 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20  fined when this 
11bb0 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d  module.** is com
11bc0 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63  piled. In that c
11bd0 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ase, this functi
11be0 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c  on is essentiall
11bf0 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a  y an assert() .*
11c00 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  * statement used
11c10 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
11c20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
11c30 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73  the pIter->aFirs
11c40 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  t[] array.** are
11c50 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61   correct..*/.sta
11c60 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73  tic void fts5Ass
11c70 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
11c80 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  p(Fts5Index *p, 
11c90 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
11ca0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Iter){.  if( p->
11cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11cc0 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
11cd0 20 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74 65   *pFirst = &pIte
11ce0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
11cf0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
11d00 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a   ];.    int i;..
11d10 20 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69      assert( (pFi
11d20 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d  rst->pLeaf==0)==
11d30 70 49 74 65 72 2d 3e 62 45 6f 66 20 29 3b 0a 0a  pIter->bEof );..
11d40 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
11d50 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  t pIter->iSwitch
11d60 52 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f 72  Rowid is set cor
11d70 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66  rectly. */.    f
11d80 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
11d90 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
11da0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
11db0 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
11dc0 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  g[i];.      asse
11dd0 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20 0a  rt( p1==pFirst .
11de0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31             || p1
11df0 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20  ->pLeaf==0 .    
11e00 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42 75         || fts5Bu
11e10 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46 69  fferCompare(&pFi
11e20 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e  rst->term, &p1->
11e30 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20 20  term) .         
11e40 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d    || p1->iRowid=
11e50 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  =pIter->iSwitchR
11e60 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20 20  owid.           
11e70 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70  || (p1->iRowid<p
11e80 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
11e90 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
11ea0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
11eb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11ec0 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d  pIter->nSeg; i+=
11ed0 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
11ee0 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
11ef0 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
11f00 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
11f10 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p2 = &pIter->aSe
11f20 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74  g[i+1];.      Ft
11f30 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
11f40 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
11f50 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20  [(pIter->nSeg + 
11f60 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66  i) / 2];.      f
11f70 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
11f80 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
11f90 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
11fa0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
11fb0 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53  =1; i<(pIter->nS
11fc0 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a  eg / 2); i+=2){.
11fd0 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
11fe0 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  r *p1 = &pIter->
11ff0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
12000 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20  rst[i*2].iFirst 
12010 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
12020 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
12030 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
12040 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46  aFirst[i*2+1].iF
12050 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74  irst ];.      Ft
12060 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
12070 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
12080 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41  [i];.      fts5A
12090 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
120a0 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c  esult(pIter, p1,
120b0 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20   p2, pRes);.    
120c0 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
120d0 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65 72  define fts5Asser
120e0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
120f0 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x,y).#endif../*.
12100 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  ** Do the compar
12110 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74  ison necessary t
12120 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72  o populate pIter
12130 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a  ->aFirst[iOut]..
12140 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74  **.** If the ret
12150 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e  urned value is n
12160 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
12170 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
12180 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20   an entry.** in 
12190 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  the pIter->aSeg[
121a0 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20  ] array that is 
121b0 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20  (a) not at EOF, 
121c0 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67  and (b) pointing
121d0 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61  .** to a key tha
121e0 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  t is a duplicate
121f0 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67   of another, hig
12200 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a  her priority, .*
12210 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74  * segment-iterat
12220 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e  or in the pSeg->
12230 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aSeg[] array..*/
12240 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
12250 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
12260 72 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  re(Fts5IndexIter
12270 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75   *pIter, int iOu
12280 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20  t){.  int i1;   
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
122b0 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35  f left-hand Fts5
122c0 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74  SegIter */.  int
122d0 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   i2;            
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122f0 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68  Index of right-h
12300 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
12310 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20  */.  int iRes;. 
12320 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
12330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12340 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74   /* Left-hand Ft
12350 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46  s5SegIter */.  F
12360 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20  ts5SegIter *p2; 
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12380 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73  * Right-hand Fts
12390 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
123a0 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
123b0 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
123c0 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72  [iOut];..  asser
123d0 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e  t( iOut<pIter->n
123e0 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b  Seg && iOut>0 );
123f0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
12400 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74  ->bRev==0 || pIt
12410 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a  er->bRev==1 );..
12420 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74    if( iOut>=(pIt
12430 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20  er->nSeg/2) ){. 
12440 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20     i1 = (iOut - 
12450 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a  pIter->nSeg/2) *
12460 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20   2;.    i2 = i1 
12470 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  + 1;.  }else{.  
12480 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46    i1 = pIter->aF
12490 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69  irst[iOut*2].iFi
124a0 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49  rst;.    i2 = pI
124b0 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
124c0 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  *2+1].iFirst;.  
124d0 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d  }.  p1 = &pIter-
124e0 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20  >aSeg[i1];.  p2 
124f0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
12500 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65  2];..  pRes->bTe
12510 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20  rmEq = 0;.  if( 
12520 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20  p1->pLeaf==0 ){ 
12530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
12540 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  p1 is at EOF */.
12550 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
12560 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70   }else if( p2->p
12570 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f  Leaf==0 ){     /
12580 2a 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f  * If p2 is at EO
12590 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20  F */.    iRes = 
125a0 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  i1;.  }else{.   
125b0 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42   int res = fts5B
125c0 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31  ufferCompare(&p1
125d0 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72  ->term, &p2->ter
125e0 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d  m);.    if( res=
125f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
12600 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20  rt( i2>i1 );.   
12610 20 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30     assert( i2!=0
12620 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e   );.      pRes->
12630 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20  bTermEq = 1;.   
12640 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69     if( p1->iRowi
12650 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b  d==p2->iRowid ){
12660 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65  .        p1->bDe
12670 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20  l = p2->bDel;.  
12680 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b        return i2;
12690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
126a0 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69  es = ((p1->iRowi
126b0 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d  d > p2->iRowid)=
126c0 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20  =pIter->bRev) ? 
126d0 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  -1 : +1;.    }. 
126e0 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d     assert( res!=
126f0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  0 );.    if( res
12700 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73  <0 ){.      iRes
12710 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = i1;.    }else
12720 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
12730 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
12740 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 69  pRes->iFirst = i
12750 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  Res;.  return 0;
12760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
12770 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74  he seg-iter so t
12780 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
12790 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
127a0 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67   on page iLeafPg
127b0 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  no..** It is an 
127c0 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c  error if leaf iL
127d0 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74  eafPgno does not
127e0 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
127f0 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f  ns no rowids..*/
12800 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
12810 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65  5SegIterGotoPage
12820 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
12830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12840 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
12850 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
12860 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
12870 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
12880 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
12890 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
128a0 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61  iLeafPgno.){.  a
128b0 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f  ssert( iLeafPgno
128c0 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
128d0 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61  o );..  if( iLea
128e0 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65  fPgno>pIter->pSe
128f0 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
12900 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
12910 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65  CORRUPT;.  }else
12920 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  {.    fts5DataRe
12930 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65  lease(pIter->pNe
12940 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  xtLeaf);.    pIt
12950 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20  er->pNextLeaf = 
12960 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  0;.    pIter->iL
12970 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
12980 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53  gno-1;.    fts5S
12990 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
129a0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73  , pIter);.    as
129b0 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
129c0 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d  ITE_OK || pIter-
129d0 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61  >iLeafPgno==iLea
129e0 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66  fPgno );..    if
129f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
12a00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
12a10 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38 20 2a  iOff;.      u8 *
12a20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
12a30 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ->p;.      int n
12a40 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
12a50 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20  >szLeaf;..      
12a60 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
12a70 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 49 74  irstRowidOff(pIt
12a80 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
12a90 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
12aa0 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  iOff>=n ){.     
12ab0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
12ac0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
12ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
12ae0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
12af0 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
12b00 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
12b10 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  id);.        pIt
12b20 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
12b30 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
12b40 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
12b50 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
12b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
12b80 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
12b90 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
12ba0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74  ond argument unt
12bb0 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a  il it is at or .
12bc0 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46  ** past rowid iF
12bd0 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20  rom. Regardless 
12be0 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
12bf0 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61  iFrom, the itera
12c00 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73  tor is.** always
12c10 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61   advanced at lea
12c20 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  st once..*/.stat
12c30 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
12c40 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
12c50 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12c70 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
12c80 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
12c90 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
12ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
12cb0 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
12cc0 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63  e */.  i64 iMatc
12cd0 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
12ce0 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
12cf0 65 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65  e iterator at le
12d00 61 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a  ast this far */.
12d10 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20  ){.  int bRev = 
12d20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
12d30 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
12d40 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69  ERSE);.  Fts5Dli
12d50 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
12d60 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a   pIter->pDlidx;.
12d70 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20    int iLeafPgno 
12d80 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
12d90 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20  no;.  int bMove 
12da0 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
12db0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
12dc0 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
12dd0 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ERM );.  assert(
12de0 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29   pIter->pDlidx )
12df0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
12e00 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69  r->pLeaf );..  i
12e10 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20  f( bRev==0 ){.  
12e20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c    while( !fts5Dl
12e30 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
12e40 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3e  lidx) && iMatch>
12e50 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
12e60 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20  id(pDlidx) ){.  
12e70 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
12e80 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
12e90 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  o(pDlidx);.     
12ea0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
12eb0 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20  xt(p, pDlidx);. 
12ec0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 5f     }.    assert_
12ed0 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70  nc( iLeafPgno>=p
12ee0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
12ef0 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20  || p->rc );.    
12f00 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  if( iLeafPgno>pI
12f10 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
12f20 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
12f30 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70  terGotoPage(p, p
12f40 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29  Iter, iLeafPgno)
12f50 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20  ;.      bMove = 
12f60 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
12f70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
12f80 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d  ter->pNextLeaf==
12f90 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
12fa0 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69   iMatch<pIter->i
12fb0 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69  Rowid );.    whi
12fc0 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74  le( !fts5DlidxIt
12fd0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
12fe0 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35 44   && iMatch<fts5D
12ff0 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
13000 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 66  lidx) ){.      f
13010 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
13020 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20  (p, pDlidx);.   
13030 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f   }.    iLeafPgno
13040 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
13050 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
13060 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44     assert( fts5D
13070 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
13080 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50  Dlidx) || iLeafP
13090 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno<=pIter->iLea
130a0 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66  fPgno );..    if
130b0 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65  ( iLeafPgno<pIte
130c0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
130d0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
130e0 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
130f0 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35  no+1;.      fts5
13100 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
13110 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
13120 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30  .      bMove = 0
13130 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
13140 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76 65  o{.    if( bMove
13150 20 29 20 66 74 73 35 53 65 67 49 74 65 72 4e 65   ) fts5SegIterNe
13160 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  xt(p, pIter, 0);
13170 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
13180 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
13190 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d  ;.    if( bRev==
131a0 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77  0 && pIter->iRow
131b0 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id>=iMatch ) bre
131c0 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  ak;.    if( bRev
131d0 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52  !=0 && pIter->iR
131e0 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62  owid<=iMatch ) b
131f0 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20  reak;.    bMove 
13200 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  = 1;.  }while( p
13210 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13220 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  );.}.../*.** Fre
13230 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
13240 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
13250 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13260 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
13270 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
13280 72 46 72 65 65 28 46 74 73 35 49 6e 64 65 78 20  rFree(Fts5Index 
13290 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65  *p, Fts5IndexIte
132a0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
132b0 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e   pIter ){.    in
132c0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
132d0 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
132e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
132f0 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70  5SegIterClear(&p
13300 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a  Iter->aSeg[i]);.
13310 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
13320 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
13330 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a  Iter->pStruct);.
13340 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
13350 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ee(&pIter->posli
13360 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
13370 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
13380 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
13390 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
133a0 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e  vanced(.  Fts5In
133b0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
133c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
133d0 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
133e0 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
133f0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
13400 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
13410 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
13420 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20  update aFirst[] 
13430 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69  array for */.  i
13440 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20  nt iChanged,    
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13460 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69  * Index of sub-i
13470 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76  terator just adv
13480 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
13490 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20 20  Minset          
134a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
134b0 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61  nimum entry in a
134c0 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a  First[] to set *
134d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
134e0 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53  for(i=(pIter->nS
134f0 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20  eg+iChanged)/2; 
13500 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d  i>=iMinset && p-
13510 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
13520 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20  i=i/2){.    int 
13530 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45  iEq;.    if( (iE
13540 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
13550 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72  rDoCompare(pIter
13560 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 66  , i)) ){.      f
13570 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
13580 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  , &pIter->aSeg[i
13590 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Eq], 0);.      i
135a0 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b   = pIter->nSeg +
135b0 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iEq;.    }.  }.
135c0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65  }../*.** Sub-ite
135d0 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64 20 6f  rator iChanged o
135e0 66 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  f iterator pIter
135f0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
13600 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74 69 6c  dvanced. It stil
13610 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  l.** points to t
13620 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74 68 6f  he same term tho
13630 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64 69 66  ugh - just a dif
13640 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20 54 68  ferent rowid. Th
13650 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
13660 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64 61 74  ttempts to updat
13670 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
13680 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69  f the pIter->aFi
13690 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c  rst[] accordingl
136a0 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  y..** If it does
136b0 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79   so successfully
136c0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
136d0 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a   Otherwise 1..**
136e0 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  .** If non-zero 
136f0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
13700 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63   caller should c
13710 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  all fts5MultiIte
13720 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f  rAdvanced().** o
13730 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  n the iterator i
13740 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66 75 6e  nstead. That fun
13750 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73  ction does the s
13760 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e 65 2c  ame as this one,
13770 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
13780 69 74 20 64 65 61 6c 73 20 77 69 74 68 20 6d 6f  it deals with mo
13790 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 63  re complicated c
137a0 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ases as well..*/
137b0 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73   .static int fts
137c0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
137d0 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e  eRowid(.  Fts5In
137e0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
137f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
13800 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
13810 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
13820 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
13830 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
13840 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
13850 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20  update aFirst[] 
13860 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69  array for */.  i
13870 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20 20 20  nt iChanged     
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13890 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69  * Index of sub-i
138a0 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76  terator just adv
138b0 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 46 74  anced */.){.  Ft
138c0 73 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77 20  s5SegIter *pNew 
138d0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
138e0 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66 28  Changed];..  if(
138f0 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70   pNew->iRowid==p
13900 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13910 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e  id.   || (pNew->
13920 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53  iRowid<pIter->iS
13930 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74  witchRowid)==pIt
13940 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20 20  er->bRev.  ){.  
13950 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74 73    int i;.    Fts
13960 35 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65 72  5SegIter *pOther
13970 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13980 69 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30 30  iChanged ^ 0x000
13990 31 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  1];.    pIter->i
139a0 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 49  SwitchRowid = pI
139b0 74 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41 4c  ter->bRev ? SMAL
139c0 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41 52  LEST_INT64 : LAR
139d0 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20  GEST_INT64;.    
139e0 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53  for(i=(pIter->nS
139f0 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20  eg+iChanged)/2; 
13a00 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20  1; i=i/2){.     
13a10 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52   Fts5CResult *pR
13a20 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69  es = &pIter->aFi
13a30 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 61  rst[i];..      a
13a40 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65  ssert( pNew->pLe
13a50 61 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  af );.      asse
13a60 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  rt( pRes->bTermE
13a70 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e  q==0 || pOther->
13a80 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20 20  pLeaf );..      
13a90 69 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  if( pRes->bTermE
13aa0 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  q ){.        if(
13ab0 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70   pNew->iRowid==p
13ac0 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b  Other->iRowid ){
13ad0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
13ae0 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  n 1;.        }el
13af0 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e  se if( (pOther->
13b00 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f  iRowid>pNew->iRo
13b10 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
13b20 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  v ){.          p
13b30 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13b40 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f  id = pOther->iRo
13b50 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70  wid;.          p
13b60 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20  New = pOther;.  
13b70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13b80 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e  (pOther->iRowid>
13b90 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
13ba0 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
13bb0 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  v ){.          p
13bc0 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13bd0 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f  id = pOther->iRo
13be0 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  wid;.        }. 
13bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65       }.      pRe
13c00 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 70 4e 65  s->iFirst = (pNe
13c10 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 29  w - pIter->aSeg)
13c20 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  ;.      if( i==1
13c30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
13c40 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72   pOther = &pIter
13c50 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
13c60 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31  First[i ^ 0x0001
13c70 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
13c80 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
13c90 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
13ca0 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f 66 20  the pIter->bEof 
13cb0 76 61 72 69 61 62 6c 65 20 62 61 73 65 64 20 6f  variable based o
13cc0 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  n the state of t
13cd0 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f 72 73  he sub-iterators
13ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13cf0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65   fts5MultiIterSe
13d00 74 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74  tEof(Fts5IndexIt
13d10 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74  er *pIter){.  Ft
13d20 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
13d30 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
13d40 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
13d50 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70 49 74  .iFirst ];.  pIt
13d60 65 72 2d 3e 62 45 6f 66 20 3d 20 70 53 65 67 2d  er->bEof = pSeg-
13d70 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74  >pLeaf==0;.  pIt
13d80 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
13d90 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
13da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
13db0 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
13dc0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a  he next entry. .
13dd0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
13de0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
13df0 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
13e00 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e  in Fts5Index.rc.
13e10 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63   It is not .** c
13e20 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
13e30 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
13e40 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20  or reaches EOF, 
13e50 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  or if it is alre
13e60 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77  ady at .** EOF w
13e70 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
13e80 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
13e90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
13ea0 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20  MultiIterNext(. 
13eb0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
13ec0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
13ed0 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46  *pIter,.  int bF
13ee0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rom,            
13ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13f00 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46  e if argument iF
13f10 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rom is valid */.
13f20 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20    i64 iFrom     
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20    /* Advance at 
13f50 6c 65 61 73 74 20 61 73 20 66 61 72 20 61 73 20  least as far as 
13f60 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  this */.){.  if(
13f70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13f80 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55 73  K ){.    int bUs
13f90 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20  eFrom = bFrom;. 
13fa0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e     do {.      in
13fb0 74 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72  t iFirst = pIter
13fc0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
13fd0 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e  st;.      int bN
13fe0 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  ewTerm = 0;.    
13ff0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14000 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
14010 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  eg[iFirst];.    
14020 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
14030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14040 20 20 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d      if( bUseFrom
14050 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78   && pSeg->pDlidx
14060 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
14070 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
14080 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b  p, pSeg, iFrom);
14090 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
140a0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
140b0 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26  rNext(p, pSeg, &
140c0 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20  bNewTerm);.     
140d0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53   }..      if( pS
140e0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20  eg->pLeaf==0 || 
140f0 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20  bNewTerm .      
14100 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65   || fts5MultiIte
14110 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c  rAdvanceRowid(p,
14120 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a   pIter, iFirst).
14130 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
14140 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
14150 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c  vanced(p, pIter,
14160 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20   iFirst, 1);.   
14170 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
14180 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b  erSetEof(pIter);
14190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
141a0 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
141b0 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65 72  erSetup(p, pIter
141c0 29 3b 0a 0a 20 20 20 20 20 20 62 55 73 65 46 72  );..      bUseFr
141d0 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  om = 0;.    }whi
141e0 6c 65 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70  le( pIter->bSkip
141f0 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c  Empty && fts5Mul
14200 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c  tiIterIsEmpty(p,
14210 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d   pIter) );.  }.}
14220 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49 6e 64  ..static Fts5Ind
14230 65 78 49 74 65 72 20 2a 66 74 73 35 4d 75 6c 74  exIter *fts5Mult
14240 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74  iIterAlloc(.  Ft
14250 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14270 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
14280 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
14290 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b  */.  int nSeg.){
142a0 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
142b0 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53   *pNew;.  int nS
142c0 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  lot;            
142d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77            /* Pow
142e0 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65  er of two >= nSe
142f0 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f  g */..  for(nSlo
14300 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b  t=2; nSlot<nSeg;
14310 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b   nSlot=nSlot*2);
14320 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64  .  pNew = fts5Id
14330 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20  xMalloc(p, .    
14340 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64    sizeof(Fts5Ind
14350 65 78 49 74 65 72 29 20 2b 20 20 20 20 20 20 20  exIter) +       
14360 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f        /* pNew */
14370 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
14380 73 35 53 65 67 49 74 65 72 29 20 2a 20 28 6e 53  s5SegIter) * (nS
14390 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e  lot-1) +   /* pN
143a0 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20  ew->aSeg[] */.  
143b0 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43      sizeof(Fts5C
143c0 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20  Result) * nSlot 
143d0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d          /* pNew-
143e0 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29  >aFirst[] */.  )
143f0 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
14400 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d      pNew->nSeg =
14410 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77   nSlot;.    pNew
14420 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35  ->aFirst = (Fts5
14430 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e  CResult*)&pNew->
14440 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20  aSeg[nSlot];.   
14450 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20   pNew->pIndex = 
14460 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
14470 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
14480 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74  llocate a new Ft
14490 73 35 49 6e 64 65 78 49 74 65 72 20 6f 62 6a 65  s5IndexIter obje
144a0 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ct..**.** The ne
144b0 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  w object will be
144c0 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
144d0 20 74 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e   through data in
144e0 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
144f0 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c  ct..** If iLevel
14500 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c   is -ve, then al
14510 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65  l data in all se
14520 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64  gments is merged
14530 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a  . Or, if iLevel.
14540 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72  ** is zero or gr
14550 65 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d  eater, data from
14560 20 74 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d   the first nSegm
14570 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20  ent segments on 
14580 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20  level iLevel.** 
14590 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a  is merged..**.**
145a0 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e   The iterator in
145b0 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  itially points t
145c0 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  o the first term
145d0 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20  /rowid entry in 
145e0 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64  the .** iterated
145f0 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
14600 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
14610 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e  terNew(.  Fts5In
14620 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
14630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
14640 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
14650 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
14660 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
14670 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20  pStruct,        
14680 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66   /* Structure of
14690 20 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20   specific index 
146a0 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d  */.  int bSkipEm
146b0 70 74 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  pty,            
146c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
146d0 69 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d 6b 65  ignore delete-ke
146e0 79 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ys */.  int flag
146f0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
14700 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 49          /* FTS5I
14710 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20 66  NDEX_QUERY_XXX f
14720 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
14730 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
14740 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
14750 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72  m to seek to (or
14760 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e   NULL/0) */.  in
14770 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14790 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74   Level to iterat
147a0 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a  e (-1 for all) *
147b0 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  /.  int nSegment
147c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
147d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
147e0 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72   segments to mer
147f0 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a  ge (iLevel>=0) *
14800 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
14810 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20  r **ppOut       
14820 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
14830 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53  t */.){.  int nS
14840 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
14850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14860 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69  ber of segment-i
14870 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ters in use */. 
14880 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20   int iIter = 0; 
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65   /* */.  int iSe
148b0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
148c0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
148d0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
148e0 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ugh segments */.
148f0 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
14900 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20   = {0,0,0};     
14910 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
14920 20 62 79 20 66 74 73 35 53 65 67 49 74 65 72 53   by fts5SegIterS
14930 65 65 6b 49 6e 69 74 28 29 20 2a 2f 0a 20 20 46  eekInit() */.  F
14940 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
14950 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49  l *pLvl;.  Fts5I
14960 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a  ndexIter *pNew;.
14970 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
14980 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30  m==0 && nTerm==0
14990 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b  ) || iLevel<0 );
149a0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
149b0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
149c0 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72  w multi-seg-iter
149d0 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ator. */.  if( p
149e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
149f0 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65  ){.    if( iLeve
14a00 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  l<0 ){.      ass
14a10 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53  ert( pStruct->nS
14a20 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75  egment==fts5Stru
14a30 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
14a40 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20  ts(pStruct) );. 
14a50 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72       nSeg = pStr
14a60 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  uct->nSegment;. 
14a70 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d       nSeg += (p-
14a80 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b  >pHash ? 1 : 0);
14a90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14aa0 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74    nSeg = MIN(pSt
14ab0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65  ruct->aLevel[iLe
14ac0 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d  vel].nSeg, nSegm
14ad0 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
14ae0 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20    *ppOut = pNew 
14af0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  = fts5MultiIterA
14b00 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20  lloc(p, nSeg);. 
14b10 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
14b20 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62  eturn;.  pNew->b
14b30 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73  Rev = (0!=(flags
14b40 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
14b50 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65  RY_DESC));.  pNe
14b60 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20  w->bSkipEmpty = 
14b70 62 53 6b 69 70 45 6d 70 74 79 3b 0a 20 20 70 4e  bSkipEmpty;.  pN
14b80 65 77 2d 3e 70 53 74 72 75 63 74 20 3d 20 70 53  ew->pStruct = pS
14b90 74 72 75 63 74 3b 0a 20 20 66 74 73 35 53 74 72  truct;.  fts5Str
14ba0 75 63 74 75 72 65 52 65 66 28 70 53 74 72 75 63  uctureRef(pStruc
14bb0 74 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  t);..  /* Initia
14bc0 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65  lize each of the
14bd0 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65   component segme
14be0 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f  nt iterators. */
14bf0 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20  .  if( iLevel<0 
14c00 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
14c10 74 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20  tureLevel *pEnd 
14c20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
14c30 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  el[pStruct->nLev
14c40 65 6c 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  el];.    if( p->
14c50 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 2f  pHash ){.      /
14c60 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20  * Add a segment 
14c70 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  iterator for the
14c80 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
14c90 73 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61  s of the hash ta
14ca0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 74  ble. */.      Ft
14cb0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
14cc0 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
14cd0 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 66  Iter++];.      f
14ce0 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
14cf0 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65  it(p, pTerm, nTe
14d00 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72  rm, flags, pIter
14d10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
14d20 28 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e  (pLvl=&pStruct->
14d30 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c  aLevel[0]; pLvl<
14d40 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20  pEnd; pLvl++){. 
14d50 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c       for(iSeg=pL
14d60 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67  vl->nSeg-1; iSeg
14d70 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20  >=0; iSeg--){.  
14d80 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
14d90 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
14da0 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69   = &pLvl->aSeg[i
14db0 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74  Seg];.        Ft
14dc0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
14dd0 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
14de0 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  Iter++];.       
14df0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
14e00 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
14e10 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53  egIterInit(p, pS
14e20 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
14e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14e40 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14e50 53 65 65 6b 49 6e 69 74 28 70 2c 20 26 62 75 66  SeekInit(p, &buf
14e60 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , pTerm, nTerm, 
14e70 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74  flags, pSeg, pIt
14e80 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
14e90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14ea0 65 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c 20 3d  else{.    pLvl =
14eb0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
14ec0 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66  l[iLevel];.    f
14ed0 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20  or(iSeg=nSeg-1; 
14ee0 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29  iSeg>=0; iSeg--)
14ef0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
14f00 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c  terInit(p, &pLvl
14f10 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70  ->aSeg[iSeg], &p
14f20 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
14f30 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +]);.    }.  }. 
14f40 20 61 73 73 65 72 74 28 20 69 49 74 65 72 3d 3d   assert( iIter==
14f50 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  nSeg );..  /* If
14f60 20 74 68 65 20 61 62 6f 76 65 20 77 61 73 20 73   the above was s
14f70 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68 20  uccessful, each 
14f80 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61 74  component iterat
14f90 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a  ors now points .
14fa0 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73    ** to the firs
14fb0 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20 73  t entry in its s
14fc0 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20  egment. In this 
14fd0 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  case initialize 
14fe0 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73 74  the .  ** aFirst
14ff0 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66  [] array. Or, if
15000 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
15010 63 75 72 72 65 64 2c 20 66 72 65 65 20 74 68 65  curred, free the
15020 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f   iterator.  ** o
15030 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74 68  bject and set th
15040 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
15050 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20  e to NULL.  */. 
15060 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72  TE_OK ){.    for
15080 28 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65  (iIter=pNew->nSe
15090 67 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49  g-1; iIter>0; iI
150a0 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e  ter--){.      in
150b0 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28  t iEq;.      if(
150c0 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74   (iEq = fts5Mult
150d0 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70  iIterDoCompare(p
150e0 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a  New, iIter)) ){.
150f0 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
15100 74 65 72 4e 65 78 74 28 70 2c 20 26 70 4e 65 77  terNext(p, &pNew
15110 2d 3e 61 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b  ->aSeg[iEq], 0);
15120 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
15130 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70  tiIterAdvanced(p
15140 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74  , pNew, iEq, iIt
15150 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
15160 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69   }.    fts5Multi
15170 49 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29  IterSetEof(pNew)
15180 3b 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74  ;.    fts5Assert
15190 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70  MultiIterSetup(p
151a0 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66  , pNew);..    if
151b0 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70  ( pNew->bSkipEmp
151c0 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49  ty && fts5MultiI
151d0 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e  terIsEmpty(p, pN
151e0 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ew) ){.      fts
151f0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
15200 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20  , pNew, 0, 0);. 
15210 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
15220 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
15230 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ree(p, pNew);.  
15240 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20    *ppOut = 0;.  
15250 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
15260 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a  ee(&buf);.}../*.
15270 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 46 74 73  ** Create an Fts
15280 35 49 6e 64 65 78 49 74 65 72 20 74 68 61 74 20  5IndexIter that 
15290 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
152a0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 70 72 6f   the doclist pro
152b0 76 69 64 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  vided.** as the 
152c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
152d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
152e0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
152f0 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  2(.  Fts5Index *
15300 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
15310 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
15320 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
15330 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35  within */.  Fts5
15340 44 61 74 61 20 2a 70 44 61 74 61 2c 20 20 20 20  Data *pData,    
15350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
15360 6f 63 6c 69 73 74 20 74 6f 20 69 74 65 72 61 74  oclist to iterat
15370 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69  e through */.  i
15380 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20  nt bDesc,       
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
153a0 2a 20 54 72 75 65 20 66 6f 72 20 64 65 73 63 65  * True for desce
153b0 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65  nding rowid orde
153c0 72 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  r */.  Fts5Index
153d0 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20  Iter **ppOut    
153e0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
153f0 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ject */.){.  Fts
15400 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77  5IndexIter *pNew
15410 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 4d  ;.  pNew = fts5M
15420 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c  ultiIterAlloc(p,
15430 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20   2);.  if( pNew 
15440 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
15450 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
15460 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20  w->aSeg[1];..   
15470 20 70 4e 65 77 2d 3e 62 46 69 6c 74 65 72 65 64   pNew->bFiltered
15480 20 3d 20 31 3b 0a 20 20 20 20 70 49 74 65 72 2d   = 1;.    pIter-
15490 3e 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 53 45  >flags = FTS5_SE
154a0 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
154b0 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 73 7a     if( pData->sz
154c0 4c 65 61 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  Leaf>0 ){.      
154d0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
154e0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65  Data;.      pIte
154f0 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
15500 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
15510 44 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a 29 26  Data->p, (u64*)&
15520 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
15530 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
15540 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 44 61  dofDoclist = pDa
15550 74 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 70 4e  ta->nn;.      pN
15560 65 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  ew->aFirst[1].iF
15570 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
15580 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20  if( bDesc ){.   
15590 20 20 20 20 20 70 4e 65 77 2d 3e 62 52 65 76 20       pNew->bRev 
155a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 49 74  = 1;.        pIt
155b0 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
155c0 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
155d0 45 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  E;.        fts5S
155e0 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
155f0 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
15600 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15610 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
15620 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
15630 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
15640 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20     pData = 0;.  
15650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15660 4e 65 77 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  New->bEof = 1;. 
15670 20 20 20 7d 0a 0a 20 20 20 20 2a 70 70 4f 75 74     }..    *ppOut
15680 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = pNew;.  }..  
15690 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
156a0 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
156b0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
156c0 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
156d0 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20  at EOF or if an 
156e0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
156f0 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74  ed. .** False ot
15700 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
15710 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
15720 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
15730 78 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49  x *p, Fts5IndexI
15740 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61  ter *pIter){.  a
15750 73 73 65 72 74 28 20 70 2d 3e 72 63 20 0a 20 20  ssert( p->rc .  
15760 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 61      || (pIter->a
15770 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
15780 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70  st[1].iFirst ].p
15790 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d  Leaf==0)==pIter-
157a0 3e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65  >bEof .  );.  re
157b0 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
157c0 49 74 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d 0a 0a  Iter->bEof);.}..
157d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
157e0 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e   rowid of the en
157f0 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65  try that the ite
15800 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  rator currently 
15810 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66  points.** to. If
15820 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
15830 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e  ints to EOF when
15840 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
15850 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20  s called the.** 
15860 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65  results are unde
15870 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
15880 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74   i64 fts5MultiIt
15890 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65  erRowid(Fts5Inde
158a0 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
158b0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
158c0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
158d0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
158e0 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75 72  pLeaf );.  retur
158f0 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  n pIter->aSeg[ p
15900 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15910 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b  iFirst ].iRowid;
15920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
15930 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
15940 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74  he next entry at
15950 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d   or following iM
15960 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  atch..*/.static 
15970 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
15980 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
15990 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
159a0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
159b0 74 65 72 2c 20 0a 20 20 69 36 34 20 69 4d 61 74  ter, .  i64 iMat
159c0 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 31  ch.){.  while( 1
159d0 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
159e0 69 64 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  id;.    fts5Mult
159f0 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
15a00 65 72 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a  er, 1, iMatch);.
15a10 20 20 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74      if( fts5Mult
15a20 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
15a30 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  r) ) break;.    
15a40 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c  iRowid = fts5Mul
15a50 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65  tiIterRowid(pIte
15a60 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  r);.    if( pIte
15a70 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20 69 52  r->bRev==0 && iR
15a80 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62  owid>=iMatch ) b
15a90 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 49  reak;.    if( pI
15aa0 74 65 72 2d 3e 62 52 65 76 21 3d 30 20 26 26 20  ter->bRev!=0 && 
15ab0 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29  iRowid<=iMatch )
15ac0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f   break;.  }.}../
15ad0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
15ae0 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
15af0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
15b00 20 74 65 72 6d 20 61 73 73 6f 63 69 61 74 65 64   term associated
15b10 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e   with the .** en
15b20 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65  try that the ite
15b30 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  rator currently 
15b40 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74  points to..*/.st
15b50 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 2a 66  atic const u8 *f
15b60 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
15b70 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
15b80 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b  pIter, int *pn){
15b90 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
15ba0 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  p = &pIter->aSeg
15bb0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
15bc0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 2a  1].iFirst ];.  *
15bd0 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a  pn = p->term.n;.
15be0 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d    return p->term
15bf0 2e 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  .p;.}..static vo
15c00 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  id fts5ChunkIter
15c10 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ate(.  Fts5Index
15c20 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15c30 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
15c40 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
15c50 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20 20  SegIter *pSeg,  
15c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
15c70 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73 20 69  oslist of this i
15c80 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f 69  terator */.  voi
15c90 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  d *pCtx,        
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15cb0 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20  Context pointer 
15cc0 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c 62  for xChunk callb
15cd0 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ack */.  void (*
15ce0 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e 64 65  xChunk)(Fts5Inde
15cf0 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73 74  x*, void*, const
15d00 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20 20   u8*, int).){.  
15d10 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65 67 2d  int nRem = pSeg-
15d20 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20  >nPos;          
15d30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
15d40 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d 65  es still to come
15d50 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
15d60 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75 38 20  pData = 0;.  u8 
15d70 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65 67 2d  *pChunk = &pSeg-
15d80 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e  >pLeaf->p[pSeg->
15d90 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
15da0 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e  int nChunk = MIN
15db0 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c 65  (nRem, pSeg->pLe
15dc0 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65  af->szLeaf - pSe
15dd0 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 29 3b  g->iLeafOffset);
15de0 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70 53  .  int pgno = pS
15df0 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  eg->iLeafPgno;. 
15e00 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d 20   int pgnoSave = 
15e10 30 3b 0a 0a 20 20 69 66 28 20 28 70 53 65 67 2d  0;..  if( (pSeg-
15e20 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
15e30 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d  GITER_REVERSE)==
15e40 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76  0 ){.    pgnoSav
15e50 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a  e = pgno+1;.  }.
15e60 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
15e70 20 20 20 78 43 68 75 6e 6b 28 70 2c 20 70 43 74     xChunk(p, pCt
15e80 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e  x, pChunk, nChun
15e90 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20  k);.    nRem -= 
15ea0 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35  nChunk;.    fts5
15eb0 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
15ec0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 6d  a);.    if( nRem
15ed0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  <=0 ){.      bre
15ee0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
15ef0 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20       pgno++;.   
15f00 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44     pData = fts5D
15f10 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
15f20 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
15f30 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  eg->pSeg->iSegid
15f40 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
15f50 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 20 62  if( pData==0 ) b
15f60 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 68 75  reak;.      pChu
15f70 6e 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34  nk = &pData->p[4
15f80 5d 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b 20  ];.      nChunk 
15f90 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74  = MIN(nRem, pDat
15fa0 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a  a->szLeaf - 4);.
15fb0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
15fc0 70 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20 20  pgnoSave ){.    
15fd0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
15fe0 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
15ff0 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e  ;.        pSeg->
16000 70 4e 65 78 74 4c 65 61 66 20 3d 20 70 44 61 74  pNextLeaf = pDat
16010 61 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61  a;.        pData
16020 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
16030 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a    }.  }.}..../*.
16040 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
16050 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72  w segment-id for
16060 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
16070 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20  Struct. The new 
16080 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75  segment.** id mu
16090 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  st be between 1 
160a0 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73  and 65335 inclus
160b0 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f  ive, and must no
160c0 74 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a  t be used by .**
160d0 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65   any currently e
160e0 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e  xisting segment.
160f0 20 49 66 20 61 20 66 72 65 65 20 73 65 67 6d 65   If a free segme
16100 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20  nt id cannot be 
16110 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
16120 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  _FULL is returne
16130 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
16140 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
16150 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
16160 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
16170 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65  -op. 0 is .** re
16180 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
16190 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
161a0 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53  nt fts5AllocateS
161b0 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a  egid(Fts5Index *
161c0 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  p, Fts5Structure
161d0 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e   *pStruct){.  in
161e0 74 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20  t iSegid = 0;.. 
161f0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16200 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
16210 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
16220 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47  nt>=FTS5_MAX_SEG
16230 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d  MENT ){.      p-
16240 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c  >rc = SQLITE_FUL
16250 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
16260 20 20 20 20 77 68 69 6c 65 28 20 69 53 65 67 69      while( iSegi
16270 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
16280 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
16290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
162a0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
162b0 66 28 75 33 32 29 2c 20 28 76 6f 69 64 2a 29 26  f(u32), (void*)&
162c0 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20  iSegid);.       
162d0 20 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64   iSegid = iSegid
162e0 20 26 20 28 28 31 20 3c 3c 20 46 54 53 35 5f 44   & ((1 << FTS5_D
162f0 41 54 41 5f 49 44 5f 42 29 2d 31 29 3b 0a 20 20  ATA_ID_B)-1);.  
16300 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30        for(iLvl=0
16310 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
16320 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
16330 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
16340 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72  Seg=0; iSeg<pStr
16350 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
16360 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ].nSeg; iSeg++){
16370 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
16380 20 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74   iSegid==pStruct
16390 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
163a0 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
163b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
163c0 20 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 20 20    iSegid = 0;.  
163d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
163e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
163f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16400 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 53    }..  return iS
16410 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  egid;.}../*.** D
16420 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20  iscard all data 
16430 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
16440 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62   in the hash-tab
16450 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
16460 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44 69 73  oid fts5IndexDis
16470 63 61 72 64 44 61 74 61 28 46 74 73 35 49 6e 64  cardData(Fts5Ind
16480 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ex *p){.  assert
16490 28 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d  ( p->pHash || p-
164a0 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30  >nPendingData==0
164b0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61   );.  if( p->pHa
164c0 73 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sh ){.    sqlite
164d0 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70  3Fts5HashClear(p
164e0 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d  ->pHash);.    p-
164f0 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20  >nPendingData = 
16500 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
16510 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
16520 6f 66 20 74 68 65 20 70 72 65 66 69 78 2c 20 69  of the prefix, i
16530 6e 20 62 79 74 65 73 2c 20 74 68 61 74 20 62 75  n bytes, that bu
16540 66 66 65 72 20 28 6e 4e 65 77 2f 70 4e 65 77 29  ffer (nNew/pNew)
16550 20 73 68 61 72 65 73 0a 2a 2a 20 77 69 74 68 20   shares.** with 
16560 62 75 66 66 65 72 20 28 6e 4f 6c 64 2f 70 4f 6c  buffer (nOld/pOl
16570 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d)..*/.static in
16580 74 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  t fts5PrefixComp
16590 72 65 73 73 28 0a 20 20 69 6e 74 20 6e 4f 6c 64  ress(.  int nOld
165a0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64  , const u8 *pOld
165b0 2c 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 63 6f  ,.  int nNew, co
165c0 6e 73 74 20 75 38 20 2a 70 4e 65 77 0a 29 7b 0a  nst u8 *pNew.){.
165d0 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
165e0 74 28 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61  t( fts5BlobCompa
165f0 72 65 28 70 4f 6c 64 2c 20 6e 4f 6c 64 2c 20 70  re(pOld, nOld, p
16600 4e 65 77 2c 20 6e 4e 65 77 29 3c 30 20 29 3b 0a  New, nNew)<0 );.
16610 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
16620 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
16630 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69   pOld[i]!=pNew[i
16640 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ] ) break;.  }. 
16650 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74   return i;.}..st
16660 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
16670 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20  iteDlidxClear(. 
16680 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
16690 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
166a0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
166b0 62 46 6c 75 73 68 20 20 20 20 20 20 20 20 20 20  bFlush          
166c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
166d0 66 20 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c  f true, write dl
166e0 69 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29  idx to disk */.)
166f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
16700 65 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c  ert( bFlush==0 |
16710 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  | (pWriter->nDli
16720 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  dx>0 && pWriter-
16730 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
16740 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  >0) );.  for(i=0
16750 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c  ; i<pWriter->nDl
16760 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  idx; i++){.    F
16770 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
16780 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
16790 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20  r->aDlidx[i];.  
167a0 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
167b0 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  f.n==0 ) break;.
167c0 20 20 20 20 69 66 28 20 62 46 6c 75 73 68 20 29      if( bFlush )
167d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
167e0 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20  pDlidx->pgno!=0 
167f0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  );.      fts5Dat
16800 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20  aWrite(p, .     
16810 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
16820 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
16830 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78  Segid, i, pDlidx
16840 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20  ->pgno),.       
16850 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
16860 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a  , pDlidx->buf.n.
16870 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
16880 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
16890 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
168a0 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69  ->buf);.    pDli
168b0 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
168c0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
168d0 20 47 72 6f 77 20 74 68 65 20 70 57 72 69 74 65   Grow the pWrite
168e0 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61  r->aDlidx[] arra
168f0 79 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c  y to at least nL
16900 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73  vl elements in s
16910 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20  ize..** Any new 
16920 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61  array elements a
16930 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65  re zeroed before
16940 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
16950 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72  tatic int fts5Wr
16960 69 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20  iteDlidxGrow(.  
16970 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
16980 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
16990 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c  Writer,.  int nL
169a0 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  vl.){.  if( p->r
169b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
169c0 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e  nLvl>=pWriter->n
169d0 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
169e0 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
169f0 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64  lidx = (Fts5Dlid
16a00 78 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33  xWriter*)sqlite3
16a10 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
16a20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
16a30 78 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  x, sizeof(Fts5Dl
16a40 69 64 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76  idxWriter) * nLv
16a50 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
16a60 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20   aDlidx==0 ){.  
16a70 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
16a80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
16a90 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
16aa0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
16ab0 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
16ac0 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72   (nLvl - pWriter
16ad0 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  ->nDlidx);.     
16ae0 20 6d 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b   memset(&aDlidx[
16af0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d  pWriter->nDlidx]
16b00 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
16b10 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69     pWriter->aDli
16b20 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20  dx = aDlidx;.   
16b30 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69     pWriter->nDli
16b40 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d  dx = nLvl;.    }
16b50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
16b60 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  >rc;.}../*.** If
16b70 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
16b80 6c 69 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d  list-index accum
16b90 75 6c 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74  ulating in pWrit
16ba0 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20  er->aDlidx[] is 
16bb0 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c  large.** enough,
16bc0 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
16bd0 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  k and return 1. 
16be0 4f 74 68 65 72 77 69 73 65 20 64 69 73 63 61 72  Otherwise discar
16bf0 64 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a  d it and return.
16c00 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  ** zero..*/.stat
16c10 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65  ic int fts5Write
16c20 46 6c 75 73 68 44 6c 69 64 78 28 46 74 73 35 49  FlushDlidx(Fts5I
16c30 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
16c40 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
16c50 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20  {.  int bFlag = 
16c60 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  0;..  /* If ther
16c70 65 20 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f  e were FTS5_MIN_
16c80 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f  DLIDX_SIZE or mo
16c90 72 65 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61  re empty leaf pa
16ca0 67 65 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  ges written.  **
16cb0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16cc0 2c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  , also write the
16cd0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74   doclist-index t
16ce0 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66  o disk.  */.  if
16cf0 28 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  ( pWriter->aDlid
16d00 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20  x[0].buf.n>0 && 
16d10 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e  pWriter->nEmpty>
16d20 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f  =FTS5_MIN_DLIDX_
16d30 53 49 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61  SIZE ){.    bFla
16d40 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73  g = 1;.  }.  fts
16d50 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
16d60 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c  (p, pWriter, bFl
16d70 61 67 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ag);.  pWriter->
16d80 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65  nEmpty = 0;.  re
16d90 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f  turn bFlag;.}../
16da0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16db0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
16dc0 6e 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67  never processing
16dd0 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
16de0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74  for the .** last
16df0 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61   term on leaf pa
16e00 67 65 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74  ge (pWriter->iBt
16e10 50 61 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74  Page) is complet
16e20 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ed. .**.** The d
16e30 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
16e40 20 74 68 61 74 20 74 65 72 6d 20 69 73 20 63 75   that term is cu
16e50 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
16e60 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20  n-memory within 
16e70 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72  the.** Fts5SegWr
16e80 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72  iter.aDlidx[] ar
16e90 72 61 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61  ray. If it is la
16ea0 72 67 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73  rge enough, this
16eb0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69   function.** wri
16ec0 74 65 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69  tes it out to di
16ed0 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73  sk. Or, if it is
16ee0 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f   too small to bo
16ef0 74 68 65 72 20 77 69 74 68 2c 20 64 69 73 63 61  ther with, disca
16f00 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a  rds.** it..**.**
16f10 20 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 62   Fts5SegWriter.b
16f20 74 74 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20  tterm currently 
16f30 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72  contains the fir
16f40 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  st term on page 
16f50 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  iBtPage..*/.stat
16f60 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
16f70 65 46 6c 75 73 68 42 74 72 65 65 28 46 74 73 35  eFlushBtree(Fts5
16f80 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
16f90 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
16fa0 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a  ){.  int bFlag;.
16fb0 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
16fc0 65 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70  er->iBtPage || p
16fd0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d  Writer->nEmpty==
16fe0 30 20 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74  0 );.  if( pWrit
16ff0 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29  er->iBtPage==0 )
17000 20 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67   return;.  bFlag
17010 20 3d 20 66 74 73 35 57 72 69 74 65 46 6c 75 73   = fts5WriteFlus
17020 68 44 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65  hDlidx(p, pWrite
17030 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  r);..  if( p->rc
17040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17050 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17060 20 3d 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74   = (pWriter->btt
17070 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63  erm.n>0?(const c
17080 68 61 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74  har*)pWriter->bt
17090 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20  term.p:"");.    
170a0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
170b0 20 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e   was already don
170c0 65 20 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e  e in fts5WriteIn
170d0 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20  it(): */.    /* 
170e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
170f0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
17100 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
17110 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  id); */.    sqli
17120 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d  te3_bind_blob(p-
17130 3e 70 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20  >pIdxWriter, 2, 
17140 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65  z, pWriter->btte
17150 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  rm.n, SQLITE_STA
17160 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
17170 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
17180 70 49 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62  pIdxWriter, 3, b
17190 46 6c 61 67 20 2b 20 28 28 69 36 34 29 70 57 72  Flag + ((i64)pWr
171a0 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31  iter->iBtPage<<1
171b0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
171c0 73 74 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74  step(p->pIdxWrit
171d0 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  er);.    p->rc =
171e0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
171f0 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20  ->pIdxWriter);. 
17200 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42   }.  pWriter->iB
17210 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tPage = 0;.}../*
17220 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
17230 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
17240 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70   leaf page excep
17250 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74  t the first that
17260 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20   contains.** at 
17270 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20  least one term. 
17280 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f  Argument (nTerm/
17290 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70  pTerm) is the sp
172a0 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d  lit-key - a term
172b0 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
172c0 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d  er than all term
172d0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72  s written to ear
172e0 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64  lier leaves, and
172f0 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20   equal to or.** 
17300 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
17310 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
17320 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a  he new leaf..**.
17330 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
17340 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
17350 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
17360 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66  Fts5Index.rc. If
17370 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73   an error.** has
17380 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
17390 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
173a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
173b0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
173c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
173d0 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
173e0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
173f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17400 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
17410 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
17420 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
17430 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
17440 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
17450 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
17460 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
17470 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
17480 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20  erm on new page 
17490 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74  */.){.  fts5Writ
174a0 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
174b0 57 72 69 74 65 72 29 3b 0a 20 20 66 74 73 35 42  Writer);.  fts5B
174c0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
174d0 20 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72   &pWriter->btter
174e0 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
174f0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  ;.  pWriter->iBt
17500 50 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e  Page = pWriter->
17510 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a  writer.pgno;.}..
17520 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17530 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
17540 65 6e 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65  en flushing a le
17550 61 66 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  af page that con
17560 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d  tains no.** term
17570 73 20 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b  s at all to disk
17580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17590 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
175a0 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  oTerm(.  Fts5Ind
175b0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
175c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
175d0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
175e0 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
175f0 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20  er *pWriter     
17600 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
17610 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  bject */.){.  /*
17620 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
17630 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20  o rowids on the 
17640 6c 65 61 66 20 70 61 67 65 20 65 69 74 68 65 72  leaf page either
17650 20 61 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74   and the doclist
17660 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20  -index.  ** has 
17670 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 61  already been sta
17680 72 74 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20  rted, append an 
17690 30 78 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e  0x00 byte to it.
176a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74    */.  if( pWrit
176b0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
176c0 6e 50 61 67 65 20 26 26 20 70 57 72 69 74 65 72  nPage && pWriter
176d0 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
176e0 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44  n>0 ){.    Fts5D
176f0 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
17700 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
17710 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73  Dlidx[0];.    as
17720 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50  sert( pDlidx->bP
17730 72 65 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  revValid );.    
17740 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
17750 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
17760 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
17770 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  uf, 0);.  }..  /
17780 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
17790 22 6e 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65  "number of seque
177a0 6e 74 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74  ntial leaves wit
177b0 68 6f 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75  hout a term" cou
177c0 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74  nter. */.  pWrit
177d0 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a  er->nEmpty++;.}.
177e0 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
177f0 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73  DlidxExtractFirs
17800 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65  tRowid(Fts5Buffe
17810 72 20 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20  r *pBuf){.  i64 
17820 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f  iRowid;.  int iO
17830 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20  ff;..  iOff = 1 
17840 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  + fts5GetVarint(
17850 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36  &pBuf->p[1], (u6
17860 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66  4*)&iRowid);.  f
17870 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
17880 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  uf->p[iOff], (u6
17890 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72  4*)&iRowid);.  r
178a0 65 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a  eturn iRowid;.}.
178b0 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f  ./*.** Rowid iRo
178c0 77 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65  wid has just bee
178d0 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
178e0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
178f0 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a  age. It is the.*
17900 2a 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70  * first on the p
17910 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
17920 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70  on appends an ap
17930 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20  propriate entry 
17940 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  to the current.*
17950 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  * doclist-index.
17960 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17970 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
17980 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65  pend(.  Fts5Inde
17990 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
179a0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
179b0 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29   .  i64 iRowid.)
179c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
179d0 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66   bDone = 0;..  f
179e0 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
179f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e  QLITE_OK && bDon
17a00 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e==0; i++){.    
17a10 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74  i64 iVal;.    Ft
17a20 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
17a30 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
17a40 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20  ->aDlidx[i];..  
17a50 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
17a60 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  f.n>=p->pConfig-
17a70 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f  >pgsz ){.      /
17a80 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f  * The current do
17a90 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65  clist-index page
17aa0 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20   is full. Write 
17ab0 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70  it to disk and p
17ac0 75 73 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  ush.      ** a c
17ad0 6f 70 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77  opy of iRowid (w
17ae0 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65  hich will become
17af0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
17b00 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20   on the next.   
17b10 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e     ** doclist-in
17b20 64 65 78 20 6c 65 61 66 20 70 61 67 65 29 20 75  dex leaf page) u
17b30 70 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20  p into the next 
17b40 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74  level of the b-t
17b50 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69  ree .      ** hi
17b60 65 72 61 72 63 68 79 2e 20 49 66 20 74 68 65 20  erarchy. If the 
17b70 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68  node being flush
17b80 65 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ed is currently 
17b90 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20  the root node,. 
17ba0 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73       ** also pus
17bb0 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69  h its first rowi
17bc0 64 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20  d upwards. */.  
17bd0 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e      pDlidx->buf.
17be0 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20  p[0] = 0x01;    
17bf0 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20  /* Not the root 
17c00 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74  node */.      ft
17c10 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a  s5DataWrite(p, .
17c20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
17c30 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74  LIDX_ROWID(pWrit
17c40 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
17c50 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20  Dlidx->pgno),.  
17c60 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e          pDlidx->
17c70 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62  buf.p, pDlidx->b
17c80 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20  uf.n.      );.  
17c90 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
17ca0 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  dxGrow(p, pWrite
17cb0 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70  r, i+2);.      p
17cc0 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
17cd0 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20  ->aDlidx[i];.   
17ce0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
17cf0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64  LITE_OK && pDlid
17d00 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b  x[1].buf.n==0 ){
17d10 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 46 69  .        i64 iFi
17d20 72 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45  rst = fts5DlidxE
17d30 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64  xtractFirstRowid
17d40 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a  (&pDlidx->buf);.
17d50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
17d60 20 77 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f   was the root no
17d70 64 65 2e 20 50 75 73 68 20 69 74 73 20 66 69 72  de. Push its fir
17d80 73 74 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74  st rowid up to t
17d90 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a  he new root. */.
17da0 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
17db0 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d  ].pgno = pDlidx-
17dc0 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73  >pgno;.        s
17dd0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
17de0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
17df0 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e  >rc, &pDlidx[1].
17e00 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
17e10 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
17e20 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
17e30 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
17e40 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70  ].buf, pDlidx->p
17e50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  gno);.        sq
17e60 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
17e70 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
17e80 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
17e90 75 66 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20  uf, iFirst);.   
17ea0 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62       pDlidx[1].b
17eb0 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
17ec0 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
17ed0 2e 69 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b  .iPrev = iFirst;
17ee0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17ef0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
17f00 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62  rZero(&pDlidx->b
17f10 75 66 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64  uf);.      pDlid
17f20 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  x->bPrevValid = 
17f30 30 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  0;.      pDlidx-
17f40 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >pgno++;.    }el
17f50 73 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20  se{.      bDone 
17f60 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
17f70 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65  if( pDlidx->bPre
17f80 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  vValid ){.      
17f90 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20  iVal = iRowid - 
17fa0 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20  pDlidx->iPrev;. 
17fb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17fc0 69 36 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d  i64 iPgno = (i==
17fd0 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69  0 ? pWriter->wri
17fe0 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64  ter.pgno : pDlid
17ff0 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20  x[-1].pgno);.   
18000 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
18010 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20  x->buf.n==0 );. 
18020 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
18030 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
18040 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
18050 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29  dx->buf, !bDone)
18060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
18070 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
18080 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
18090 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e  Dlidx->buf, iPgn
180a0 6f 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d  o);.      iVal =
180b0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a   iRowid;.    }..
180c0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
180d0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
180e0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
180f0 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20  x->buf, iVal);. 
18100 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76     pDlidx->bPrev
18110 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70  Valid = 1;.    p
18120 44 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69  Dlidx->iPrev = i
18130 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Rowid;.  }.}..st
18140 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
18150 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73  iteFlushLeaf(Fts
18160 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
18170 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
18180 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  r){.  static con
18190 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b  st u8 zero[] = {
181a0 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
181b0 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73  0, 0x00 };.  Fts
181c0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
181d0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
181e0 72 69 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f  riter;.  i64 iRo
181f0 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  wid;..  assert( 
18200 28 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d  (pPage->pgidx.n=
18210 3d 30 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62  =0)==(pWriter->b
18220 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29  FirstTermInPage)
18230 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
18240 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20  e szLeaf header 
18250 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65  field. */.  asse
18260 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31  rt( 0==fts5GetU1
18270 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
18280 32 5d 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74  2]) );.  fts5Put
18290 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
182a0 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  p[2], pPage->buf
182b0 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69  .n);..  if( pWri
182c0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
182d0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nPage ){.    /* 
182e0 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72 69 74  No term was writ
182f0 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65  ten to this page
18300 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
18310 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d   pPage->pgidx.n=
18320 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72  =0 );.    fts5Wr
18330 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70  iteBtreeNoTerm(p
18340 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65  , pWriter);.  }e
18350 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65  lse{.    /* Appe
18360 6e 64 20 74 68 65 20 70 67 69 64 78 20 74 6f 20  nd the pgidx to 
18370 74 68 65 20 70 61 67 65 20 62 75 66 66 65 72 2e  the page buffer.
18380 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20   Set the szLeaf 
18390 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f  header field. */
183a0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
183b0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
183c0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70  , &pPage->buf, p
183d0 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70  Page->pgidx.n, p
183e0 50 61 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a  Page->pgidx.p);.
183f0 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
18400 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
18410 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64  disk */.  iRowid
18420 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
18430 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
18440 53 65 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67  Segid, pPage->pg
18450 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57  no);.  fts5DataW
18460 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20  rite(p, iRowid, 
18470 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50  pPage->buf.p, pP
18480 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20  age->buf.n);..  
18490 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
184a0 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a  e next page. */.
184b0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
184c0 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20  (&pPage->buf);. 
184d0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
184e0 26 70 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a  &pPage->pgidx);.
184f0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
18500 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
18510 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a  pPage->buf, 4, z
18520 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69  ero);.  pPage->i
18530 50 72 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20  PrevPgidx = 0;. 
18540 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a   pPage->pgno++;.
18550 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74  .  /* Increase t
18560 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  he leaves writte
18570 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70  n counter */.  p
18580 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69  Writer->nLeafWri
18590 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  tten++;..  /* Th
185a0 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73  e new leaf holds
185b0 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77   no terms or row
185c0 69 64 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72  ids */.  pWriter
185d0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
185e0 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65  ge = 1;.  pWrite
185f0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
18600 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Page = 1;.}../*.
18610 2a 2a 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70  ** Append term p
18620 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68  Term/nTerm to th
18630 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20  e segment being 
18640 77 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 77  written by the w
18650 72 69 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20  riter passed.** 
18660 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
18670 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
18680 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
18690 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
186a0 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
186b0 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
186c0 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
186d0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
186e0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
186f0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
18700 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
18710 64 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  dTerm(.  Fts5Ind
18720 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
18730 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
18740 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63  ,.  int nTerm, c
18750 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a  onst u8 *pTerm .
18760 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  ){.  int nPrefix
18770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18780 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
18790 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73   prefix compress
187a0 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a  ion for term */.
187b0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
187c0 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
187d0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74  er->writer;.  Ft
187e0 73 35 42 75 66 66 65 72 20 2a 70 50 67 69 64 78  s5Buffer *pPgidx
187f0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
18800 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 61 73  ter.pgidx;..  as
18810 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
18820 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
18830 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  rt( pPage->buf.n
18840 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=4 );.  assert(
18850 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20   pPage->buf.n>4 
18860 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  || pWriter->bFir
18870 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a  stTermInPage );.
18880 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
18890 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69  rent leaf page i
188a0 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74  s full, flush it
188b0 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69   to disk. */.  i
188c0 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e  f( (pPage->buf.n
188d0 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e   + pPgidx->n + n
188e0 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43  Term + 2)>=p->pC
188f0 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
18900 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75     if( pPage->bu
18910 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66  f.n>4 ){.      f
18920 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
18930 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
18940 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66     }.    fts5Buf
18950 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
18960 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
18970 72 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50 41 44  rm+FTS5_DATA_PAD
18980 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  DING);.  }.  .  
18990 2f 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61 74 69  /* TODO1: Updati
189a0 6e 67 20 70 67 69 64 78 20 68 65 72 65 2e 20 2a  ng pgidx here. *
189b0 2f 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d  /.  pPgidx->n +=
189c0 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
189d0 61 72 69 6e 74 28 0a 20 20 20 20 20 20 26 70 50  arint(.      &pP
189e0 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e  gidx->p[pPgidx->
189f0 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  n], pPage->buf.n
18a00 20 2d 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50   - pPage->iPrevP
18a10 67 69 64 78 0a 20 20 29 3b 0a 20 20 70 50 61 67  gidx.  );.  pPag
18a20 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20  e->iPrevPgidx = 
18a30 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69  pPage->buf.n;.#i
18a40 66 20 30 0a 20 20 66 74 73 35 50 75 74 55 31 36  f 0.  fts5PutU16
18a50 28 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69  (&pPgidx->p[pPgi
18a60 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62  dx->n], pPage->b
18a70 75 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d  uf.n);.  pPgidx-
18a80 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a  >n += 2;.#endif.
18a90 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
18aa0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
18ab0 20 29 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20   ){.    nPrefix 
18ac0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
18ad0 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20  ge->pgno!=1 ){. 
18ae0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
18af0 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
18b00 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20 69 73  n a leaf that is
18b10 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73   not the leftmos
18b20 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20  t leaf in.      
18b30 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  ** the segment b
18b40 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -tree. In this c
18b50 61 73 65 20 69 74 20 69 73 20 6e 65 63 65 73 73  ase it is necess
18b60 61 72 79 20 74 6f 20 61 64 64 20 61 20 74 65 72  ary to add a ter
18b70 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  m to.      ** th
18b80 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  e b-tree hierarc
18b90 68 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6c  hy that is (a) l
18ba0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  arger than the l
18bb0 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20  argest term .   
18bc0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72     ** already wr
18bd0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67  itten to the seg
18be0 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61  ment and (b) sma
18bf0 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ller than or equ
18c00 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  al to.      ** t
18c10 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68  his term. In oth
18c20 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66  er words, a pref
18c30 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65  ix of (pTerm/nTe
18c40 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a  rm) that is one.
18c50 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f        ** byte lo
18c60 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f  nger than the lo
18c70 6e 67 65 73 74 20 70 72 65 66 69 78 20 28 70 54  ngest prefix (pT
18c80 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65  erm/nTerm) share
18c90 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20  s with the.     
18ca0 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72   ** previous ter
18cb0 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  m. .      **.   
18cc0 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74     ** Usually, t
18cd0 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  he previous term
18ce0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
18cf0 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68   pPage->term. Th
18d00 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20  e exception.    
18d10 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20    ** is if this 
18d20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
18d30 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20  m written in an 
18d40 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67  incremental-merg
18d50 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a  e step..      **
18d60 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
18d70 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  e previous term 
18d80 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
18d90 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20  , so just write 
18da0 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
18db0 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  of (pTerm/nTerm)
18dc0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
18dd0 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73   node. This is s
18de0 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a  lightly.      **
18df0 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75   inefficient, bu
18e00 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e  t still correct.
18e10 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
18e20 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20   = nTerm;.      
18e30 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e  if( pPage->term.
18e40 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d  n ){.        n =
18e50 20 31 20 2b 20 66 74 73 35 50 72 65 66 69 78 43   1 + fts5PrefixC
18e60 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74  ompress(pPage->t
18e70 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65  erm.n, pPage->te
18e80 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65  rm.p, nTerm, pTe
18e90 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
18ea0 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65     fts5WriteBtre
18eb0 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72  eTerm(p, pWriter
18ec0 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  , n, pTerm);.   
18ed0 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69     pPage = &pWri
18ee0 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20  ter->writer;.   
18ef0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
18f00 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35 50 72  nPrefix = fts5Pr
18f10 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61  efixCompress(pPa
18f20 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67  ge->term.n, pPag
18f30 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d  e->term.p, nTerm
18f40 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74  , pTerm);.    ft
18f50 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
18f60 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
18f70 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69  age->buf, nPrefi
18f80 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70  x);.  }..  /* Ap
18f90 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20  pend the number 
18fa0 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20  of bytes of new 
18fb0 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74  data, then the t
18fc0 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a  erm data itself.
18fd0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
18fe0 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
18ff0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
19000 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
19010 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
19020 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  ix);.  fts5Buffe
19030 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
19040 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
19050 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
19060 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78  , &pTerm[nPrefix
19070 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  ]);..  /* Update
19080 20 74 68 65 20 46 74 73 35 50 61 67 65 57 72 69   the Fts5PageWri
19090 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20  ter.term field. 
190a0 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  */.  fts5BufferS
190b0 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  et(&p->rc, &pPag
190c0 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  e->term, nTerm, 
190d0 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65  pTerm);.  pWrite
190e0 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
190f0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69  age = 0;..  pWri
19100 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
19110 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57  InPage = 0;.  pW
19120 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
19130 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b  idInDoclist = 1;
19140 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
19150 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e  c || (pWriter->n
19160 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74  Dlidx>0 && pWrit
19170 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
19180 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72  f.n==0) );.  pWr
19190 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
191a0 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
191b0 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  no;.}../*.** App
191c0 65 6e 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20  end a rowid and 
191d0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
191e0 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  ze field to the 
191f0 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
19200 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19210 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
19220 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
19230 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
19240 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
19250 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20  .  i64 iRowid,. 
19260 20 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20 20 69   int nPos.){.  i
19270 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19280 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50  _OK ){.    Fts5P
19290 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
192a0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
192b0 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 28 70  ter;..    if( (p
192c0 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50  Page->buf.n + pP
192d0 61 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70  age->pgidx.n)>=p
192e0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
192f0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
19300 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
19310 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  Writer);.    }..
19320 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
19330 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
19340 74 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20  t rowid written 
19350 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65 74  to the page, set
19360 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77   the .    ** row
19370 69 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  id-pointer in th
19380 65 20 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41  e page-header. A
19390 6c 73 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c  lso append a val
193a0 75 65 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a  ue to the dlidx.
193b0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69      ** buffer, i
193c0 6e 20 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74  n case a doclist
193d0 2d 69 6e 64 65 78 20 69 73 20 72 65 71 75 69 72  -index is requir
193e0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
193f0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
19400 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20  owidInPage ){.  
19410 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28 70      fts5PutU16(p
19420 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
19430 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20  ge->buf.n);.    
19440 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
19450 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65  Append(p, pWrite
19460 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r, iRowid);.    
19470 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  }..    /* Write 
19480 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20  the rowid. */.  
19490 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
194a0 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
194b0 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  ist || pWriter->
194c0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
194d0 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42  e ){.      fts5B
194e0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
194f0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
19500 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a  ->buf, iRowid);.
19510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19520 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
19530 7c 20 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72  | iRowid>pWriter
19540 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a  ->iPrevRowid );.
19550 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
19560 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
19570 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
19580 2c 20 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74  , iRowid - pWrit
19590 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b  er->iPrevRowid);
195a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74  .    }.    pWrit
195b0 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d  er->iPrevRowid =
195c0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72   iRowid;.    pWr
195d0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
195e0 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a  dInDoclist = 0;.
195f0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
19600 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
19610 20 30 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66   0;..    fts5Buf
19620 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19630 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
19640 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 7d 0a  buf, nPos);.  }.
19650 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
19660 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
19670 73 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73  slistData(.  Fts
19680 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
19690 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
196a0 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75  iter, .  const u
196b0 38 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74  8 *aData, .  int
196c0 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35   nData.){.  Fts5
196d0 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
196e0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  e = &pWriter->wr
196f0 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38  iter;.  const u8
19700 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69   *a = aData;.  i
19710 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nt n = nData;.  
19720 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
19730 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b  onfig->pgsz>0 );
19740 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
19750 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
19760 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e   && (pPage->buf.
19770 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n + pPage->pgidx
19780 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e  .n + n)>=p->pCon
19790 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a  fig->pgsz .  ){.
197a0 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70      int nReq = p
197b0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
197c0 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d  - pPage->buf.n -
197d0 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b   pPage->pgidx.n;
197e0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  .    int nCopy =
197f0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   0;.    while( n
19800 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20  Copy<nReq ){.   
19810 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20     i64 dummy;.  
19820 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73      nCopy += fts
19830 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43  5GetVarint(&a[nC
19840 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d  opy], (u64*)&dum
19850 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  my);.    }.    f
19860 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
19870 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
19880 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20  ge->buf, nCopy, 
19890 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f  a);.    a += nCo
198a0 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f  py;.    n -= nCo
198b0 70 79 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  py;.    fts5Writ
198c0 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57  eFlushLeaf(p, pW
198d0 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  riter);.  }.  if
198e0 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73  ( n>0 ){.    fts
198f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
19900 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
19910 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20  ->buf, n, a);.  
19920 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  }.}../*.** Flush
19930 20 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64   any data cached
19940 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f   by the writer o
19950 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74  bject to the dat
19960 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a  abase. Free any.
19970 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ** allocations a
19980 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
19990 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74  he writer..*/.st
199a0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
199b0 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73  iteFinish(.  Fts
199c0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
199d0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
199e0 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  iter,         /*
199f0 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
19a00 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20  /.  int *pnLeaf 
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
19a30 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73  er of leaf pages
19a40 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b   in b-tree */.){
19a50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35  .  int i;.  Fts5
19a60 50 61 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61  PageWriter *pLea
19a70 66 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  f = &pWriter->wr
19a80 69 74 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72  iter;.  if( p->r
19a90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19aa0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 61      assert( pLea
19ab0 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20  f->pgno>=1 );.  
19ac0 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66    if( pLeaf->buf
19ad0 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74  .n>4 ){.      ft
19ae0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
19af0 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
19b00 20 20 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20    }.    *pnLeaf 
19b10 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b  = pLeaf->pgno-1;
19b20 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c  .    fts5WriteFl
19b30 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69  ushBtree(p, pWri
19b40 74 65 72 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  ter);.  }.  fts5
19b50 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61  BufferFree(&pLea
19b60 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35  f->term);.  fts5
19b70 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61  BufferFree(&pLea
19b80 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  f->buf);.  fts5B
19b90 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
19ba0 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35  ->pgidx);.  fts5
19bb0 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69  BufferFree(&pWri
19bc0 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20  ter->btterm);.. 
19bd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69   for(i=0; i<pWri
19be0 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b  ter->nDlidx; i++
19bf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
19c00 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
19c10 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
19c20 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  .buf);.  }.  sql
19c30 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
19c40 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73  r->aDlidx);.}..s
19c50 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
19c60 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35  riteInit(.  Fts5
19c70 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
19c80 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
19c90 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67  ter, .  int iSeg
19ca0 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  id.){.  const in
19cb0 74 20 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70  t nBuffer = p->p
19cc0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46  Config->pgsz + F
19cd0 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
19ce0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69  ;..  memset(pWri
19cf0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
19d00 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a  ts5SegWriter));.
19d10 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69    pWriter->iSegi
19d20 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66  d = iSegid;..  f
19d30 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
19d40 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29  w(p, pWriter, 1)
19d50 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69  ;.  pWriter->wri
19d60 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ter.pgno = 1;.  
19d70 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
19d80 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
19d90 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
19da0 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 47 72 6f  e = 1;..  /* Gro
19db0 77 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72  w the two buffer
19dc0 73 20 74 6f 20 70 67 73 7a 20 2b 20 70 61 64 64  s to pgsz + padd
19dd0 69 6e 67 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ing bytes in siz
19de0 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  e. */.  fts5Buff
19df0 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26  erGrow(&p->rc, &
19e00 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
19e10 70 67 69 64 78 2c 20 6e 42 75 66 66 65 72 29 3b  pgidx, nBuffer);
19e20 0a 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f  .  fts5BufferGro
19e30 77 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  w(&p->rc, &pWrit
19e40 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c 20  er->writer.buf, 
19e50 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69 66 28  nBuffer);..  if(
19e60 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72 3d 3d   p->pIdxWriter==
19e70 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
19e80 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
19e90 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
19ea0 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
19eb0 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 57  tmt(p, &p->pIdxW
19ec0 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d  riter, sqlite3_m
19ed0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
19ee0 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27    "INSERT INTO '
19ef0 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73 65 67  %q'.'%q_idx'(seg
19f00 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41  id,term,pgno) VA
19f10 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20  LUES(?,?,?)", . 
19f20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
19f30 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
19f40 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
19f50 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
19f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19f70 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
19f80 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66 2d 70  he 4-byte leaf-p
19f90 61 67 65 20 68 65 61 64 65 72 20 74 6f 20 30 78  age header to 0x
19fa0 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  00. */.    memse
19fb0 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  t(pWriter->write
19fc0 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a  r.buf.p, 0, 4);.
19fd0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69      pWriter->wri
19fe0 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a  ter.buf.n = 4;..
19ff0 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20      /* Bind the 
1a000 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 73  current output s
1a010 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74 68 65  egment id to the
1a020 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e 20 54   index-writer. T
1a030 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  his is an.    **
1a040 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76   optimization ov
1a050 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20 73  er binding the s
1a060 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72 20 61  ame value over a
1a070 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77 73 20  nd over as rows 
1a080 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  are.    ** inser
1a090 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78 20 62  ted into %_idx b
1a0a0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 72  y the current wr
1a0b0 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71  iter.  */.    sq
1a0c0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1a0d0 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c  ->pIdxWriter, 1,
1a0e0 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1a0f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a100 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77  Iterator pIter w
1a110 61 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  as used to itera
1a120 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  te through the i
1a130 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66  nput segments of
1a140 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d   on an.** increm
1a150 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72  ental merge oper
1a160 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ation. This func
1a170 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69  tion is called i
1a180 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1a190 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20  l.** merge step 
1a1a0 68 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74  has finished but
1a1b0 20 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e   the input has n
1a1c0 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  ot been complete
1a1d0 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f  ly exhausted..*/
1a1e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a1f0 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74  5TrimSegments(Ft
1a200 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1a210 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1a220 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
1a230 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20  s5Buffer buf;.  
1a240 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
1a250 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1a260 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  r));.  for(i=0; 
1a270 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
1a280 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  ++){.    Fts5Seg
1a290 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
1a2a0 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
1a2b0 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67    if( pSeg->pSeg
1a2c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1a2d0 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c  no-op */.    }el
1a2e0 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65  se if( pSeg->pLe
1a2f0 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  af==0 ){.      /
1a300 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20  * All keys from 
1a310 74 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65  this input segme
1a320 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74 72 61  nt have been tra
1a330 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f  nsfered to the o
1a340 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20  utput..      ** 
1a350 53 65 74 20 62 6f 74 68 20 74 68 65 20 66 69 72  Set both the fir
1a360 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65  st and last page
1a370 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f  -numbers to 0 to
1a380 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1a390 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  he.      ** segm
1a3a0 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79  ent is now empty
1a3b0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d  . */.      pSeg-
1a3c0 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  >pSeg->pgnoLast 
1a3d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  = 0;.      pSeg-
1a3e0 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
1a3f0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1a400 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20  .      int iOff 
1a410 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61  = pSeg->iTermLea
1a420 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20  fOffset;     /* 
1a430 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69  Offset on new fi
1a440 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f  rst leaf page */
1a450 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66  .      i64 iLeaf
1a460 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73  Rowid;.      Fts
1a470 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20  5Data *pData;.  
1a480 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53      int iId = pS
1a490 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  eg->pSeg->iSegid
1a4a0 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b  ;.      u8 aHdr[
1a4b0 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30  4] = {0x00, 0x00
1a4c0 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a  , 0x00, 0x00};..
1a4d0 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64        iLeafRowid
1a4e0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1a4f0 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d  ROWID(iId, pSeg-
1a500 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b  >iTermLeafPgno);
1a510 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66  .      pData = f
1a520 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
1a530 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20  LeafRowid);.    
1a540 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20    if( pData ){. 
1a550 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1a560 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20  rZero(&buf);.   
1a570 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47       fts5BufferG
1a580 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  row(&p->rc, &buf
1a590 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20  , pData->nn);.  
1a5a0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1a5b0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1a5c0 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28  c, &buf, sizeof(
1a5d0 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20  aHdr), aHdr);.  
1a5e0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1a5f0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1a600 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
1a610 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
1a620 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1a630 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1a640 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  buf, pSeg->term.
1a650 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29  n, pSeg->term.p)
1a660 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1a670 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1a680 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61  p->rc, &buf, pDa
1a690 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c  ta->szLeaf-iOff,
1a6a0 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d   &pData->p[iOff]
1a6b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1a6c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a6d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1a6e0 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66  Set the szLeaf f
1a6f0 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ield */.        
1a700 20 20 66 74 73 35 50 75 74 55 31 36 28 26 62 75    fts5PutU16(&bu
1a710 66 2e 70 5b 32 5d 2c 20 62 75 66 2e 6e 29 3b 0a  f.p[2], buf.n);.
1a720 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1a730 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65     /* Set up the
1a740 20 6e 65 77 20 70 61 67 65 2d 69 6e 64 65 78 20   new page-index 
1a750 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 20  array */.       
1a760 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1a770 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1a780 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20  &buf, 4);.      
1a790 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61    if( pSeg->iLea
1a7a0 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54 65  fPgno==pSeg->iTe
1a7b0 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 20  rmLeafPgno .    
1a7c0 20 20 20 20 20 26 26 20 70 53 65 67 2d 3e 69 45       && pSeg->iE
1a7d0 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44 61 74  ndofDoclist<pDat
1a7e0 61 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20 20  a->szLeaf .     
1a7f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1a800 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61 74  int nDiff = pDat
1a810 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67  a->szLeaf - pSeg
1a820 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b  ->iEndofDoclist;
1a830 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
1a840 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1a850 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
1a860 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44 69 66  buf.n - 1 - nDif
1a870 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20 20  f - 4);.        
1a880 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1a890 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1a8a0 62 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20  buf, .          
1a8b0 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 2d 20      pData->nn - 
1a8c0 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 2c  pSeg->iPgidxOff,
1a8d0 20 26 70 44 61 74 61 2d 3e 70 5b 70 53 65 67 2d   &pData->p[pSeg-
1a8e0 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20 20 20 20  >iPgidxOff].    
1a8f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1a900 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35   }..        fts5
1a910 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
1a920 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67  a);.        pSeg
1a930 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
1a940 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  t = pSeg->iTermL
1a950 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20  eafPgno;.       
1a960 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
1a970 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
1a980 52 4f 57 49 44 28 69 49 64 2c 20 31 29 2c 20 69  ROWID(iId, 1), i
1a990 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20  LeafRowid);.    
1a9a0 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
1a9b0 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c  e(p, iLeafRowid,
1a9c0 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a   buf.p, buf.n);.
1a9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a9e0 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
1a9f0 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61  ee(&buf);.}..sta
1aa00 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
1aa10 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28  geChunkCallback(
1aa20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1aa30 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20   .  void *pCtx, 
1aa40 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68  .  const u8 *pCh
1aa50 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a  unk, int nChunk.
1aa60 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  ){.  Fts5SegWrit
1aa70 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 28 46  er *pWriter = (F
1aa80 74 73 35 53 65 67 57 72 69 74 65 72 2a 29 70 43  ts5SegWriter*)pC
1aa90 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74 65 41  tx;.  fts5WriteA
1aaa0 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61  ppendPoslistData
1aab0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43 68  (p, pWriter, pCh
1aac0 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a  unk, nChunk);.}.
1aad0 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
1aae0 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d   void fts5IndexM
1aaf0 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73  ergeLevel(.  Fts
1ab00 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1ab30 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
1ab40 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1ab50 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
1ab60 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66 20  UT: Stucture of 
1ab70 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
1ab80 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
1ab90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
1aba0 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75  vel to read inpu
1abb0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
1abc0 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20  *pnRem          
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1abe0 72 69 74 65 20 75 70 20 74 6f 20 74 68 69 73 20  rite up to this 
1abf0 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76  many output leav
1ac00 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  es */.){.  Fts5S
1ac10 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1ac20 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1ac30 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
1ac40 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
1ac50 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1ac60 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  l];.  Fts5Struct
1ac70 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75  ureLevel *pLvlOu
1ac80 74 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  t;.  Fts5IndexIt
1ac90 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20  er *pIter = 0;  
1aca0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
1acb0 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64   to read input d
1acc0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ata */.  int nRe
1acd0 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52  m = pnRem ? *pnR
1ace0 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70  em : 0;  /* Outp
1acf0 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  ut leaf pages le
1ad00 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  ft to write */. 
1ad10 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20   int nInput;    
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
1ad40 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
1ad50 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1ad60 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  writer;         
1ad70 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
1ad80 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
1ad90 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
1ada0 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  eg;     /* Outpu
1adb0 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  t segment */.  F
1adc0 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a  ts5Buffer term;.
1add0 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20    int bOldest;  
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1ae00 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
1ae10 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f  is the oldest */
1ae20 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c  ..  assert( iLvl
1ae30 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1ae40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1ae50 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c  vl->nMerge<=pLvl
1ae60 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d  ->nSeg );..  mem
1ae70 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20  set(&writer, 0, 
1ae80 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72  sizeof(Fts5SegWr
1ae90 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  iter));.  memset
1aea0 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&term, 0, sizeo
1aeb0 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
1aec0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
1aed0 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75  ge ){.    pLvlOu
1aee0 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
1aef0 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20  evel[iLvl+1];.  
1af00 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75    assert( pLvlOu
1af10 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20  t->nSeg>0 );.   
1af20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e   nInput = pLvl->
1af30 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53 65 67  nMerge;.    pSeg
1af40 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
1af50 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d  g[pLvlOut->nSeg-
1af60 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  1];..    fts5Wri
1af70 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
1af80 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29  r, pSeg->iSegid)
1af90 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77 72 69  ;.    writer.wri
1afa0 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d  ter.pgno = pSeg-
1afb0 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20  >pgnoLast+1;.   
1afc0 20 77 72 69 74 65 72 2e 69 42 74 50 61 67 65 20   writer.iBtPage 
1afd0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1afe0 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66    int iSegid = f
1aff0 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
1b000 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20  (p, pStruct);.. 
1b010 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65     /* Extend the
1b020 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
1b030 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72 65  bject as require
1b040 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  d to ensure the 
1b050 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65  output.    ** se
1b060 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f  gment exists. */
1b070 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70  .    if( iLvl==p
1b080 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31  Struct->nLevel-1
1b090 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
1b0a0 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28  ructureAddLevel(
1b0b0 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74  &p->rc, ppStruct
1b0c0 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
1b0d0 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
1b0e0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
1b0f0 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
1b100 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
1b110 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b  , iLvl+1, 1, 0);
1b120 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
1b130 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76   return;.    pLv
1b140 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
1b150 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
1b160 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75  pLvlOut = &pStru
1b170 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b  ct->aLevel[iLvl+
1b180 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  1];..    fts5Wri
1b190 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
1b1a0 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  r, iSegid);..   
1b1b0 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
1b1c0 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f  segment to the o
1b1d0 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  utput level */. 
1b1e0 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
1b1f0 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
1b200 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76  ->nSeg];.    pLv
1b210 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20  lOut->nSeg++;.  
1b220 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
1b230 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d  t = 1;.    pSeg-
1b240 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1b250 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  ;.    pStruct->n
1b260 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20  Segment++;..    
1b270 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72  /* Read input fr
1b280 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  om all segments 
1b290 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76  in the input lev
1b2a0 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74  el */.    nInput
1b2b0 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20   = pLvl->nSeg;. 
1b2c0 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28   }.  bOldest = (
1b2d0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31  pLvlOut->nSeg==1
1b2e0 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   && pStruct->nLe
1b2f0 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20  vel==iLvl+2);.. 
1b300 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30   assert( iLvl>=0
1b310 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   );.  for(fts5Mu
1b320 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
1b330 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c 20  truct, 0, 0, 0, 
1b340 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c  0, iLvl, nInput,
1b350 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20   &pIter);.      
1b360 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1b370 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20  (p, pIter)==0;. 
1b380 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1b390 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
1b3a0 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20   0, 0).  ){.    
1b3b0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
1b3c0 67 49 74 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  gIter = &pIter->
1b3d0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
1b3e0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
1b3f0 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20  .    int nPos;  
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b410 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c     /* position-l
1b420 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 76  ist size field v
1b430 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alue */.    int 
1b440 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74  nTerm;.    const
1b450 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20   u8 *pTerm;..   
1b460 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b 65   /* Check for ke
1b470 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20  y annihilation. 
1b480 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67 49  */.    if( pSegI
1b490 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20  ter->nPos==0 && 
1b4a0 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67  (bOldest || pSeg
1b4b0 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20 29  Iter->bDel==0) )
1b4c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
1b4d0 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74  pTerm = fts5Mult
1b4e0 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c  iIterTerm(pIter,
1b4f0 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66   &nTerm);.    if
1b500 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20  ( nTerm!=term.n 
1b510 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c  || memcmp(pTerm,
1b520 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20   term.p, nTerm) 
1b530 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 6e 52  ){.      if( pnR
1b540 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65  em && writer.nLe
1b550 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29  afWritten>nRem )
1b560 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1b570 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1b580 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65 77  /* This is a new
1b590 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61 20   term. Append a 
1b5a0 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74 70  term to the outp
1b5b0 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  ut segment. */. 
1b5c0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
1b5d0 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
1b5e0 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
1b5f0 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  m);.      fts5Bu
1b600 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1b610 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54  &term, nTerm, pT
1b620 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  erm);.    }..   
1b630 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72   /* Append the r
1b640 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70  owid to the outp
1b650 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49  ut */.    /* WRI
1b660 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
1b670 0a 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67  .    nPos = pSeg
1b680 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70  Iter->nPos*2 + p
1b690 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20  SegIter->bDel;. 
1b6a0 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
1b6b0 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74  ndRowid(p, &writ
1b6c0 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  er, fts5MultiIte
1b6d0 72 52 6f 77 69 64 28 70 49 74 65 72 29 2c 20 6e  rRowid(pIter), n
1b6e0 50 6f 73 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  Pos);..    /* Ap
1b6f0 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74 69 6f  pend the positio
1b700 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f 20 74  n-list data to t
1b710 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
1b720 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
1b730 65 28 70 2c 20 70 53 65 67 49 74 65 72 2c 20 28  e(p, pSegIter, (
1b740 76 6f 69 64 2a 29 26 77 72 69 74 65 72 2c 20 66  void*)&writer, f
1b750 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c  ts5MergeChunkCal
1b760 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lback);.  }..  /
1b770 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74  * Flush the last
1b780 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64 69   leaf page to di
1b790 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70  sk. Set the outp
1b7a0 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ut segment b-tre
1b7b0 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e  e height.  ** an
1b7c0 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65  d last leaf page
1b7d0 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20 73   number at the s
1b7e0 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20  ame time.  */.  
1b7f0 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
1b800 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53 65  p, &writer, &pSe
1b810 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20  g->pgnoLast);.. 
1b820 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74   if( fts5MultiIt
1b830 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20  erEof(p, pIter) 
1b840 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ){.    int i;.. 
1b850 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
1b860 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65   redundant segme
1b870 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  nts from the %_d
1b880 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ata table */.   
1b890 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70   for(i=0; i<nInp
1b8a0 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ut; i++){.      
1b8b0 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
1b8c0 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e 61  gment(p, pLvl->a
1b8d0 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a  Seg[i].iSegid);.
1b8e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1b8f0 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
1b900 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nt segments from
1b910 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
1b920 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c   */.    if( pLvl
1b930 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29  ->nSeg!=nInput )
1b940 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76  {.      int nMov
1b950 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20  e = (pLvl->nSeg 
1b960 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65  - nInput) * size
1b970 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
1b980 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Segment);.      
1b990 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53  memmove(pLvl->aS
1b9a0 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  eg, &pLvl->aSeg[
1b9b0 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b  nInput], nMove);
1b9c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 75  .    }.    pStru
1b9d0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20  ct->nSegment -= 
1b9e0 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c  nInput;.    pLvl
1b9f0 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74  ->nSeg -= nInput
1ba00 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72  ;.    pLvl->nMer
1ba10 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ge = 0;.    if( 
1ba20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d  pSeg->pgnoLast==
1ba30 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f  0 ){.      pLvlO
1ba40 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20  ut->nSeg--;.    
1ba50 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d    pStruct->nSegm
1ba60 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ent--;.    }.  }
1ba70 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1ba80 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ( pSeg->pgnoLast
1ba90 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72  >0 );.    fts5Tr
1baa0 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49  imSegments(p, pI
1bab0 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  ter);.    pLvl->
1bac0 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b  nMerge = nInput;
1bad0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74  .  }..  fts5Mult
1bae0 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 49 74  iIterFree(p, pIt
1baf0 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  er);.  fts5Buffe
1bb00 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
1bb10 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52  if( pnRem ) *pnR
1bb20 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65  em -= writer.nLe
1bb30 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a  afWritten;.}../*
1bb40 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50 67  .** Do up to nPg
1bb50 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d 65   pages of autome
1bb60 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65 20  rge work on the 
1bb70 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
1bb80 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d   void fts5IndexM
1bb90 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erge(.  Fts5Inde
1bba0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
1bbb0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
1bbc0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
1bbd0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
1bbe0 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20  e **ppStruct,   
1bbf0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
1bc00 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65  urrent structure
1bc10 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
1bc20 6e 74 20 6e 50 67 20 20 20 20 20 20 20 20 20 20  nt nPg          
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc40 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b 20  * Pages of work 
1bc50 74 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e  to do */.){.  in
1bc60 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20 20  t nRem = nPg;.  
1bc70 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1bc80 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1bc90 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52 65  ct;.  while( nRe
1bca0 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  m>0 && p->rc==SQ
1bcb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1bcc0 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
1bcd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
1bce0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1bcf0 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69   levels */.    i
1bd00 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b  nt iBestLvl = 0;
1bd10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
1bd20 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68 65  vel offering the
1bd30 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67 6d   most input segm
1bd40 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
1bd50 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  nBest = 0;      
1bd60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1bd70 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
1bd80 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76 65  nts on best leve
1bd90 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  l */..    /* Set
1bda0 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68 65   iBestLvl to the
1bdb0 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69   level to read i
1bdc0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66 72  nput segments fr
1bdd0 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  om. */.    asser
1bde0 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  t( pStruct->nLev
1bdf0 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  el>0 );.    for(
1be00 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
1be10 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
1be20 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  vl++){.      Fts
1be30 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
1be40 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
1be50 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
1be60 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
1be70 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20  nMerge ){.      
1be80 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
1be90 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  ge>nBest ){.    
1bea0 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d        iBestLvl =
1beb0 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20   iLvl;.         
1bec0 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e   nBest = pLvl->n
1bed0 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  Merge;.        }
1bee0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1bef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1bf00 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65  ( pLvl->nSeg>nBe
1bf10 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42  st ){.        nB
1bf20 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  est = pLvl->nSeg
1bf30 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74 4c  ;.        iBestL
1bf40 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  vl = iLvl;.     
1bf50 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1bf60 20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74 69   If nBest is sti
1bf70 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20 69  ll 0, then the i
1bf80 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d 70  ndex must be emp
1bf90 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ty. */.#ifdef SQ
1bfa0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66  LITE_DEBUG.    f
1bfb0 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74  or(iLvl=0; nBest
1bfc0 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72  ==0 && iLvl<pStr
1bfd0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
1bfe0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  l++){.      asse
1bff0 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  rt( pStruct->aLe
1c000 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d  vel[iLvl].nSeg==
1c010 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  0 );.    }.#endi
1c020 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73 74  f..    if( nBest
1c030 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75  <p->pConfig->nAu
1c040 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20 20 20  tomerge .       
1c050 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
1c060 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d  vel[iBestLvl].nM
1c070 65 72 67 65 3d 3d 30 20 0a 20 20 20 20 20 20 29  erge==0 .      )
1c080 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1c090 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e 64     }.    fts5Ind
1c0a0 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
1c0b0 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c  &pStruct, iBestL
1c0c0 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
1c0d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1c0e0 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d  E_OK && pStruct-
1c0f0 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c  >aLevel[iBestLvl
1c100 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ].nMerge==0 ){. 
1c110 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
1c120 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65  rePromote(p, iBe
1c130 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74  stLvl+1, pStruct
1c140 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
1c150 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
1c160 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74  ct;.}../*.** A t
1c170 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65  otal of nLeaf le
1c180 61 66 20 70 61 67 65 73 20 6f 66 20 64 61 74 61  af pages of data
1c190 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66   has just been f
1c1a0 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65  lushed to a leve
1c1b0 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20  l-0.** segment. 
1c1c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70  This function up
1c1d0 64 61 74 65 73 20 74 68 65 20 77 72 69 74 65 2d  dates the write-
1c1e0 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e  counter accordin
1c1f0 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e  gly and, if.** n
1c200 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72  ecessary, perfor
1c210 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  ms incremental m
1c220 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a  erge work..**.**
1c230 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1c240 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
1c250 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
1c260 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
1c270 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
1c280 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1c290 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1c2a0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1c2b0 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41 75  void fts5IndexAu
1c2c0 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49  tomerge(.  Fts5I
1c2d0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1c2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1c2f0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1c300 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
1c310 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c  ture **ppStruct,
1c320 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
1c330 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74  : Current struct
1c340 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
1c350 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20    int nLeaf     
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1c380 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73  utput leaves jus
1c390 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a  t written */.){.
1c3a0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c3b0 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f  ITE_OK && p->pCo
1c3c0 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
1c3d0 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  >0 ){.    Fts5St
1c3e0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
1c3f0 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
1c400 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20 20    u64 nWrite;   
1c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c420 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
1c430 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65   of write-counte
1c440 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f  r */.    int nWo
1c450 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
1c460 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c470 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20   of work-quanta 
1c480 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20  to perform */.  
1c490 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20    int nRem;     
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
1c4c0 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20  f pages left to 
1c4d0 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  write */..    /*
1c4e0 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69 74   Update the writ
1c4f0 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65  e-counter. While
1c500 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e   doing so, set n
1c510 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72  Work. */.    nWr
1c520 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  ite = pStruct->n
1c530 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20  WriteCounter;.  
1c540 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29 28    nWork = (int)(
1c550 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66  ((nWrite + nLeaf
1c560 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  ) / p->nWorkUnit
1c570 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d  ) - (nWrite / p-
1c580 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20 20  >nWorkUnit));.  
1c590 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74    pStruct->nWrit
1c5a0 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61  eCounter += nLea
1c5b0 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28 69  f;.    nRem = (i
1c5c0 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  nt)(p->nWorkUnit
1c5d0 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75   * nWork * pStru
1c5e0 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20 20  ct->nLevel);..  
1c5f0 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
1c600 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e 52  (p, ppStruct, nR
1c610 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  em);.  }.}..stat
1c620 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1c630 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a 20 20  xCrisismerge(.  
1c640 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c660 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1c670 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
1c680 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
1c690 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49  ruct        /* I
1c6a0 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
1c6b0 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
1c6c0 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  x */.){.  const 
1c6d0 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20 70 2d  int nCrisis = p-
1c6e0 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69  >pConfig->nCrisi
1c6f0 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35 53 74  sMerge;.  Fts5St
1c700 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
1c710 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
1c720 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20  int iLvl = 0;.. 
1c730 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
1c740 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
1c750 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29  ruct->nLevel>0 )
1c760 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
1c770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1c780 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1c790 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73  Lvl].nSeg>=nCris
1c7a0 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  is ){.    fts5In
1c7b0 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
1c7c0 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c   &pStruct, iLvl,
1c7d0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1c7e0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1c7f0 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  K || pStruct->nL
1c800 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b  evel>(iLvl+1) );
1c810 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1c820 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76  rePromote(p, iLv
1c830 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  l+1, pStruct);. 
1c840 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20     iLvl++;.  }. 
1c850 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
1c860 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ruct;.}..static 
1c870 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65 74  int fts5IndexRet
1c880 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70  urn(Fts5Index *p
1c890 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  ){.  int rc = p-
1c8a0 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  >rc;.  p->rc = S
1c8b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75  QLITE_OK;.  retu
1c8c0 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65  rn rc;.}..typede
1c8d0 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  f struct Fts5Flu
1c8e0 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68 43  shCtx Fts5FlushC
1c8f0 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46  tx;.struct Fts5F
1c900 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35  lushCtx {.  Fts5
1c910 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46  Index *pIdx;.  F
1c920 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
1c930 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ter; .};../*.** 
1c940 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f  Buffer aBuf[] co
1c950 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66  ntains a list of
1c960 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d   varints, all sm
1c970 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69  all enough to fi
1c980 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74  t.** in a 32-bit
1c990 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e   integer. Return
1c9a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1c9b0 20 6c 61 72 67 65 73 74 20 70 72 65 66 69 78 20   largest prefix 
1c9c0 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74  of this .** list
1c9d0 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c   nMax bytes or l
1c9e0 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  ess in size..*/.
1c9f0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
1ca00 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e  oslistPrefix(con
1ca10 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74  st u8 *aBuf, int
1ca20 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65   nMax){.  int re
1ca30 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  t;.  u32 dummy;.
1ca40 20 20 72 65 74 20 3d 20 66 74 73 35 47 65 74 56    ret = fts5GetV
1ca50 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75  arint32(aBuf, du
1ca60 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 65 74 3c  mmy);.  if( ret<
1ca70 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77 68 69 6c  nMax ){.    whil
1ca80 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  e( 1 ){.      in
1ca90 74 20 69 20 3d 20 66 74 73 35 47 65 74 56 61 72  t i = fts5GetVar
1caa0 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d  int32(&aBuf[ret]
1cab0 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
1cac0 69 66 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20  if( (ret + i) > 
1cad0 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20  nMax ) break;.  
1cae0 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20      ret += i;.  
1caf0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1cb00 20 72 65 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65   ret;.}..#define
1cb10 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
1cb20 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
1cb30 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20  pBlob, nBlob) { 
1cb40 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20      \.  assert( 
1cb50 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d  (pBuf)->nSpace>=
1cb60 28 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62  ((pBuf)->n+nBlob
1cb70 29 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ) );            
1cb80 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42   \.  memcpy(&(pB
1cb90 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e  uf)->p[(pBuf)->n
1cba0 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29  ], pBlob, nBlob)
1cbb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  ;             \.
1cbc0 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e    (pBuf)->n += n
1cbd0 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbf0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
1cc00 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66  #define fts5Buff
1cc10 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
1cc20 6e 74 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b  nt(pBuf, iVal) {
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d  \.  (pBuf)->n +=
1cc50 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
1cc60 61 72 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70  arint(&(pBuf)->p
1cc70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56  [(pBuf)->n], (iV
1cc80 61 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72  al));  \.  asser
1cc90 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63  t( (pBuf)->nSpac
1cca0 65 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20  e>=(pBuf)->n ); 
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a           \.}../*
1ccd0 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
1cce0 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d  ntents of in-mem
1ccf0 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69  ory hash table i
1cd00 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65  Hash to a new le
1cd10 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e  vel-0 .** segmen
1cd20 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20  t on disk. Also 
1cd30 75 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65  update the corre
1cd40 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75  sponding structu
1cd50 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  re record..**.**
1cd60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1cd70 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
1cd80 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
1cd90 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
1cda0 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
1cdb0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1cdc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1cdd0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1cde0 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e  void fts5FlushOn
1cdf0 65 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20  eHash(Fts5Index 
1ce00 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73 68 20  *p){.  Fts5Hash 
1ce10 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73  *pHash = p->pHas
1ce20 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  h;.  Fts5Structu
1ce30 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69  re *pStruct;.  i
1ce40 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74  nt iSegid;.  int
1ce50 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20   pgnoLast = 0;  
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce70 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
1ce80 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
1ce90 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  nt */..  /* Obta
1cea0 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
1ceb0 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  o the index stru
1cec0 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61  cture and alloca
1ced0 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74  te a new segment
1cee0 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  -id.  ** for the
1cef0 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67   new level-0 seg
1cf00 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72  ment.  */.  pStr
1cf10 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1cf20 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 53  ureRead(p);.  iS
1cf30 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63  egid = fts5Alloc
1cf40 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72  ateSegid(p, pStr
1cf50 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  uct);..  if( iSe
1cf60 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  gid ){.    const
1cf70 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70   int pgsz = p->p
1cf80 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 0a 20  Config->pgsz;.. 
1cf90 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1cfa0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
1cfb0 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20   /* New segment 
1cfc0 77 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a  within pStruct *
1cfd0 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
1cfe0 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20   *pBuf;         
1cff0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
1d000 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
1d010 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  le leaf page */.
1d020 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a      Fts5Buffer *
1d030 70 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20  pPgidx;         
1d040 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77    /* Buffer in w
1d050 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65  hich to assemble
1d060 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46   pgidx */..    F
1d070 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
1d080 74 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69  ter;.    fts5Wri
1d090 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
1d0a0 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  r, iSegid);..   
1d0b0 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e   pBuf = &writer.
1d0c0 77 72 69 74 65 72 2e 62 75 66 3b 0a 20 20 20 20  writer.buf;.    
1d0d0 70 50 67 69 64 78 20 3d 20 26 77 72 69 74 65 72  pPgidx = &writer
1d0e0 2e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a  .writer.pgidx;..
1d0f0 20 20 20 20 2f 2a 20 66 74 73 35 57 72 69 74 65      /* fts5Write
1d100 49 6e 69 74 28 29 20 73 68 6f 75 6c 64 20 68 61  Init() should ha
1d110 76 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ve initialized t
1d120 68 65 20 62 75 66 66 65 72 73 20 74 6f 20 28 6d  he buffers to (m
1d130 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20  ost likely).    
1d140 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  ** the maximum s
1d150 70 61 63 65 20 72 65 71 75 69 72 65 64 2e 20 2a  pace required. *
1d160 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
1d170 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70  >rc || pBuf->nSp
1d180 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53  ace>=(pgsz + FTS
1d190 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20  5_DATA_PADDING) 
1d1a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1d1b0 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e  ->rc || pPgidx->
1d1c0 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20  nSpace>=(pgsz + 
1d1d0 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
1d1e0 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  G) );..    /* Be
1d1f0 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  gin scanning thr
1d200 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20  ough hash table 
1d210 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f  entries. This lo
1d220 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
1d230 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72   each.    ** ter
1d240 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e  m/doclist curren
1d250 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69  tly stored withi
1d260 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
1d270 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1d280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d290 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
1d2a0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
1d2b0 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c  anInit(pHash, 0,
1d2c0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77   0);.    }.    w
1d2d0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1d2e0 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
1d2f0 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
1d300 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20  Eof(pHash) ){.  
1d310 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1d320 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  zTerm;          
1d330 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
1d340 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ning term */.   
1d350 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f     const u8 *pDo
1d360 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f  clist;         /
1d370 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  * Pointer to doc
1d380 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65  list for this te
1d390 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rm */.      int 
1d3a0 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
1d3b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1d3c0 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79  of doclist in by
1d3d0 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  tes */..      /*
1d3e0 20 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20   Write the term 
1d3f0 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 74  for this entry t
1d400 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20  o disk. */.     
1d410 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1d420 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c  ScanEntry(pHash,
1d430 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69   &zTerm, &pDocli
1d440 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a  st, &nDoclist);.
1d450 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
1d460 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72  ppendTerm(p, &wr
1d470 69 74 65 72 2c 20 28 69 6e 74 29 73 74 72 6c 65  iter, (int)strle
1d480 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74  n(zTerm), (const
1d490 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20   u8*)zTerm);..  
1d4a0 20 20 20 20 61 73 73 65 72 74 28 20 77 72 69 74      assert( writ
1d4b0 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
1d4c0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
1d4d0 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66   if( pgsz>=(pBuf
1d4e0 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20  ->n + pPgidx->n 
1d4f0 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20  + nDoclist + 1) 
1d500 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1d510 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
1d520 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
1d530 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a   current leaf. *
1d540 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
1d550 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1d560 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73  ob(pBuf, pDoclis
1d570 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  t, nDoclist);.  
1d580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d590 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1d5a0 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  0;.        i64 i
1d5b0 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  Delta = 0;.     
1d5c0 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
1d5d0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
1d5e0 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
1d5f0 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
1d600 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66  this leaf. The f
1d610 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20  ollowing .      
1d620 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74    ** loop iterat
1d630 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  es through the p
1d640 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b  oslists that mak
1d650 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74  e up the current
1d660 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63   .        ** doc
1d670 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  list.  */.      
1d680 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1d690 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66  SQLITE_OK && iOf
1d6a0 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  f<nDoclist ){.  
1d6b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73          int nPos
1d6c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
1d6d0 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  nCopy;.         
1d6e0 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
1d6f0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
1d700 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
1d710 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75  oclist[iOff], (u
1d720 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
1d730 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20          nCopy = 
1d740 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
1d750 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  ze(&pDoclist[iOf
1d760 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  f], &nPos, &bDum
1d770 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  my);.          n
1d780 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20  Copy += nPos;.  
1d790 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b          iRowid +
1d7a0 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
1d7b0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69      .          i
1d7c0 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
1d7d0 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
1d7e0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50             fts5P
1d7f0 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30  utU16(&pBuf->p[0
1d800 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f  ], pBuf->n);   /
1d810 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  * first rowid on
1d820 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
1d830 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20       pBuf->n += 
1d840 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
1d850 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  rint(&pBuf->p[pB
1d860 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b  uf->n], iRowid);
1d870 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69  .            wri
1d880 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49  ter.bFirstRowidI
1d890 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
1d8a0 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1d8b0 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 26  DlidxAppend(p, &
1d8c0 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b  writer, iRowid);
1d8d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1d8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
1d8f0 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  uf->n += sqlite3
1d900 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70  Fts5PutVarint(&p
1d910 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c  Buf->p[pBuf->n],
1d920 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20   iDelta);.      
1d930 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d940 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c  assert( pBuf->n<
1d950 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b  =pBuf->nSpace );
1d960 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
1d970 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64  (pBuf->n + pPgid
1d980 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d  x->n + nCopy) <=
1d990 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20   pgsz ){.       
1d9a0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
1d9b0 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20  re poslist will 
1d9c0 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  fit on the curre
1d9d0 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79  nt leaf. So copy
1d9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1d9f0 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f  it in one go. */
1da00 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1da10 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1da20 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f  dBlob(pBuf, &pDo
1da30 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f  clist[iOff], nCo
1da40 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  py);.          }
1da50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1da60 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
1da70 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74  poslist will not
1da80 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61   fit on this lea
1da90 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73 0a 20  f. So it needs. 
1daa0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f             ** to
1dab0 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20   be broken into 
1dac0 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  sections. The on
1dad0 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e  ly qualification
1dae0 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20   being.         
1daf0 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20     ** that each 
1db00 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73  varint must be s
1db10 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73  tored contiguous
1db20 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ly.  */.        
1db30 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50      const u8 *pP
1db40 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69  oslist = &pDocli
1db50 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  st[iOff];.      
1db60 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d        int iPos =
1db70 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1db80 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1db90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dba0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70           int nSp
1dbb0 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75  ace = pgsz - pBu
1dbc0 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e  f->n - pPgidx->n
1dbd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dbe0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
1dbf0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 43           if( (nC
1dc00 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70  opy - iPos)<=nSp
1dc10 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ace ){.         
1dc20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79         n = nCopy
1dc30 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20   - iPos;.       
1dc40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
1dc60 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65  = fts5PoslistPre
1dc70 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50  fix(&pPoslist[iP
1dc80 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20  os], nSpace);.  
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1dcb0 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20  rt( n>0 );.     
1dcc0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1dcd0 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1dce0 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73  b(pBuf, &pPoslis
1dcf0 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20  t[iPos], n);.   
1dd00 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20             iPos 
1dd10 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  += n;.          
1dd20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
1dd30 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70   + pPgidx->n)>=p
1dd40 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
1dd50 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1dd60 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72  FlushLeaf(p, &wr
1dd70 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  iter);.         
1dd80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1dd90 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e       if( iPos>=n
1dda0 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20  Copy ) break;.  
1ddb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ddc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ddd0 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b    iOff += nCopy;
1dde0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ddf0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   }..      /* TOD
1de00 4f 32 3a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d  O2: Doclist term
1de10 69 6e 61 74 6f 72 20 77 72 69 74 74 65 6e 20 68  inator written h
1de20 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  ere. */.      /*
1de30 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e   pBuf->p[pBuf->n
1de40 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20  ++] = '\0'; */. 
1de50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75       assert( pBu
1de60 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61  f->n<=pBuf->nSpa
1de70 63 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ce );.      sqli
1de80 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e  te3Fts5HashScanN
1de90 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20 20 20  ext(pHash);.    
1dea0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
1deb0 35 48 61 73 68 43 6c 65 61 72 28 70 48 61 73 68  5HashClear(pHash
1dec0 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  );.    fts5Write
1ded0 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65  Finish(p, &write
1dee0 72 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  r, &pgnoLast);..
1def0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1df00 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
1df10 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20 62   It is written b
1df20 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
1df30 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a  ase by the.    *
1df40 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  * fts5StructureR
1df50 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65  elease() call be
1df60 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  low.  */.    if(
1df70 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1df80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
1df90 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
1dfa0 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72  el(&p->rc, &pStr
1dfb0 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uct);.    }.    
1dfc0 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
1dfd0 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
1dfe0 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20   pStruct, 0, 1, 
1dff0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  0);.    if( p->r
1e000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e010 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 53        pSeg = &pS
1e020 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
1e030 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e  .aSeg[ pStruct->
1e040 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b  aLevel[0].nSeg++
1e050 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   ];.      pSeg->
1e060 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
1e070 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
1e080 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
1e090 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74    pSeg->pgnoLast
1e0a0 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
1e0b0 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1e0c0 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ment++;.    }.  
1e0d0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
1e0e0 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74  romote(p, 0, pSt
1e0f0 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74  ruct);.  }..  ft
1e100 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65  s5IndexAutomerge
1e110 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67  (p, &pStruct, pg
1e120 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 49  noLast);.  fts5I
1e130 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28  ndexCrisismerge(
1e140 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20  p, &pStruct);.  
1e150 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
1e160 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  te(p, pStruct);.
1e170 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
1e180 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
1e190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
1e1a0 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20  any data stored 
1e1b0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
1e1c0 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20   hash tables to 
1e1d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1e1e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1e1f0 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35  5IndexFlush(Fts5
1e200 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a 20  Index *p){.  /* 
1e210 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d 70  Unless it is emp
1e220 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68 61  ty, flush the ha
1e230 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
1e240 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 65   */.  if( p->nPe
1e250 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20  ndingData ){.   
1e260 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73   assert( p->pHas
1e270 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e  h );.    p->nPen
1e280 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20  dingData = 0;.  
1e290 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61    fts5FlushOneHa
1e2a0 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69  sh(p);.  }.}...i
1e2b0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
1e2c0 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73 35  dexOptimize(Fts5
1e2d0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
1e2e0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1e2f0 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63  uct;.  Fts5Struc
1e300 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  ture *pNew = 0;.
1e310 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 0a    int nSeg = 0;.
1e320 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1e330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1e340 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
1e350 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  p);.  pStruct = 
1e360 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
1e370 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74  d(p);..  if( pSt
1e380 72 75 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  ruct ){.    asse
1e390 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
1e3a0 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
1e3b0 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
1e3c0 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
1e3d0 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74    nSeg = pStruct
1e3e0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  ->nSegment;.    
1e3f0 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20  if( nSeg>1 ){.  
1e400 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
1e410 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
1e420 74 75 72 65 29 3b 0a 20 20 20 20 20 20 6e 42 79  ture);.      nBy
1e430 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e  te += (pStruct->
1e440 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65  nLevel+1) * size
1e450 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
1e460 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 70 4e  Level);.      pN
1e470 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  ew = (Fts5Struct
1e480 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ure*)sqlite3Fts5
1e490 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
1e4a0 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  c, nByte);.    }
1e4b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 20  .  }.  if( pNew 
1e4c0 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
1e4d0 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b  tureLevel *pLvl;
1e4e0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
1e4f0 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46   nSeg * sizeof(F
1e500 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1e510 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ent);.    pNew->
1e520 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74  nLevel = pStruct
1e530 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20  ->nLevel+1;.    
1e540 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pNew->nRef = 1;.
1e550 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65      pNew->nWrite
1e560 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63  Counter = pStruc
1e570 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
1e580 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e  ;.    pLvl = &pN
1e590 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75  ew->aLevel[pStru
1e5a0 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20  ct->nLevel];.   
1e5b0 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46   pLvl->aSeg = (F
1e5c0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1e5d0 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ent*)sqlite3Fts5
1e5e0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
1e5f0 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  c, nByte);.    i
1e600 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b  f( pLvl->aSeg ){
1e610 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c  .      int iLvl,
1e620 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74   iSeg;.      int
1e630 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20   iSegOut = 0;.  
1e640 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
1e650 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1e660 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
1e670 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
1e680 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
1e690 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
1e6a0 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
1e6b0 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65         pLvl->aSe
1e6c0 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74  g[iSegOut] = pSt
1e6d0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1e6e0 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l].aSeg[iSeg];. 
1e6f0 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74           iSegOut
1e700 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1e710 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
1e720 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76  ->nSegment = pLv
1e730 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a  l->nSeg = nSeg;.
1e740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
1e760 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ew);.      pNew 
1e770 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1e780 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
1e790 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e 65    int iLvl = pNe
1e7a0 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20 20  w->nLevel-1;.   
1e7b0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1e7c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77  QLITE_OK && pNew
1e7d0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
1e7e0 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Seg>0 ){.      i
1e7f0 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f  nt nRem = FTS5_O
1e800 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20  PT_WORK_UNIT;.  
1e810 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
1e820 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65 77  geLevel(p, &pNew
1e830 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a  , iLvl, &nRem);.
1e840 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 53      }..    fts5S
1e850 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
1e860 20 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35   pNew);.    fts5
1e870 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
1e880 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 66  (pNew);.  }..  f
1e890 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
1e8a0 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
1e8b0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
1e8c0 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 69  Return(p); .}..i
1e8d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
1e8e0 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e 64  dexMerge(Fts5Ind
1e8f0 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67  ex *p, int nMerg
1e900 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  e){.  Fts5Struct
1e910 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 0a 20  ure *pStruct;.. 
1e920 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
1e930 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
1e940 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26  .  if( pStruct &
1e950 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  & pStruct->nLeve
1e960 6c 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64  l ){.    fts5Ind
1e970 65 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72  exMerge(p, &pStr
1e980 75 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20 20  uct, nMerge);.  
1e990 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
1e9a0 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29  rite(p, pStruct)
1e9b0 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75  ;.  }.  fts5Stru
1e9c0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1e9d0 72 75 63 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ruct);..  return
1e9e0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
1e9f0 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  (p);.}..static v
1ea00 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43  oid fts5PoslistC
1ea10 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
1ea20 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64  ndex *p, .  void
1ea30 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63   *pContext, .  c
1ea40 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
1ea50 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
1ea60 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75   assert_nc( nChu
1ea70 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  nk>=0 );.  if( n
1ea80 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66  Chunk>0 ){.    f
1ea90 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1eaa0 65 6e 64 42 6c 6f 62 28 28 46 74 73 35 42 75 66  endBlob((Fts5Buf
1eab0 66 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70  fer*)pContext, p
1eac0 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
1ead0 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73    }.}..typedef s
1eae0 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c  truct PoslistCal
1eaf0 6c 62 61 63 6b 43 74 78 20 50 6f 73 6c 69 73 74  lbackCtx Poslist
1eb00 43 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72  CallbackCtx;.str
1eb10 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62  uct PoslistCallb
1eb20 61 63 6b 43 74 78 20 7b 0a 20 20 46 74 73 35 42  ackCtx {.  Fts5B
1eb30 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20  uffer *pBuf;    
1eb40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70             /* Ap
1eb50 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66  pend to this buf
1eb60 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  fer */.  Fts5Col
1eb70 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20  set *pColset;   
1eb80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1eb90 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20  rict matches to 
1eba0 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  this column */. 
1ebb0 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20   int eState;    
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f   /* See above */
1ebe0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a  .};../*.** TODO:
1ebf0 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72 65 20   Make this more 
1ec00 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a 73 74  efficient!.*/.st
1ec10 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
1ec20 65 78 43 6f 6c 73 65 74 54 65 73 74 28 46 74 73  exColsetTest(Fts
1ec30 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
1ec40 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69  , int iCol){.  i
1ec50 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1ec60 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c   i<pColset->nCol
1ec70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1ec80 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69  pColset->aiCol[i
1ec90 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75 72 6e  ]==iCol ) return
1eca0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1ecb0 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   0;.}..static vo
1ecc0 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69  id fts5PoslistFi
1ecd0 6c 74 65 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20  lterCallback(.  
1ece0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1ecf0 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
1ed00 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
1ed10 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
1ed20 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43 61 6c  .){.  PoslistCal
1ed30 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78 20 3d  lbackCtx *pCtx =
1ed40 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63   (PoslistCallbac
1ed50 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  kCtx*)pContext;.
1ed60 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68    assert_nc( nCh
1ed70 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unk>=0 );.  if( 
1ed80 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  nChunk>0 ){.    
1ed90 2f 2a 20 53 65 61 72 63 68 20 74 68 72 6f 75 67  /* Search throug
1eda0 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69  h to find the fi
1edb0 72 73 74 20 76 61 72 69 6e 74 20 77 69 74 68 20  rst varint with 
1edc0 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20 69 73  value 1. This is
1edd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72   the.    ** star
1ede0 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 63 6f  t of the next co
1edf0 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f 0a 20  lumns hits. */. 
1ee00 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
1ee10 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d 20 30    int iStart = 0
1ee20 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  ;..    if( pCtx-
1ee30 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a 20 20  >eState==2 ){.  
1ee40 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
1ee50 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56      fts5FastGetV
1ee60 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20  arint32(pChunk, 
1ee70 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  i, iCol);.      
1ee80 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  if( fts5IndexCol
1ee90 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43  setTest(pCtx->pC
1eea0 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29 7b 0a  olset, iCol) ){.
1eeb0 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53          pCtx->eS
1eec0 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tate = 1;.      
1eed0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1eee0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74  AppendVarint(pCt
1eef0 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20 20  x->pBuf, 1);.   
1ef00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ef10 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
1ef20 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1ef30 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  }..    do {.    
1ef40 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e    while( i<nChun
1ef50 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21 3d  k && pChunk[i]!=
1ef60 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20  0x01 ){.        
1ef70 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69 5d  while( pChunk[i]
1ef80 20 26 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20   & 0x80 ) i++;. 
1ef90 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
1efa0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43    }.      if( pC
1efb0 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  tx->eState ){.  
1efc0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1efd0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
1efe0 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75  Ctx->pBuf, &pChu
1eff0 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53  nk[iStart], i-iS
1f000 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tart);.      }. 
1f010 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68 75 6e       if( i<nChun
1f020 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  k ){.        int
1f030 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   iCol;.        i
1f040 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  Start = i;.     
1f050 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
1f060 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b  if( i>=nChunk ){
1f070 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d  .          pCtx-
1f080 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20  >eState = 2;.   
1f090 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f0a0 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65        fts5FastGe
1f0b0 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b  tVarint32(pChunk
1f0c0 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  , i, iCol);.    
1f0d0 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
1f0e0 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f  te = fts5IndexCo
1f0f0 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70  lsetTest(pCtx->p
1f100 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a 20  Colset, iCol);. 
1f110 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74           if( pCt
1f120 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  x->eState ){.   
1f130 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1f140 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1f150 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70  b(pCtx->pBuf, &p
1f160 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69  Chunk[iStart], i
1f170 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  -iStart);.      
1f180 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
1f190 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f1a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f1b0 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 43      }while( i<nC
1f1c0 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hunk );.  }.}../
1f1d0 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49  *.** Iterator pI
1f1e0 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
1f1f0 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
1f200 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e  entry (not EOF).
1f210 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
1f220 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20 70 6f  n appends the po
1f230 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61  sition list data
1f240 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1f250 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75 66   entry to.** buf
1f260 66 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f 65  fer pBuf. It doe
1f270 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f 70  s not make a cop
1f280 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  y of the positio
1f290 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20 66  n-list size.** f
1f2a0 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
1f2b0 76 6f 69 64 20 66 74 73 35 53 65 67 69 74 65 72  void fts5Segiter
1f2c0 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49  Poslist(.  Fts5I
1f2d0 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53  ndex *p,.  Fts5S
1f2e0 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20 20  egIter *pSeg,.  
1f2f0 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
1f300 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66 65  set,.  Fts5Buffe
1f310 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28  r *pBuf.){.  if(
1f320 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47 72   0==fts5BufferGr
1f330 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ow(&p->rc, pBuf,
1f340 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29 7b 0a   pSeg->nPos) ){.
1f350 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 3d      if( pColset=
1f360 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
1f370 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20  ChunkIterate(p, 
1f380 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70 42 75  pSeg, (void*)pBu
1f390 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61  f, fts5PoslistCa
1f3a0 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65 6c  llback);.    }el
1f3b0 73 65 7b 0a 20 20 20 20 20 20 50 6f 73 6c 69 73  se{.      Poslis
1f3c0 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74  tCallbackCtx sCt
1f3d0 78 3b 0a 20 20 20 20 20 20 73 43 74 78 2e 70 42  x;.      sCtx.pB
1f3e0 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20  uf = pBuf;.     
1f3f0 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20   sCtx.pColset = 
1f400 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 73  pColset;.      s
1f410 43 74 78 2e 65 53 74 61 74 65 20 3d 20 70 43 6f  Ctx.eState = pCo
1f420 6c 73 65 74 20 3f 20 66 74 73 35 49 6e 64 65 78  lset ? fts5Index
1f430 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f 6c 73  ColsetTest(pCols
1f440 65 74 2c 20 30 29 20 3a 20 31 3b 0a 20 20 20 20  et, 0) : 1;.    
1f450 20 20 61 73 73 65 72 74 28 20 73 43 74 78 2e 65    assert( sCtx.e
1f460 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78  State==0 || sCtx
1f470 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20  .eState==1 );.  
1f480 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
1f490 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76  rate(p, pSeg, (v
1f4a0 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35  oid*)&sCtx, fts5
1f4b0 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c  PoslistFilterCal
1f4c0 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  lback);.    }.  
1f4d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55  }.}../*.** IN/OU
1f4e0 54 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 61  T parameter (*pa
1f4f0 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f  ) points to a po
1f500 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62 79  sition list n by
1f510 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 0a  tes in size. If.
1f520 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  ** the position 
1f530 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e  list contains en
1f540 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e  tries for column
1f550 20 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70 61   iCol, then (*pa
1f560 29 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 70  ) is set.** to p
1f570 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 75 62 2d  oint to the sub-
1f580 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f  position-list fo
1f590 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6e  r that column an
1f5a0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  d the number of.
1f5b0 2a 2a 20 62 79 74 65 73 20 69 6e 20 69 74 20 72  ** bytes in it r
1f5c0 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
1f5d0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 73  the argument pos
1f5e0 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20  ition list does 
1f5f0 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61  not.** contain a
1f600 6e 79 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63  ny entries for c
1f610 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74 75  olumn iCol, retu
1f620 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
1f630 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74  int fts5IndexExt
1f640 72 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73 74  ractCol(.  const
1f650 20 75 38 20 2a 2a 70 61 2c 20 20 20 20 20 20 20   u8 **pa,       
1f660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
1f670 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f  /OUT: Pointer to
1f680 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e   poslist */.  in
1f690 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f6b0 20 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73   IN: Size of pos
1f6c0 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
1f6d0 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20     /* Column to 
1f700 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 6f 73  extract from pos
1f710 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  list */.){.  int
1f720 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f740 41 6e 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20  Anything before 
1f750 74 68 65 20 66 69 72 73 74 20 30 78 30 31 20 69  the first 0x01 i
1f760 73 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e  s col 0 */.  con
1f770 73 74 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b 0a  st u8 *p = *pa;.
1f780 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e 64    const u8 *pEnd
1f790 20 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20 20   = &p[n];       
1f7a0 20 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70 61    /* One byte pa
1f7b0 73 74 20 65 6e 64 20 6f 66 20 70 6f 73 69 74 69  st end of positi
1f7c0 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20  on list */.  u8 
1f7d0 70 72 65 76 20 3d 20 30 3b 0a 0a 20 20 77 68 69  prev = 0;..  whi
1f7e0 6c 65 28 20 69 43 6f 6c 21 3d 69 43 75 72 72 65  le( iCol!=iCurre
1f7f0 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76  nt ){.    /* Adv
1f800 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75  ance pointer p u
1f810 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
1f820 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30  o pEnd or an 0x0
1f830 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20  1 byte that is. 
1f840 20 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f     ** not part o
1f850 66 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  f a varint */.  
1f860 20 20 77 68 69 6c 65 28 20 28 70 72 65 76 20 26    while( (prev &
1f870 20 30 78 38 30 29 20 7c 7c 20 2a 70 21 3d 30 78   0x80) || *p!=0x
1f880 30 31 20 29 7b 0a 20 20 20 20 20 20 70 72 65 76  01 ){.      prev
1f890 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 20 20 69   = *p++;.      i
1f8a0 66 28 20 70 3d 3d 70 45 6e 64 20 29 20 72 65 74  f( p==pEnd ) ret
1f8b0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1f8c0 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20 20 20 20   *pa = p++;.    
1f8d0 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  p += fts5GetVari
1f8e0 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e 74  nt32(p, iCurrent
1f8f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 76  );.  }..  /* Adv
1f900 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75  ance pointer p u
1f910 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
1f920 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30  o pEnd or an 0x0
1f930 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20  1 byte that is. 
1f940 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   ** not part of 
1f950 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 61 73  a varint */.  as
1f960 73 65 72 74 28 20 28 70 72 65 76 20 26 20 30 78  sert( (prev & 0x
1f970 38 30 29 3d 3d 30 20 29 3b 0a 20 20 77 68 69 6c  80)==0 );.  whil
1f980 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28 28 70  e( p<pEnd && ((p
1f990 72 65 76 20 26 20 30 78 38 30 29 20 7c 7c 20 2a  rev & 0x80) || *
1f9a0 70 21 3d 30 78 30 31 29 20 29 7b 0a 20 20 20 20  p!=0x01) ){.    
1f9b0 70 72 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20 20 7d  prev = *p++;.  }
1f9c0 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20 28 2a  .  return p - (*
1f9d0 70 61 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  pa);.}.../*.** I
1f9e0 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20 63  terator pMulti c
1f9f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1fa00 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1fa10 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73   (not EOF). This
1fa20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  .** function app
1fa30 65 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ends the followi
1fa40 6e 67 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  ng to buffer pBu
1fa50 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  f:.**.**   * The
1fa60 20 76 61 72 69 6e 74 20 69 44 65 6c 74 61 2c 20   varint iDelta, 
1fa70 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 70  and.**   * the p
1fa80 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61  osition list tha
1fa90 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
1faa0 74 73 20 74 6f 2c 20 69 6e 63 6c 75 64 69 6e 67  ts to, including
1fab0 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 2e   the size field.
1fac0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
1fad0 6e 74 20 70 43 6f 6c 73 65 74 20 69 73 20 4e 55  nt pColset is NU
1fae0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 73  LL, then the pos
1faf0 69 74 69 6f 6e 20 6c 69 73 74 20 69 73 20 66 69  ition list is fi
1fb00 6c 74 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  ltered according
1fb10 0a 2a 2a 20 74 6f 20 70 43 6f 6c 73 65 74 20 62  .** to pColset b
1fb20 65 66 6f 72 65 20 62 65 69 6e 67 20 61 70 70 65  efore being appe
1fb30 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
1fb40 65 72 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e  er. If this mean
1fb50 73 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e  s there are.** n
1fb60 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  o entries in the
1fb70 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c 20   position list, 
1fb80 6e 6f 74 68 69 6e 67 20 69 73 20 61 70 70 65 6e  nothing is appen
1fb90 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
1fba0 72 20 28 6e 6f 74 0a 2a 2a 20 65 76 65 6e 20 69  r (not.** even i
1fbb0 44 65 6c 74 61 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Delta)..**.** If
1fbc0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1fbd0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
1fbe0 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63  is left in p->rc
1fbf0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
1fc00 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69   fts5AppendPosli
1fc10 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  st(.  Fts5Index 
1fc20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61  *p,.  i64 iDelta
1fc30 2c 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ,.  Fts5IndexIte
1fc40 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74 73  r *pMulti,.  Fts
1fc50 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
1fc60 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
1fc70 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d  pBuf.){.  if( p-
1fc80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1fc90 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1fca0 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74  r *pSeg = &pMult
1fcb0 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d  i->aSeg[ pMulti-
1fcc0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
1fcd0 74 20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t ];.    assert(
1fce0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1fcf0 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20  f(p, pMulti)==0 
1fd00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1fd10 53 65 67 2d 3e 6e 50 6f 73 3e 30 20 29 3b 0a 20  Seg->nPos>0 );. 
1fd20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75     if( 0==fts5Bu
1fd30 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c  fferGrow(&p->rc,
1fd40 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f   pBuf, pSeg->nPo
1fd50 73 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20  s+9+9) ){.      
1fd60 69 6e 74 20 69 53 76 31 3b 0a 20 20 20 20 20 20  int iSv1;.      
1fd70 69 6e 74 20 69 53 76 32 3b 0a 20 20 20 20 20 20  int iSv2;.      
1fd80 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20 20 20  int iData;..    
1fd90 20 20 2f 2a 20 41 70 70 65 6e 64 20 69 44 65 6c    /* Append iDel
1fda0 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 53 76 31  ta */.      iSv1
1fdb0 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20   = pBuf->n;.    
1fdc0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1fdd0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
1fde0 66 2c 20 69 44 65 6c 74 61 29 3b 0a 0a 20 20 20  f, iDelta);..   
1fdf0 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49     /* WRITEPOSLI
1fe00 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20  STSIZE */.      
1fe10 69 53 76 32 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a  iSv2 = pBuf->n;.
1fe20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fe30 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
1fe40 28 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f  (pBuf, pSeg->nPo
1fe50 73 2a 32 29 3b 0a 20 20 20 20 20 20 69 44 61 74  s*2);.      iDat
1fe60 61 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 0a 20 20  a = pBuf->n;..  
1fe70 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c      if( pSeg->iL
1fe80 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e  eafOffset+pSeg->
1fe90 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61  nPos<=pSeg->pLea
1fea0 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20 20  f->szLeaf .     
1feb0 20 20 26 26 20 28 70 43 6f 6c 73 65 74 3d 3d 30    && (pColset==0
1fec0 20 7c 7c 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f   || pColset->nCo
1fed0 6c 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  l==1).      ){. 
1fee0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20         const u8 
1fef0 2a 70 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70  *pPos = &pSeg->p
1ff00 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c  Leaf->p[pSeg->iL
1ff10 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  eafOffset];.    
1ff20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
1ff30 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65        if( pColse
1ff40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  t ){.          n
1ff50 50 6f 73 20 3d 20 66 74 73 35 49 6e 64 65 78 45  Pos = fts5IndexE
1ff60 78 74 72 61 63 74 43 6f 6c 28 26 70 50 6f 73 2c  xtractCol(&pPos,
1ff70 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 70 43 6f   pSeg->nPos, pCo
1ff80 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b  lset->aiCol[0]);
1ff90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1ffa0 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73 20 3d            nPos =
1ffb0 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20   pSeg->nPos;.   
1ffc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
1ffd0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1ffe0 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 50  endBlob(pBuf, pP
1fff0 6f 73 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20  os, nPos);.     
20000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20010 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
20020 73 74 28 70 2c 20 70 53 65 67 2c 20 70 43 6f 6c  st(p, pSeg, pCol
20030 73 65 74 2c 20 70 42 75 66 29 3b 0a 20 20 20 20  set, pBuf);.    
20040 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
20050 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Colset ){.      
20060 20 20 69 6e 74 20 6e 41 63 74 75 61 6c 20 3d 20    int nActual = 
20070 70 42 75 66 2d 3e 6e 20 2d 20 69 44 61 74 61 3b  pBuf->n - iData;
20080 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 63  .        if( nAc
20090 74 75 61 6c 21 3d 70 53 65 67 2d 3e 6e 50 6f 73  tual!=pSeg->nPos
200a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
200b0 28 20 6e 41 63 74 75 61 6c 3d 3d 30 20 29 7b 0a  ( nActual==0 ){.
200c0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
200d0 2d 3e 6e 20 3d 20 69 53 76 31 3b 0a 20 20 20 20  ->n = iSv1;.    
200e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
200f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
20100 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
20110 6e 74 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65  nt nReq = sqlite
20120 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65  3Fts5GetVarintLe
20130 6e 28 28 75 33 32 29 28 6e 41 63 74 75 61 6c 2a  n((u32)(nActual*
20140 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  2));.           
20150 20 77 68 69 6c 65 28 20 69 53 76 32 3c 28 69 44   while( iSv2<(iD
20160 61 74 61 2d 6e 52 65 71 29 20 29 7b 20 70 42 75  ata-nReq) ){ pBu
20170 66 2d 3e 70 5b 69 53 76 32 2b 2b 5d 20 3d 20 30  f->p[iSv2++] = 0
20180 78 38 30 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  x80; }.         
20190 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 75     sqlite3Fts5Pu
201a0 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
201b0 5b 69 53 76 32 5d 2c 20 6e 41 63 74 75 61 6c 2a  [iSv2], nActual*
201c0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  2);.          }.
201d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
201e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
201f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
20200 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
20210 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35  istIterNext(Fts5
20220 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
20230 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70  er){.  u8 *p = p
20240 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b  Iter->aPoslist +
20250 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20   pIter->nSize + 
20260 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b  pIter->nPoslist;
20270 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
20280 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20  r->aPoslist );. 
20290 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61   if( p>=pIter->a
202a0 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  Eof ){.    pIter
202b0 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a  ->aPoslist = 0;.
202c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
202d0 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20   iDelta;..    p 
202e0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
202f0 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  (p, (u64*)&iDelt
20300 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
20310 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
20320 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f  ..    /* Read po
20330 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65  sition list size
20340 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d   */.    if( p[0]
20350 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20   & 0x80 ){.     
20360 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
20370 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20   pIter->nSize = 
20380 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
20390 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20  p, nPos);.      
203a0 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20  pIter->nPoslist 
203b0 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20  = (nPos>>1);.   
203c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
203d0 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20  ter->nPoslist = 
203e0 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e  ((int)(p[0])) >>
203f0 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   1;.      pIter-
20400 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20  >nSize = 1;.    
20410 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  }..    pIter->aP
20420 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a  oslist = p;.  }.
20430 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
20440 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
20450 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  it(.  Fts5Buffer
20460 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44   *pBuf, .  Fts5D
20470 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
20480 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49  r.){.  memset(pI
20490 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
204a0 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
204b0 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75  ->aPoslist = pBu
204c0 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61  f->p;.  pIter->a
204d0 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70  Eof = &pBuf->p[p
204e0 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44  Buf->n];.  fts5D
204f0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
20500 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a  Iter);.}..#if 0.
20510 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64  /*.** Append a d
20520 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72  oclist to buffer
20530 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
20540 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
20550 65 73 20 74 68 61 74 20 73 70 61 63 65 20 77 69  es that space wi
20560 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  thin the buffer 
20570 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
20580 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  .** allocated..*
20590 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
205a0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
205b0 69 64 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  id(.  Fts5Buffer
205c0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
205d0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
205e0 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
205f0 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69   i64 *piLastRowi
20600 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
20610 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76   /* IN/OUT: Prev
20620 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74 74  ious rowid writt
20630 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  en (if any) */. 
20640 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20   i64 iRowid     
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20660 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70   /* Rowid to app
20670 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  end */.){.  asse
20680 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c  rt( pBuf->n!=0 |
20690 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29  | (*piLastRowid)
206a0 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66  ==0 );.  fts5Buf
206b0 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
206c0 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64  int(pBuf, iRowid
206d0 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29   - *piLastRowid)
206e0 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  ;.  *piLastRowid
206f0 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e   = iRowid;.}.#en
20700 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  dif..#define fts
20710 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
20720 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77  d(pBuf, iLastRow
20730 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20  id, iRowid) {   
20740 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20      \.  assert( 
20750 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20  (pBuf)->n!=0 || 
20760 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20  (iLastRowid)==0 
20770 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
20780 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66       \.  fts5Buf
20790 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
207a0 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f  int((pBuf), (iRo
207b0 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77  wid) - (iLastRow
207c0 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74  id)); \.  (iLast
207d0 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64  Rowid) = (iRowid
207e0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
207f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20800 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
20810 2a 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64  * Buffers p1 and
20820 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c   p2 contain docl
20830 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ists. This funct
20840 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63  ion merges the c
20850 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65  ontent.** of the
20860 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f   two doclists to
20870 67 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20  gether and sets 
20880 62 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65  buffer p1 to the
20890 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a   result before.*
208a0 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  * returning..**.
208b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
208c0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
208d0 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
208e0 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  p->rc. If an err
208f0 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64  or has.** alread
20900 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
20910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
20920 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
20930 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72  void fts5MergePr
20940 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73  efixLists(.  Fts
20950 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20970 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
20980 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ect */.  Fts5Buf
20990 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20  fer *p1,        
209a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
209b0 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  t list to merge 
209c0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
209d0 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  *p2             
209e0 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c       /* Second l
209f0 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
20a00 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29  ){.  if( p2->n )
20a10 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  {.    i64 iLastR
20a20 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
20a30 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31  s5DoclistIter i1
20a40 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73  ;.    Fts5Doclis
20a50 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74  tIter i2;.    Ft
20a60 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20  s5Buffer out;.  
20a70 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70    Fts5Buffer tmp
20a80 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 75  ;.    memset(&ou
20a90 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74  t, 0, sizeof(out
20aa0 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ));.    memset(&
20ab0 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74  tmp, 0, sizeof(t
20ac0 6d 70 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  mp));..    sqlit
20ad0 65 33 46 74 73 35 42 75 66 66 65 72 47 72 6f 77  e3Fts5BufferGrow
20ae0 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70  (&p->rc, &out, p
20af0 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20  1->n + p2->n);. 
20b00 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
20b10 65 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b  erInit(p1, &i1);
20b20 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74  .    fts5Doclist
20b30 49 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32  IterInit(p2, &i2
20b40 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d  );.    while( p-
20b50 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
20b60 26 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 21 3d  & (i1.aPoslist!=
20b70 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74  0 || i2.aPoslist
20b80 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66  !=0) ){.      if
20b90 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  ( i2.aPoslist==0
20ba0 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73 74   || (i1.aPoslist
20bb0 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69 32   && i1.iRowid<i2
20bc0 2e 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  .iRowid) ){.    
20bd0 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72      /* Copy entr
20be0 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20  y from i1 */.   
20bf0 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
20c00 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20  pendDocid(&out, 
20c10 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69  iLastRowid, i1.i
20c20 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
20c30 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
20c40 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69  pendBlob(&out, i
20c50 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e  1.aPoslist, i1.n
20c60 50 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65  Poslist+i1.nSize
20c70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
20c80 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
20c90 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i1);.      }.   
20ca0 20 20 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61     else if( i1.a
20cb0 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32  Poslist==0 || i2
20cc0 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77  .iRowid!=i1.iRow
20cd0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  id ){.        /*
20ce0 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
20cf0 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i2 */.        f
20d00 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
20d10 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
20d20 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29  owid, i2.iRowid)
20d30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
20d40 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
20d50 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73  ob(&out, i2.aPos
20d60 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  list, i2.nPoslis
20d70 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20  t+i2.nSize);.   
20d80 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
20d90 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
20da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
20db0 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  e{.        i64 i
20dc0 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  Pos1 = 0;.      
20dd0 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30 3b    i64 iPos2 = 0;
20de0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
20df0 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  f1 = 0;.        
20e00 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a 20  int iOff2 = 0;. 
20e10 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20         u8 *a1 = 
20e20 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31 2e  &i1.aPoslist[i1.
20e30 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  nSize];.        
20e40 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50 6f  u8 *a2 = &i2.aPo
20e50 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b  slist[i2.nSize];
20e60 0a 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  ..        Fts5Po
20e70 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69 74  slistWriter writ
20e80 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  er;.        mems
20e90 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73  et(&writer, 0, s
20ea0 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a  izeof(writer));.
20eb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67  .        /* Merg
20ec0 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69  e the two positi
20ed0 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20  on lists. */ .  
20ee0 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
20ef0 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
20f00 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e   iLastRowid, i2.
20f10 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
20f20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
20f30 26 74 6d 70 29 3b 0a 0a 20 20 20 20 20 20 20 20  &tmp);..        
20f40 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
20f50 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e  stNext64(a1, i1.
20f60 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31  nPoslist, &iOff1
20f70 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  , &iPos1);.     
20f80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
20f90 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20  slistNext64(a2, 
20fa0 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i2.nPoslist, &iO
20fb0 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 0a 20  ff2, &iPos2);.. 
20fc0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d         while( p-
20fd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
20fe0 26 20 28 69 50 6f 73 31 3e 3d 30 20 7c 7c 20 69  & (iPos1>=0 || i
20ff0 50 6f 73 32 3e 3d 30 29 20 29 7b 0a 20 20 20 20  Pos2>=0) ){.    
21000 20 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a        i64 iNew;.
21010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
21020 6f 73 32 3c 30 20 7c 7c 20 28 69 50 6f 73 31 3e  os2<0 || (iPos1>
21030 3d 30 20 26 26 20 69 50 6f 73 31 3c 69 50 6f 73  =0 && iPos1<iPos
21040 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
21050 20 20 69 4e 65 77 20 3d 20 69 50 6f 73 31 3b 0a    iNew = iPos1;.
21060 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21070 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
21080 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73  xt64(a1, i1.nPos
21090 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69  list, &iOff1, &i
210a0 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
210b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
210c0 20 20 20 20 69 4e 65 77 20 3d 20 69 50 6f 73 32      iNew = iPos2
210d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
210e0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
210f0 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50  Next64(a2, i2.nP
21100 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20  oslist, &iOff2, 
21110 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20  &iPos2);.       
21120 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3d 3d       if( iPos1==
21130 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20  iPos2 ){.       
21140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
21150 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
21160 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  a1, i1.nPoslist,
21170 20 26 69 4f 66 66 31 2c 26 69 50 6f 73 31 29 3b   &iOff1,&iPos1);
21180 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21190 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
211a0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
211b0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57  ite3Fts5PoslistW
211c0 72 69 74 65 72 41 70 70 65 6e 64 28 26 74 6d 70  riterAppend(&tmp
211d0 2c 20 26 77 72 69 74 65 72 2c 20 69 4e 65 77 29  , &writer, iNew)
211e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
211f0 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53       /* WRITEPOS
21200 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20  LISTSIZE */.    
21210 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
21220 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  feAppendVarint(&
21230 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b  out, tmp.n * 2);
21240 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
21250 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
21260 62 28 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74  b(&out, tmp.p, t
21270 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66  mp.n);.        f
21280 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
21290 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20  xt(&i1);.       
212a0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
212b0 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20  Next(&i2);.     
212c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74   }.    }..    ft
212d0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
212e0 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f  rc, p1, out.n, o
212f0 75 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42  ut.p);.    fts5B
21300 75 66 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b  ufferFree(&tmp);
21310 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
21320 72 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d  ree(&out);.  }.}
21330 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
21340 73 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73  s5BufferSwap(Fts
21350 35 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73  5Buffer *p1, Fts
21360 35 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20  5Buffer *p2){.  
21370 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d  Fts5Buffer tmp =
21380 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70   *p1;.  *p1 = *p
21390 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a  2;.  *p2 = tmp;.
213a0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
213b0 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
213c0 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  er(.  Fts5Index 
213d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
213e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
213f0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
21400 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20   int bDesc,     
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52   /* True for "OR
21430 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
21440 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  C" */.  const u8
21450 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20   *pToken,       
21460 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
21470 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  r containing pre
21480 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  fix to match */.
21490 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
214c0 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79  fer pToken in by
214d0 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  tes */.  Fts5Col
214e0 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20  set *pColset,   
214f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21500 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20  rict matches to 
21510 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f  these columns */
21520 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
21530 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20   **ppIter       
21540 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69     /* OUT: New i
21550 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20  terator */.){.  
21560 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
21570 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 42 75  Struct;.  Fts5Bu
21580 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f  ffer *aBuf;.  co
21590 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d 20 33  nst int nBuf = 3
215a0 32 3b 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74  2;..  aBuf = (Ft
215b0 73 35 42 75 66 66 65 72 2a 29 66 74 73 35 49 64  s5Buffer*)fts5Id
215c0 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
215d0 66 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42  f(Fts5Buffer)*nB
215e0 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  uf);.  pStruct =
215f0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
21600 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42  ad(p);..  if( aB
21610 75 66 20 26 26 20 70 53 74 72 75 63 74 20 29 7b  uf && pStruct ){
21620 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
21630 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58  lags = FTS5INDEX
21640 5f 51 55 45 52 59 5f 53 43 41 4e 3b 0a 20 20 20  _QUERY_SCAN;.   
21650 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20   int i;.    i64 
21660 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
21670 20 20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65      Fts5IndexIte
21680 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f  r *p1 = 0;     /
21690 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20  * Iterator used 
216a0 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66  to gather data f
216b0 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  rom index */.   
216c0 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
216d0 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  ;.    Fts5Buffer
216e0 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d   doclist;..    m
216f0 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20  emset(&doclist, 
21700 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73  0, sizeof(doclis
21710 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  t));.    for(fts
21720 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
21730 20 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61   pStruct, 1, fla
21740 67 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  gs, pToken, nTok
21750 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b  en, -1, 0, &p1);
21760 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
21770 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29  tiIterEof(p, p1)
21780 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ==0;.        fts
21790 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
217a0 2c 20 70 31 2c 20 30 2c 20 30 29 0a 20 20 20 20  , p1, 0, 0).    
217b0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
217c0 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  wid = fts5MultiI
217d0 74 65 72 52 6f 77 69 64 28 70 31 29 3b 0a 20 20  terRowid(p1);.  
217e0 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20      int nTerm;. 
217f0 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
21800 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69  Term = fts5Multi
21810 49 74 65 72 54 65 72 6d 28 70 31 2c 20 26 6e 54  IterTerm(p1, &nT
21820 65 72 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  erm);.      asse
21830 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70 54  rt_nc( memcmp(pT
21840 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e  oken, pTerm, MIN
21850 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29  (nToken, nTerm))
21860 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  <=0 );.      if(
21870 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c   nTerm<nToken ||
21880 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20   memcmp(pToken, 
21890 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29  pTerm, nToken) )
218a0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69   break;..      i
218b0 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 26  f( doclist.n>0 &
218c0 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52  & iRowid<=iLastR
218d0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
218e0 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
218f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63  SQLITE_OK && doc
21900 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  list.n; i++){.  
21910 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21920 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  i<nBuf );.      
21930 20 20 20 20 69 66 28 20 61 42 75 66 5b 69 5d 2e      if( aBuf[i].
21940 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
21950 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 77      fts5BufferSw
21960 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26 61 42  ap(&doclist, &aB
21970 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
21980 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
21990 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  ro(&doclist);.  
219a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
219b0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 4d             fts5M
219c0 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28  ergePrefixLists(
219d0 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42  p, &doclist, &aB
219e0 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
219f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
21a00 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  ro(&aBuf[i]);.  
21a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21a20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4c 61 73    }.        iLas
21a30 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  tRowid = 0;.    
21a40 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 21    }..      if( !
21a50 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73  fts5AppendPoslis
21a60 74 28 70 2c 20 69 52 6f 77 69 64 2d 69 4c 61 73  t(p, iRowid-iLas
21a70 74 52 6f 77 69 64 2c 20 70 31 2c 20 70 43 6f 6c  tRowid, p1, pCol
21a80 73 65 74 2c 20 26 64 6f 63 6c 69 73 74 29 20 29  set, &doclist) )
21a90 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 73 74 52  {.        iLastR
21aa0 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
21ab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
21ac0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75    for(i=0; i<nBu
21ad0 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  f; i++){.      i
21ae0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
21af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66  _OK ){.        f
21b00 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
21b10 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c  sts(p, &doclist,
21b20 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
21b30 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75    }.      fts5Bu
21b40 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b 69  fferFree(&aBuf[i
21b50 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ]);.    }.    ft
21b60 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
21b70 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44 61  p, p1);..    pDa
21b80 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  ta = fts5IdxMall
21b90 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
21ba0 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69 73 74  5Data) + doclist
21bb0 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61  .n);.    if( pDa
21bc0 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74  ta ){.      pDat
21bd0 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44 61  a->p = (u8*)&pDa
21be0 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44 61  ta[1];.      pDa
21bf0 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e  ta->nn = pData->
21c00 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73 74  szLeaf = doclist
21c10 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  .n;.      memcpy
21c20 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69  (pData->p, docli
21c30 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29  st.p, doclist.n)
21c40 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
21c50 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44 61  iIterNew2(p, pDa
21c60 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74 65  ta, bDesc, ppIte
21c70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  r);.    }.    ft
21c80 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64 6f  s5BufferFree(&do
21c90 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66  clist);.  }..  f
21ca0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
21cb0 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
21cc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75  sqlite3_free(aBu
21cd0 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  f);.}.../*.** In
21ce0 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20  dicate that all 
21cf0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
21d00 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
21d10 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72 74  ndexWrite() pert
21d20 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f  ain.** to the do
21d30 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69  cument with rowi
21d40 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  d iRowid..*/.int
21d50 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
21d60 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73 35  xBeginWrite(Fts5
21d70 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44  Index *p, int bD
21d80 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77 69  elete, i64 iRowi
21d90 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  d){.  assert( p-
21da0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
21db0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
21dc0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
21dd0 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
21de0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
21df0 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
21e00 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >pHash==0 ){.   
21e10 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
21e20 46 74 73 35 48 61 73 68 4e 65 77 28 26 70 2d 3e  Fts5HashNew(&p->
21e30 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64  pHash, &p->nPend
21e40 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  ingData);.  }.. 
21e50 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61   /* Flush the ha
21e60 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
21e70 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
21e80 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e    if( iRowid<p->
21e90 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20  iWriteRowid .   
21ea0 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69  || (iRowid==p->i
21eb0 57 72 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d  WriteRowid && p-
21ec0 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20  >bDelete==0).   
21ed0 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  || (p->nPendingD
21ee0 61 74 61 20 3e 20 70 2d 3e 6e 4d 61 78 50 65 6e  ata > p->nMaxPen
21ef0 64 69 6e 67 44 61 74 61 29 20 0a 20 20 29 7b 0a  dingData) .  ){.
21f00 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75      fts5IndexFlu
21f10 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d  sh(p);.  }..  p-
21f20 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69  >iWriteRowid = i
21f30 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c  Rowid;.  p->bDel
21f40 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20  ete = bDelete;. 
21f50 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
21f60 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
21f70 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61  *.** Commit data
21f80 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
21f90 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
21fa0 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20  xSync(Fts5Index 
21fb0 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  *p, int bCommit)
21fc0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
21fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
21fe0 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
21ff0 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d  (p);.  if( bComm
22000 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52 65  it ) fts5CloseRe
22010 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75 72  ader(p);.  retur
22020 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
22030 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n(p);.}../*.** D
22040 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61 20  iscard any data 
22050 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e  stored in the in
22060 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
22070 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  les. Do not writ
22080 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64  e it.** to the d
22090 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
220a0 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68  nally, assume th
220b0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
220c0 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  of the %_data.**
220d0 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20   table may have 
220e0 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e  changed on disk.
220f0 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72   So any in-memor
22100 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61  y caches of %_da
22110 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d  ta .** records m
22120 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ust be invalidat
22130 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
22140 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62  e3Fts5IndexRollb
22150 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ack(Fts5Index *p
22160 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65  ){.  fts5CloseRe
22170 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35 49  ader(p);.  fts5I
22180 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61 28  ndexDiscardData(
22190 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
221a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
221b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
221c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
221d0 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
221e0 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  is completely em
221f0 70 74 79 20 77 68 65 6e 20 74 68 69 73 20 66 75  pty when this fu
22200 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
22210 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
22220 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20  on populates it 
22230 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
22240 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
22250 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  ts for each inde
22260 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e  x,.** and the in
22270 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66  itial version of
22280 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20   the "averages" 
22290 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62  record (a zero-b
222a0 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e  yte blob)..*/.in
222b0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
222c0 65 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64  exReinit(Fts5Ind
222d0 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74  ex *p){.  Fts5St
222e0 72 75 63 74 75 72 65 20 73 3b 0a 20 20 6d 65 6d  ructure s;.  mem
222f0 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f  set(&s, 0, sizeo
22300 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
22310 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
22320 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41  te(p, FTS5_AVERA
22330 47 45 53 5f 52 4f 57 49 44 2c 20 28 63 6f 6e 73  GES_ROWID, (cons
22340 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20  t u8*)"", 0);.  
22350 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
22360 74 65 28 70 2c 20 26 73 29 3b 0a 20 20 72 65 74  te(p, &s);.  ret
22370 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
22380 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
22390 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35   Open a new Fts5
223a0 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66  Index handle. If
223b0 20 74 68 65 20 62 43 72 65 61 74 65 20 61 72 67   the bCreate arg
223c0 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63  ument is true, c
223d0 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69  reate.** and ini
223e0 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  tialize the unde
223f0 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61  rlying %_data ta
22400 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ble..**.** If su
22410 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
22420 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  p to point to th
22430 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64  e new object and
22440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22450 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  K..** Otherwise,
22460 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
22470 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
22480 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
22490 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
224a0 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20  Fts5IndexOpen(. 
224b0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
224c0 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72  nfig, .  int bCr
224d0 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64  eate, .  Fts5Ind
224e0 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20  ex **pp,.  char 
224f0 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74  **pzErr.){.  int
22500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22510 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b  .  Fts5Index *p;
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22530 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
22540 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d   */..  *pp = p =
22550 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c   (Fts5Index*)sql
22560 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
22570 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46  ro(&rc, sizeof(F
22580 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 69 66  ts5Index));.  if
22590 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
225a0 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69  ){.    p->pConfi
225b0 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20  g = pConfig;.   
225c0 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20   p->nWorkUnit = 
225d0 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a  FTS5_WORK_UNIT;.
225e0 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69      p->nMaxPendi
225f0 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31 30  ngData = 1024*10
22600 32 34 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61  24;.    p->zData
22610 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Tbl = sqlite3Fts
22620 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25  5Mprintf(&rc, "%
22630 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67  s_data", pConfig
22640 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
22650 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26  ( p->zDataTbl &&
22660 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20   bCreate ){.    
22670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
22680 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20  s5CreateTable(. 
22690 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
226a0 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e  , "data", "id IN
226b0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
226c0 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20  Y, block BLOB", 
226d0 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29  0, pzErr.      )
226e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
226f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22700 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22710 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
22720 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c  (pConfig, "idx",
22730 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73   .            "s
22740 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f  egid, term, pgno
22750 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65  , PRIMARY KEY(se
22760 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20  gid, term)", .  
22770 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45            1, pzE
22780 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  rr.        );.  
22790 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
227a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
227b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
227c0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
227d0 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  init(p);.      }
227e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
227f0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
22800 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
22810 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
22820 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
22830 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
22840 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30  (p);.    *pp = 0
22850 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22860 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
22870 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65  e a handle opene
22880 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
22890 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46  call to sqlite3F
228a0 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a  ts5IndexOpen()..
228b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
228c0 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73  s5IndexClose(Fts
228d0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
228e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
228f0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
22900 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
22910 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  der==0 );.    sq
22920 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
22930 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  ->pWriter);.    
22940 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
22950 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
22960 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
22970 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65  ize(p->pIdxWrite
22980 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
22990 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
229a0 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71  Deleter);.    sq
229b0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
229c0 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20  ->pIdxSelect);. 
229d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
229e0 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29  shFree(p->pHash)
229f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
22a00 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
22a10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22a20 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
22a30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22a40 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
22a50 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
22a60 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
22a70 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
22a80 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
22a90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
22aa0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
22ab0 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
22ac0 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
22ad0 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
22ae0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
22af0 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
22b00 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
22b10 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
22b20 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
22b30 6e 54 6f 42 79 74 65 6c 65 6e 28 63 6f 6e 73 74  nToBytelen(const
22b40 20 63 68 61 72 20 2a 70 2c 20 69 6e 74 20 6e 42   char *p, int nB
22b50 79 74 65 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b  yte, int nChar){
22b60 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
22b70 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
22b80 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b  ; i<nChar; i++){
22b90 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74  .    if( n>=nByt
22ba0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
22bb0 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74     /* Input cont
22bc0 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
22bd0 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20  nChar chars */. 
22be0 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
22bf0 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78   char)p[n++]>=0x
22c00 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  c0 ){.      whil
22c10 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29  e( (p[n] & 0xc0)
22c20 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20  ==0x80 ) n++;.  
22c30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22c40 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e   n;.}../*.** pIn
22c50 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
22c60 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20  ded string, nIn 
22c70 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52  bytes in size. R
22c80 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
22c90 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63   of.** unicode c
22ca0 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
22cb0 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
22cc0 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
22cd0 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68  Charlen(const ch
22ce0 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *pIn, int nIn
22cf0 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d  ){.  int nChar =
22d00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a   0;            .
22d10 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77    int i = 0;.  w
22d20 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20  hile( i<nIn ){. 
22d30 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
22d40 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d   char)pIn[i++]>=
22d50 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
22d60 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70  ile( i<nIn && (p
22d70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30  In[i] & 0xc0)==0
22d80 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d  x80 ) i++;.    }
22d90 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20  .    nChar++;.  
22da0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72  }.  return nChar
22db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
22dc0 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61  t or remove data
22dd0 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
22de0 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65  index. Each time
22df0 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a   a document is .
22e00 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72  ** added to or r
22e10 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
22e20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63  index, this func
22e30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
22e40 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69  ne or more.** ti
22e50 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  mes..**.** For a
22e60 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73  n insert, it mus
22e70 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  t be called once
22e80 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20   for each token 
22e90 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d  in the new docum
22ea0 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ent..** If the o
22eb0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65  peration is a de
22ec0 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65  lete, it must be
22ed0 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73   called (at leas
22ee0 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  t) once for each
22ef0 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e  .** unique token
22f00 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
22f10 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61   with an iCol va
22f20 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65  lue less than ze
22f30 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20  ro. The iPos.** 
22f40 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f  argument is igno
22f50 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65  red for a delete
22f60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22f70 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a  Fts5IndexWrite(.
22f80 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
22fb0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
22fc0 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
22fe0 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65  olumn token appe
22ff0 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64  ars in (-ve -> d
23000 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20  elete) */.  int 
23010 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
23020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
23030 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  osition of token
23040 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a   within column *
23050 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23060 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
23070 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20  en  /* Token to 
23080 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f  add or remove to
23090 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a   or from index *
230a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
230d0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
230e0 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  h indexes */.  i
230f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23100 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
23110 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
23120 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
23130 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
23140 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fig;..  assert( 
23150 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
23160 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69   );.  assert( (i
23170 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c 65  Col<0)==p->bDele
23180 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  te );..  /* Add 
23190 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  the entry to the
231a0 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65   main terms inde
231b0 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  x. */.  rc = sql
231c0 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
231d0 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61 73  e(.      p->pHas
231e0 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  h, p->iWriteRowi
231f0 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46  d, iCol, iPos, F
23200 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c  TS5_MAIN_PREFIX,
23210 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a   pToken, nToken.
23220 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b    );..  for(i=0;
23230 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65   i<pConfig->nPre
23240 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  fix && rc==SQLIT
23250 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
23260 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74 73 35  int nByte = fts5
23270 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79  IndexCharlenToBy
23280 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54  telen(pToken, nT
23290 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e 61  oken, pConfig->a
232a0 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20  Prefix[i]);.    
232b0 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
232c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
232d0 74 73 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e  ts5HashWrite(p->
232e0 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  pHash, .        
232f0 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64    p->iWriteRowid
23300 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54  , iCol, iPos, FT
23310 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69  S5_MAIN_PREFIX+i
23320 2b 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42 79 74  +1, pToken, nByt
23330 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
23340 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
23350 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
23360 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20   a new iterator 
23370 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67  to iterate thoug
23380 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74  h all rowid that
23390 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73   match the .** s
233a0 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f  pecified token o
233b0 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a  r token prefix..
233c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
233d0 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20  s5IndexQuery(.  
233e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20  /* FTS index to 
23410 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  query */.  const
23420 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
23430 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f  nt nToken, /* To
23440 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20  ken (or prefix) 
23450 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
23460 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
23490 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66  5INDEX_QUERY_X f
234a0 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  lags */.  Fts5Co
234b0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
234c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
234d0 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  ch these columns
234e0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49   only */.  Fts5I
234f0 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65  ndexIter **ppIte
23500 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
23510 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
23520 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
23530 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
23540 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
23550 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
23560 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e   *pRet = 0;.  in
23570 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 46 74  t iIdx = 0;.  Ft
23580 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b  s5Buffer buf = {
23590 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20  0, 0, 0};..  /* 
235a0 49 66 20 74 68 65 20 51 55 45 52 59 5f 53 43 41  If the QUERY_SCA
235b0 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  N flag is set, a
235c0 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20 6d  ll other flags m
235d0 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a 2f  ust be clear. */
235e0 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
235f0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
23600 45 52 59 5f 53 43 41 4e 29 3d 3d 30 0a 20 20 20  ERY_SCAN)==0.   
23610 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 20 26 20      || (flags & 
23620 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
23630 53 43 41 4e 29 3d 3d 46 54 53 35 49 4e 44 45 58  SCAN)==FTS5INDEX
23640 5f 51 55 45 52 59 5f 53 43 41 4e 0a 20 20 29 3b  _QUERY_SCAN.  );
23650 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ..  if( sqlite3F
23660 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
23670 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b  ->rc, &buf, nTok
23680 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  en+1)==0 ){.    
23690 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31 5d  memcpy(&buf.p[1]
236a0 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
236b0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
236c0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49  E_DEBUG.    /* I
236d0 66 20 74 68 65 20 51 55 45 52 59 5f 54 45 53 54  f the QUERY_TEST
236e0 5f 4e 4f 49 44 58 20 66 6c 61 67 20 77 61 73 20  _NOIDX flag was 
236f0 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
23700 74 68 69 73 20 6d 75 73 74 20 62 65 20 61 0a 20  this must be a. 
23710 20 20 20 2a 2a 20 70 72 65 66 69 78 2d 71 75 65     ** prefix-que
23720 72 79 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 75  ry. Instead of u
23730 73 69 6e 67 20 61 20 70 72 65 66 69 78 2d 69 6e  sing a prefix-in
23740 64 65 78 20 28 69 66 20 6f 6e 65 20 65 78 69 73  dex (if one exis
23750 74 73 29 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61  ts), .    ** eva
23760 6c 75 61 74 65 20 74 68 65 20 70 72 65 66 69 78  luate the prefix
23770 20 71 75 65 72 79 20 75 73 69 6e 67 20 74 68 65   query using the
23780 20 6d 61 69 6e 20 46 54 53 20 69 6e 64 65 78 2e   main FTS index.
23790 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20   This is used.  
237a0 20 20 2a 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61    ** for interna
237b0 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  l sanity checkin
237c0 67 20 62 79 20 74 68 65 20 69 6e 74 65 67 72 69  g by the integri
237d0 74 79 2d 63 68 65 63 6b 20 69 6e 20 64 65 62 75  ty-check in debu
237e0 67 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f  g .    ** mode o
237f0 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
23800 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69   pConfig->bPrefi
23810 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c  xIndex==0 || (fl
23820 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
23830 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
23840 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
23850 74 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  t( flags & FTS5I
23860 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
23870 58 20 29 3b 0a 20 20 20 20 20 20 69 49 64 78 20  X );.      iIdx 
23880 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  = 1+pConfig->nPr
23890 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  efix;.    }else.
238a0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66  #endif.    if( f
238b0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
238c0 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b  _QUERY_PREFIX ){
238d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72  .      int nChar
238e0 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72   = fts5IndexChar
238f0 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  len(pToken, nTok
23900 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  en);.      for(i
23910 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f  Idx=1; iIdx<=pCo
23920 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
23930 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Idx++){.        
23940 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  if( pConfig->aPr
23950 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43  efix[iIdx-1]==nC
23960 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  har ) break;.   
23970 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23980 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69  if( iIdx<=pConfi
23990 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20  g->nPrefix ){.  
239a0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
239b0 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73  e *pStruct = fts
239c0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
239d0 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  );.      buf.p[0
239e0 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] = FTS5_MAIN_PR
239f0 45 46 49 58 20 2b 20 69 49 64 78 3b 0a 20 20 20  EFIX + iIdx;.   
23a00 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
23a10 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
23a20 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
23a30 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c  truct, 1, flags,
23a40 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
23a50 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 29 3b  , -1, 0, &pRet);
23a60 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72  .        fts5Str
23a70 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
23a80 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  truct);.      }.
23a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23aa0 20 69 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c   int bDesc = (fl
23ab0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
23ac0 51 55 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a  QUERY_DESC)!=0;.
23ad0 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d        buf.p[0] =
23ae0 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
23af0 58 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74  X;.      fts5Set
23b00 75 70 50 72 65 66 69 78 49 74 65 72 28 70 2c 20  upPrefixIter(p, 
23b10 62 44 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54  bDesc, buf.p, nT
23b20 6f 6b 65 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c  oken+1, pColset,
23b30 20 26 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 0a   &pRet);.    }..
23b40 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b      if( p->rc ){
23b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
23b60 73 35 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74  s5IterClose(pRet
23b70 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  );.      pRet = 
23b80 30 3b 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f  0;.      fts5Clo
23b90 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
23ba0 20 7d 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d   }.    *ppIter =
23bb0 20 70 52 65 74 3b 0a 20 20 20 20 73 71 6c 69 74   pRet;.    sqlit
23bc0 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65  e3Fts5BufferFree
23bd0 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (&buf);.  }.  re
23be0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
23bf0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
23c00 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
23c10 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
23c20 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
23c30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20   argument is at 
23c40 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  EOF..*/.int sqli
23c50 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 46  te3Fts5IterEof(F
23c60 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
23c70 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
23c80 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
23c90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
23ca0 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
23cb0 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  bEof;.}../*.** M
23cc0 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
23cd0 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20  matching rowid. 
23ce0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
23cf0 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35  ts5IterNext(Fts5
23d00 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
23d10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
23d20 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
23d30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
23d40 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
23d50 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
23d60 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pIter, 0, 0);.  
23d70 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
23d80 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
23d90 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
23da0 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
23db0 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72   matching term/r
23dc0 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20 74 68  owid. Used by th
23dd0 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75  e fts5vocab modu
23de0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
23df0 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63  e3Fts5IterNextSc
23e00 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  an(Fts5IndexIter
23e10 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
23e20 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72  Index *p = pIter
23e30 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73  ->pIndex;..  ass
23e40 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
23e50 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
23e60 4b 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74  K );..  fts5Mult
23e70 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
23e80 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  er, 0, 0);.  if(
23e90 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23ea0 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  K ){.    Fts5Seg
23eb0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
23ec0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
23ed0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
23ee0 73 74 20 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  st ];.    if( pS
23ef0 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65  eg->pLeaf && pSe
23f00 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54  g->term.p[0]!=FT
23f10 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 29  S5_MAIN_PREFIX )
23f20 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
23f30 52 65 6c 65 61 73 65 28 70 53 65 67 2d 3e 70 4c  Release(pSeg->pL
23f40 65 61 66 29 3b 0a 20 20 20 20 20 20 70 53 65 67  eaf);.      pSeg
23f50 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
23f60 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
23f70 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
23f80 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
23f90 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
23fa0 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
23fb0 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
23fc0 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
23fd0 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
23fe0 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e  or after iMatch.
23ff0 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69   The.** definiti
24000 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74  on of "at or aft
24010 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  er" depends on w
24020 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72  hether this iter
24030 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a  ator iterates.**
24040 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
24050 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
24060 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20  d order..*/.int 
24070 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
24080 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
24090 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 36  xIter *pIter, i6
240a0 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 66 74 73  4 iMatch){.  fts
240b0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72  5MultiIterNextFr
240c0 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  om(pIter->pIndex
240d0 2c 20 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29  , pIter, iMatch)
240e0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
240f0 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
24100 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
24110 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
24120 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f  urrent rowid..*/
24130 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35  .i64 sqlite3Fts5
24140 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e  IterRowid(Fts5In
24150 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
24160 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75  .  return fts5Mu
24170 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
24180 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
24190 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
241a0 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   term..*/.const 
241b0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73  char *sqlite3Fts
241c0 35 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e  5IterTerm(Fts5In
241d0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
241e0 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20  int *pn){.  int 
241f0 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
24200 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
24210 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
24220 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
24230 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72    *pn = n-1;.  r
24240 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a  eturn &z[1];.}..
24250 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
24260 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73  IndexExtractCols
24270 65 74 20 28 0a 20 20 46 74 73 35 43 6f 6c 73 65  et (.  Fts5Colse
24280 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20  t *pColset,     
24290 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74         /* Colset
242a0 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f   to filter on */
242b0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f  .  const u8 *pPo
242c0 73 2c 20 69 6e 74 20 6e 50 6f 73 2c 20 20 20 20  s, int nPos,    
242d0 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c     /* Position l
242e0 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ist */.  Fts5Buf
242f0 66 65 72 20 2a 70 42 75 66 20 20 20 20 20 20 20  fer *pBuf       
24300 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
24310 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
24320 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24330 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  E_OK;.  int i;..
24340 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
24350 28 70 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d  (pBuf);.  for(i=
24360 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43  0; i<pColset->nC
24370 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  ol; i++){.    co
24380 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70  nst u8 *pSub = p
24390 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e 53 75  Pos;.    int nSu
243a0 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74  b = fts5IndexExt
243b0 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e  ractCol(&pSub, n
243c0 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69  Pos, pColset->ai
243d0 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Col[i]);.    if(
243e0 20 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 66   nSub ){.      f
243f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
24400 6c 6f 62 28 26 72 63 2c 20 70 42 75 66 2c 20 6e  lob(&rc, pBuf, n
24410 53 75 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20  Sub, pSub);.    
24420 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
24430 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
24440 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24450 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
24460 6e 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 74  ning a copy of t
24470 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
24480 20 66 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72 72   for.** the curr
24490 65 6e 74 20 65 6e 74 72 79 2e 20 4f 75 74 70 75  ent entry. Outpu
244a0 74 20 76 61 72 69 61 62 6c 65 20 2a 70 6e 20 69  t variable *pn i
244b0 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
244c0 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
244d0 0a 2a 2a 20 69 6e 20 62 79 74 65 73 20 62 65 66  .** in bytes bef
244e0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
244f0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
24500 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  d position list 
24510 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
24520 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20   the "number of 
24530 62 79 74 65 73 22 20 76 61 72 69 6e 74 0a 2a 2a  bytes" varint.**
24540 20 66 69 65 6c 64 20 74 68 61 74 20 73 74 61 72   field that star
24550 74 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  ts the position 
24560 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  list on disk..*/
24570 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24580 49 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46  IterPoslist(.  F
24590 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
245a0 74 65 72 2c 20 0a 20 20 46 74 73 35 43 6f 6c 73  ter, .  Fts5Cols
245b0 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20  et *pColset,    
245c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
245d0 6e 20 66 69 6c 74 65 72 20 28 6f 72 20 4e 55 4c  n filter (or NUL
245e0 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  L) */.  const u8
245f0 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20   **pp,          
24600 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
24610 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74  Pointer to posit
24620 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 2a 2f  ion-list data */
24630 0a 20 20 69 6e 74 20 2a 70 6e 2c 20 20 20 20 20  .  int *pn,     
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
24660 6f 66 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  of position-list
24670 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
24680 36 34 20 2a 70 69 52 6f 77 69 64 20 20 20 20 20  64 *piRowid     
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
246a0 2a 20 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 72  * OUT: Current r
246b0 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  owid */.){.  Fts
246c0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
246d0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
246e0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
246f0 69 46 69 72 73 74 20 5d 3b 0a 20 20 61 73 73 65  iFirst ];.  asse
24700 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
24710 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
24720 20 29 3b 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d   );.  *piRowid =
24730 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20   pSeg->iRowid;. 
24740 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66   if( pSeg->iLeaf
24750 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f  Offset+pSeg->nPo
24760 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  s<=pSeg->pLeaf->
24770 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 75 38  szLeaf ){.    u8
24780 20 2a 70 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e   *pPos = &pSeg->
24790 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69  pLeaf->p[pSeg->i
247a0 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20  LeafOffset];.   
247b0 20 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20   if( pColset==0 
247c0 7c 7c 20 70 49 74 65 72 2d 3e 62 46 69 6c 74 65  || pIter->bFilte
247d0 72 65 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  red ){.      *pn
247e0 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20   = pSeg->nPos;. 
247f0 20 20 20 20 20 2a 70 70 20 3d 20 70 50 6f 73 3b       *pp = pPos;
24800 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
24810 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20  Colset->nCol==1 
24820 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  ){.      *pp = p
24830 50 6f 73 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d  Pos;.      *pn =
24840 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
24850 74 43 6f 6c 28 70 70 2c 20 70 53 65 67 2d 3e 6e  tCol(pp, pSeg->n
24860 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69  Pos, pColset->ai
24870 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c  Col[0]);.    }el
24880 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75  se{.      fts5Bu
24890 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
248a0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  >poslist);.     
248b0 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
248c0 74 43 6f 6c 73 65 74 28 70 43 6f 6c 73 65 74 2c  tColset(pColset,
248d0 20 70 50 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f   pPos, pSeg->nPo
248e0 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  s, &pIter->posli
248f0 73 74 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d  st);.      *pp =
24900 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
24910 70 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 70  p;.      *pn = p
24920 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b  Iter->poslist.n;
24930 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
24940 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
24950 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
24960 73 74 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67  st);.    fts5Seg
24970 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65  iterPoslist(pIte
24980 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c  r->pIndex, pSeg,
24990 20 70 43 6f 6c 73 65 74 2c 20 26 70 49 74 65 72   pColset, &pIter
249a0 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
249b0 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  *pp = pIter->pos
249c0 6c 69 73 74 2e 70 3b 0a 20 20 20 20 2a 70 6e 20  list.p;.    *pn 
249d0 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
249e0 2e 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .n;.  }.  return
249f0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
24a00 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
24a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
24a20 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
24a30 61 72 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ar to sqlite3Fts
24a40 35 49 74 65 72 50 6f 73 6c 69 73 74 28 29 2c 20  5IterPoslist(), 
24a50 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
24a60 2a 20 63 6f 70 69 65 73 20 74 68 65 20 70 6f 73  * copies the pos
24a70 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20  ition list into 
24a80 74 68 65 20 62 75 66 66 65 72 20 73 75 70 70 6c  the buffer suppl
24a90 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ied as the secon
24aa0 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  d .** argument..
24ab0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
24ac0 73 35 49 74 65 72 50 6f 73 6c 69 73 74 42 75 66  s5IterPoslistBuf
24ad0 66 65 72 28 46 74 73 35 49 6e 64 65 78 49 74 65  fer(Fts5IndexIte
24ae0 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 42 75  r *pIter, Fts5Bu
24af0 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 46  ffer *pBuf){.  F
24b00 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49  ts5Index *p = pI
24b10 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 46  ter->pIndex;.  F
24b20 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
24b30 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
24b40 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
24b50 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 61 73  ].iFirst ];.  as
24b60 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
24b70 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
24b80 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29  BufferZero(pBuf)
24b90 3b 0a 20 20 66 74 73 35 53 65 67 69 74 65 72 50  ;.  fts5SegiterP
24ba0 6f 73 6c 69 73 74 28 70 2c 20 70 53 65 67 2c 20  oslist(p, pSeg, 
24bb0 30 2c 20 70 42 75 66 29 3b 0a 20 20 72 65 74 75  0, pBuf);.  retu
24bc0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24bd0 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
24be0 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f  Close an iterato
24bf0 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65  r opened by an e
24c00 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73  arlier call to s
24c10 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
24c20 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  uery()..*/.void 
24c30 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
24c40 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49 74  lose(Fts5IndexIt
24c50 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
24c60 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 46  ( pIter ){.    F
24c70 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  ts5Index *pIndex
24c80 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
24c90 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
24ca0 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70  terFree(pIter->p
24cb0 49 6e 64 65 78 2c 20 70 49 74 65 72 29 3b 0a 20  Index, pIter);. 
24cc0 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
24cd0 65 72 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  er(pIndex);.  }.
24ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
24cf0 64 20 64 65 63 6f 64 65 20 74 68 65 20 22 61 76  d decode the "av
24d00 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 66  erages" record f
24d10 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
24d20 2e 20 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  . .**.** Paramet
24d30 65 72 20 61 6e 53 69 7a 65 20 6d 75 73 74 20 70  er anSize must p
24d40 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79  oint to an array
24d50 20 6f 66 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77   of size nCol, w
24d60 68 65 72 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20  here nCol is.** 
24d70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
24d80 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er defined colum
24d90 6e 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61  ns in the FTS ta
24da0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
24db0 74 65 33 46 74 73 35 49 6e 64 65 78 47 65 74 41  te3Fts5IndexGetA
24dc0 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
24dd0 78 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77  x *p, i64 *pnRow
24de0 2c 20 69 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a  , i64 *anSize){.
24df0 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
24e00 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20  pConfig->nCol;. 
24e10 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
24e20 3b 0a 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b  ;..  *pnRow = 0;
24e30 0a 20 20 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65  .  memset(anSize
24e40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 36 34 29  , 0, sizeof(i64)
24e50 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74   * nCol);.  pDat
24e60 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
24e70 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
24e80 53 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20  S_ROWID);.  if( 
24e90 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
24ea0 20 26 26 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b   && pData->nn ){
24eb0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
24ec0 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
24ed0 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
24ee0 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
24ef0 5d 2c 20 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b  ], (u64*)pnRow);
24f00 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
24f10 20 69 3c 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20   i<pData->nn && 
24f20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  iCol<nCol; iCol+
24f30 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66  +){.      i += f
24f40 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
24f50 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a  ata->p[i], (u64*
24f60 29 26 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b  )&anSize[iCol]);
24f70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
24f80 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
24f90 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  ata);.  return f
24fa0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
24fb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  );.}../*.** Repl
24fc0 61 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ace the current 
24fd0 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
24fe0 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  d with the conte
24ff0 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  nts of the buffe
25000 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61  r .** supplied a
25010 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
25020 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
25030 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
25040 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e  tAverages(Fts5In
25050 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38  dex *p, const u8
25060 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
25070 74 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ta){.  assert( p
25080 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
25090 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
250a0 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41  te(p, FTS5_AVERA
250b0 47 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61  GES_ROWID, pData
250c0 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75  , nData);.  retu
250d0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
250e0 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
250f0 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
25100 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b   number of block
25110 73 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61  s this module ha
25120 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
25130 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20  %_data.** table 
25140 73 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65  since it was cre
25150 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
25160 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61  ite3Fts5IndexRea
25170 64 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ds(Fts5Index *p)
25180 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52  {.  return p->nR
25190 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ead;.}../*.** Se
251a0 74 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f  t the 32-bit coo
251b0 6b 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  kie value stored
251c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
251d0 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a   all structure .
251e0 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ** records to th
251f0 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
25200 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
25210 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ument..**.** Ret
25220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
25230 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
25240 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
25250 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
25260 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
25270 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
25280 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73  dexSetCookie(Fts
25290 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
252a0 4e 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  New){.  int rc; 
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
252d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
252e0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
252f0 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
25300 67 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75  g;    /* Configu
25310 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  ration object */
25320 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d  .  u8 aCookie[4]
25330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25340 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72          /* Binar
25350 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
25360 20 6f 66 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71   of iNew */.  sq
25370 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
25380 62 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  b = 0;..  assert
25390 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
253a0 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  OK );.  sqlite3F
253b0 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b 69 65  ts5Put32(aCookie
253c0 2c 20 69 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d  , iNew);..  rc =
253d0 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
253e0 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  en(pConfig->db, 
253f0 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d  pConfig->zDb, p-
25400 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20  >zDataTbl, .    
25410 20 20 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f    "block", FTS5_
25420 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c  STRUCTURE_ROWID,
25430 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a   1, &pBlob.  );.
25440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25450 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
25460 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42  e3_blob_write(pB
25470 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c  lob, aCookie, 4,
25480 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
25490 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
254a0 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20  (pBlob);.  }..  
254b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
254c0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
254d0 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73  exLoadConfig(Fts
254e0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
254f0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
25500 72 75 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20  ruct;.  pStruct 
25510 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
25520 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74  ead(p);.  fts5St
25530 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
25540 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72  Struct);.  retur
25550 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
25560 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  n(p);.}.../*****
25570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
255a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
255b0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
255c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
255d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
255e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
255f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
25600 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f  ** Below this po
25610 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65  int is the imple
25620 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
25630 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
25640 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69   .** functionali
25650 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ty..*/../*.** Re
25660 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68  turn a simple ch
25670 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73  ecksum value bas
25680 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65  ed on the argume
25690 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  nts..*/.static u
256a0 36 34 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  64 fts5IndexEntr
256b0 79 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52  yCksum(.  i64 iR
256c0 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f  owid, .  int iCo
256d0 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20  l, .  int iPos, 
256e0 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63  .  int iIdx,.  c
256f0 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d  onst char *pTerm
25700 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b  ,.  int nTerm.){
25710 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20  .  int i;.  u64 
25720 72 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  ret = iRowid;.  
25730 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
25740 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d  + iCol;.  ret +=
25750 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73   (ret<<3) + iPos
25760 3b 0a 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20  ;.  if( iIdx>=0 
25770 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33  ) ret += (ret<<3
25780 29 20 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50  ) + (FTS5_MAIN_P
25790 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20  REFIX + iIdx);. 
257a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
257b0 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28  m; i++) ret += (
257c0 72 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b  ret<<3) + pTerm[
257d0 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  i];.  return ret
257e0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
257f0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
25800 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25810 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e  purely an intern
25820 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73  al test. It does
25830 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
25840 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74  to .** FTS funct
25850 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65  ionality, or eve
25860 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  n the integrity-
25870 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61  check, in any wa
25880 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  y..**.** Instead
25890 2c 20 69 74 20 74 65 73 74 73 20 74 68 61 74 20  , it tests that 
258a0 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
258b0 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69  pgno/rowid combi
258c0 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20  nations are .** 
258d0 76 69 73 69 74 65 64 20 72 65 67 61 72 64 6c 65  visited regardle
258e0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
258f0 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
25900 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
25910 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67  rameters.** iSeg
25920 69 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72  id/iLeaf is iter
25930 61 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73  ated in forwards
25940 20 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65   or reverse orde
25950 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
25960 64 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52  d fts5TestDlidxR
25970 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e  everse(.  Fts5In
25980 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69  dex *p, .  int i
25990 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
259a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
259b0 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64  gment id to load
259c0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
259d0 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
259e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
259f0 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
25a00 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
25a10 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  /.){.  Fts5Dlidx
25a20 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
25a30 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d  ;.  u64 cksum1 =
25a40 20 31 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d   13;.  u64 cksum
25a50 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70  2 = 13;..  for(p
25a60 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
25a70 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53  terInit(p, 0, iS
25a80 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20  egid, iLeaf);.  
25a90 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
25aa0 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d  rEof(p, pDlidx)=
25ab0 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  =0;.      fts5Dl
25ac0 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70  idxIterNext(p, p
25ad0 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20  Dlidx).  ){.    
25ae0 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
25af0 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
25b00 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74  pDlidx);.    int
25b10 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64   pgno = fts5Dlid
25b20 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
25b30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25b40 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20  gno>iLeaf );.   
25b50 20 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69   cksum1 += iRowi
25b60 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c  d + ((i64)pgno<<
25b70 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44  32);.  }.  fts5D
25b80 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
25b90 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d  idx);.  pDlidx =
25ba0 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64   0;..  for(pDlid
25bb0 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  x=fts5DlidxIterI
25bc0 6e 69 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64  nit(p, 1, iSegid
25bd0 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , iLeaf);.      
25be0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
25bf0 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
25c00 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
25c10 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64  terPrev(p, pDlid
25c20 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  x).  ){.    i64 
25c30 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69  iRowid = fts5Dli
25c40 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
25c50 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e  dx);.    int pgn
25c60 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
25c70 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
25c80 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44     assert( fts5D
25c90 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
25ca0 69 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20  idx)>iLeaf );.  
25cb0 20 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77    cksum2 += iRow
25cc0 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c  id + ((i64)pgno<
25cd0 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  <32);.  }.  fts5
25ce0 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44  DlidxIterFree(pD
25cf0 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20  lidx);.  pDlidx 
25d00 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
25d10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25d20 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29  cksum1!=cksum2 )
25d30 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
25d40 52 52 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63  RRUPT;.}..static
25d50 20 69 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b   int fts5QueryCk
25d60 73 75 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sum(.  Fts5Index
25d70 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
25d80 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69         /* Fts5 i
25d90 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
25da0 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e   int iIdx,.  con
25db0 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25dd0 49 6e 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65  Index key to que
25de0 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
25df0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
25e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25e10 69 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79  ize of index key
25e20 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
25e30 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e50 2a 20 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35  * Flags for Fts5
25e60 49 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20  IndexQuery */.  
25e70 75 36 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20  u64 *pCksum     
25e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e90 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b  /* IN/OUT: Check
25ea0 73 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  sum value */.){.
25eb0 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70    u64 cksum = *p
25ec0 43 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64  Cksum;.  Fts5Ind
25ed0 65 78 49 74 65 72 20 2a 70 49 64 78 49 74 65 72  exIter *pIdxIter
25ee0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
25ef0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
25f00 78 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20  xQuery(p, z, n, 
25f10 66 6c 61 67 73 2c 20 30 2c 20 26 70 49 64 78 49  flags, 0, &pIdxI
25f20 74 65 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  ter);..  while( 
25f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25f40 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49   0==sqlite3Fts5I
25f50 74 65 72 45 6f 66 28 70 49 64 78 49 74 65 72 29  terEof(pIdxIter)
25f60 20 29 7b 0a 20 20 20 20 69 36 34 20 64 75 6d 6d   ){.    i64 dumm
25f70 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  y;.    const u8 
25f80 2a 70 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e  *pPos;.    int n
25f90 50 6f 73 3b 0a 20 20 20 20 69 36 34 20 72 6f 77  Pos;.    i64 row
25fa0 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  id = sqlite3Fts5
25fb0 49 74 65 72 52 6f 77 69 64 28 70 49 64 78 49 74  IterRowid(pIdxIt
25fc0 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  er);.    rc = sq
25fd0 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
25fe0 6c 69 73 74 28 70 49 64 78 49 74 65 72 2c 20 30  list(pIdxIter, 0
25ff0 2c 20 26 70 50 6f 73 2c 20 26 6e 50 6f 73 2c 20  , &pPos, &nPos, 
26000 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28  &dummy);.    if(
26010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26020 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c  {.      Fts5Posl
26030 69 73 74 52 65 61 64 65 72 20 73 52 65 61 64 65  istReader sReade
26040 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c  r;.      for(sql
26050 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
26060 65 61 64 65 72 49 6e 69 74 28 70 50 6f 73 2c 20  eaderInit(pPos, 
26070 6e 50 6f 73 2c 20 26 73 52 65 61 64 65 72 29 3b  nPos, &sReader);
26080 0a 20 20 20 20 20 20 20 20 20 20 73 52 65 61 64  .          sRead
26090 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20  er.bEof==0;.    
260a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
260b0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65  5PoslistReaderNe
260c0 78 74 28 26 73 52 65 61 64 65 72 29 0a 20 20 20  xt(&sReader).   
260d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
260e0 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f  t iCol = FTS5_PO
260f0 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72  S2COLUMN(sReader
26100 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  .iPos);.        
26110 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53 35 5f  int iOff = FTS5_
26120 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65 61 64  POS2OFFSET(sRead
26130 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  er.iPos);.      
26140 20 20 63 6b 73 75 6d 20 5e 3d 20 66 74 73 35 49    cksum ^= fts5I
26150 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72  ndexEntryCksum(r
26160 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66  owid, iCol, iOff
26170 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20  , iIdx, z, n);. 
26180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
26190 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
261a0 72 4e 65 78 74 28 70 49 64 78 49 74 65 72 29 3b  rNext(pIdxIter);
261b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
261c0 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
261d0 65 28 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20  e(pIdxIter);..  
261e0 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b  *pCksum = cksum;
261f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26200 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26210 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75  ction is also pu
26220 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
26230 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
26240 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
26250 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
26260 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
26270 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
26280 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
26290 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
262a0 66 74 73 35 54 65 73 74 54 65 72 6d 28 0a 20 20  fts5TestTerm(.  
262b0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
262c0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 72   Fts5Buffer *pPr
262d0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
262e0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72   /* Previous ter
262f0 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  m */.  const cha
26300 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20  r *z, int n,    
26310 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
26320 6c 79 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74  ly new term to t
26330 65 73 74 20 2a 2f 0a 20 20 75 36 34 20 65 78 70  est */.  u64 exp
26340 65 63 74 65 64 2c 0a 20 20 75 36 34 20 2a 70 43  ected,.  u64 *pC
26350 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ksum.){.  int rc
26360 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
26370 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20  pPrev->n==0 ){. 
26380 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
26390 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20  (&rc, pPrev, n, 
263a0 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20  (const u8*)z);. 
263b0 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 72 63 3d   }else.  if( rc=
263c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
263d0 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65  Prev->n!=n || me
263e0 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a  mcmp(pPrev->p, z
263f0 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20 75 36 34  , n)) ){.    u64
26400 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75   cksum3 = *pCksu
26410 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  m;.    const cha
26420 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73  r *zTerm = (cons
26430 74 20 63 68 61 72 2a 29 26 70 50 72 65 76 2d 3e  t char*)&pPrev->
26440 70 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73  p[1];  /* term s
26450 61 6e 73 20 70 72 65 66 69 78 2d 62 79 74 65 20  ans prefix-byte 
26460 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  */.    int nTerm
26470 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20   = pPrev->n-1;  
26480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
26490 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79  e of zTerm in by
264a0 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tes */.    int i
264b0 49 64 78 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b  Idx = (pPrev->p[
264c0 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50  0] - FTS5_MAIN_P
264d0 52 45 46 49 58 29 3b 0a 20 20 20 20 69 6e 74 20  REFIX);.    int 
264e0 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d 3d 30  flags = (iIdx==0
264f0 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44 45 58   ? 0 : FTS5INDEX
26500 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29 3b 0a  _QUERY_PREFIX);.
26510 20 20 20 20 75 36 34 20 63 6b 31 20 3d 20 30 3b      u64 ck1 = 0;
26520 0a 20 20 20 20 75 36 34 20 63 6b 32 20 3d 20 30  .    u64 ck2 = 0
26530 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
26540 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73  that the results
26550 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53   returned for AS
26560 43 20 61 6e 64 20 44 45 53 43 20 71 75 65 72 69  C and DESC queri
26570 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  es are.    ** th
26580 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20  e same. If not, 
26590 63 61 6c 6c 20 74 68 69 73 20 63 6f 72 72 75 70  call this corrup
265a0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63  tion.  */.    rc
265b0 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
265c0 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
265d0 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
265e0 26 63 6b 31 29 3b 0a 20 20 20 20 69 66 28 20 72  &ck1);.    if( r
265f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26600 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c        int f = fl
26610 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  ags|FTS5INDEX_QU
26620 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20  ERY_DESC;.      
26630 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
26640 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
26650 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
26660 6b 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  k2);.    }.    i
26670 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26680 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72   && ck1!=ck2 ) r
26690 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
266a0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
266b0 73 20 69 73 20 61 20 70 72 65 66 69 78 20 71 75  s is a prefix qu
266c0 65 72 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ery, check that 
266d0 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75  the results retu
266e0 72 6e 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  rned if the.    
266f0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
26700 64 69 73 61 62 6c 65 64 20 61 72 65 20 74 68 65  disabled are the
26710 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41   same. In both A
26720 53 43 20 61 6e 64 20 44 45 53 43 20 6f 72 64 65  SC and DESC orde
26730 72 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  r. .    **.    *
26740 2a 20 54 68 69 73 20 63 68 65 63 6b 20 6d 61 79  * This check may
26750 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d   only be perform
26760 65 64 20 69 66 20 74 68 65 20 68 61 73 68 20 74  ed if the hash t
26770 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 54  able is empty. T
26780 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  his.    ** is be
26790 63 61 75 73 65 20 74 68 65 20 68 61 73 68 20 74  cause the hash t
267a0 61 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  able only suppor
267b0 74 73 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e  ts a single scan
267c0 20 71 75 65 72 79 20 61 74 0a 20 20 20 20 2a 2a   query at.    **
267d0 20 61 20 74 69 6d 65 2c 20 61 6e 64 20 74 68 65   a time, and the
267e0 20 6d 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70   multi-iter loop
267f0 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 69 73   from which this
26800 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26810 6c 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c  led.    ** is al
26820 72 65 61 64 79 20 70 65 72 66 6f 72 6d 69 6e 67  ready performing
26830 20 73 75 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f   such a scan. */
26840 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e  .    if( p->nPen
26850 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20  dingData==0 ){. 
26860 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20       if( iIdx>0 
26870 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
26880 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
26890 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
268a0 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
268b0 4f 49 44 58 3b 0a 20 20 20 20 20 20 20 20 63 6b  OIDX;.        ck
268c0 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  2 = 0;.        r
268d0 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73  c = fts5QueryCks
268e0 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72  um(p, iIdx, zTer
268f0 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b  m, nTerm, f, &ck
26900 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
26910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26920 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
26930 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
26940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26950 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53   iIdx>0 && rc==S
26960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26970 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
26980 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
26990 59 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53  Y_TEST_NOIDX|FTS
269a0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
269b0 43 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d  C;.        ck2 =
269c0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
269d0 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
269e0 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
269f0 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b  nTerm, f, &ck2);
26a00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
26a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
26a20 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54  1!=ck2 ) rc = FT
26a30 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
26a40 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63    }.    }..    c
26a50 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20  ksum3 ^= ck1;.  
26a60 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
26a70 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28  &rc, pPrev, n, (
26a80 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20  const u8*)z);.. 
26a90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26aa0 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d  E_OK && cksum3!=
26ab0 65 78 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20  expected ){.    
26ac0 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52    rc = FTS5_CORR
26ad0 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  UPT;.    }.    *
26ae0 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b  pCksum = cksum3;
26af0 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72  .  }.  p->rc = r
26b00 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64  c;.}. .#else.# d
26b10 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 44 6c  efine fts5TestDl
26b20 69 64 78 52 65 76 65 72 73 65 28 78 2c 79 2c 7a  idxReverse(x,y,z
26b30 29 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54  ).# define fts5T
26b40 65 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c  estTerm(u,v,w,x,
26b50 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
26b60 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a  ** Check that:.*
26b70 2a 0a 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65  *.**   1) All le
26b80 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74  aves of pSeg bet
26b90 77 65 65 6e 20 69 46 69 72 73 74 20 61 6e 64 20  ween iFirst and 
26ba0 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65  iLast (inclusive
26bb0 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20  ) exist and.**  
26bc0 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f      contain zero
26bd0 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20   terms..**   2) 
26be0 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53  All leaves of pS
26bf0 65 67 20 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f  eg between iNoRo
26c00 77 69 64 20 61 6e 64 20 69 4c 61 73 74 20 28 69  wid and iLast (i
26c10 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20  nclusive) exist 
26c20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74  and.**      cont
26c30 61 69 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e  ain zero rowids.
26c40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26c50 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
26c60 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20  tyCheckEmpty(.  
26c70 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
26c80 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
26c90 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
26ca0 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68  /* Segment to ch
26cb0 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e  eck internal con
26cc0 73 69 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e  sistency */.  in
26cd0 74 20 69 46 69 72 73 74 2c 0a 20 20 69 6e 74 20  t iFirst,.  int 
26ce0 69 4e 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20  iNoRowid,.  int 
26cf0 69 4c 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69  iLast.){.  int i
26d00 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63  ;..  /* Now chec
26d10 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e  k that the iter.
26d20 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f  nEmpty leaves fo
26d30 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72  llowing the curr
26d40 65 6e 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61  ent leaf.  ** (a
26d50 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20  ) exist and (b) 
26d60 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
26d70 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69  . */.  for(i=iFi
26d80 72 73 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  rst; p->rc==SQLI
26d90 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73  TE_OK && i<=iLas
26da0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  t; i++){.    Fts
26db0 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 66  5Data *pLeaf = f
26dc0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
26dd0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
26de0 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  D(pSeg->iSegid, 
26df0 69 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  i));.    if( pLe
26e00 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  af ){.      if( 
26e10 21 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c  !fts5LeafIsTerml
26e20 65 73 73 28 70 4c 65 61 66 29 20 29 20 70 2d 3e  ess(pLeaf) ) p->
26e30 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
26e40 54 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d  T;.      if( i>=
26e50 69 4e 6f 52 6f 77 69 64 20 26 26 20 30 21 3d 66  iNoRowid && 0!=f
26e60 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
26e70 64 4f 66 66 28 70 4c 65 61 66 29 20 29 20 70 2d  dOff(pLeaf) ) p-
26e80 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
26e90 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  PT;.    }.    ft
26ea0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
26eb0 65 61 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  eaf);.  }.}..sta
26ec0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 74  tic void fts5Int
26ed0 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78  egrityCheckPgidx
26ee0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
26ef0 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b  ts5Data *pLeaf){
26f00 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20  .  int iTermOff 
26f10 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a  = 0;.  int ii;..
26f20 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
26f30 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46  1 = {0,0,0};.  F
26f40 74 73 35 42 75 66 66 65 72 20 62 75 66 32 20 3d  ts5Buffer buf2 =
26f50 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69 20   {0,0,0};..  ii 
26f60 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  = pLeaf->szLeaf;
26f70 0a 20 20 77 68 69 6c 65 28 20 69 69 3c 70 4c 65  .  while( ii<pLe
26f80 61 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72 63 3d  af->nn && p->rc=
26f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26fa0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69    int res;.    i
26fb0 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74  nt iOff;.    int
26fc0 20 6e 49 6e 63 72 3b 0a 0a 20 20 20 20 69 69 20   nIncr;..    ii 
26fd0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
26fe0 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 69 5d  32(&pLeaf->p[ii]
26ff0 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69 54  , nIncr);.    iT
27000 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b  ermOff += nIncr;
27010 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
27020 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69  mOff;..    if( i
27030 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
27040 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  af ){.      p->r
27050 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
27060 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
27070 69 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20  iTermOff==nIncr 
27080 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
27090 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  te;.      iOff +
270a0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
270b0 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
270c0 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
270d0 20 69 66 28 20 28 69 4f 66 66 2b 6e 42 79 74 65   if( (iOff+nByte
270e0 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  )>pLeaf->szLeaf 
270f0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
27100 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
27110 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27120 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
27130 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  Set(&p->rc, &buf
27140 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66  1, nByte, &pLeaf
27150 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  ->p[iOff]);.    
27160 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
27170 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 2c 20       int nKeep, 
27180 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66  nByte;.      iOf
27190 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
271a0 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
271b0 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
271c0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
271d0 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
271e0 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79  af->p[iOff], nBy
271f0 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  te);.      if( n
27200 4b 65 65 70 3e 62 75 66 31 2e 6e 20 7c 7c 20 28  Keep>buf1.n || (
27210 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61  iOff+nByte)>pLea
27220 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
27230 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
27240 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
27250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27260 62 75 66 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a  buf1.n = nKeep;.
27270 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
27280 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
27290 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74  >rc, &buf1, nByt
272a0 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  e, &pLeaf->p[iOf
272b0 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  f]);.      }..  
272c0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
272d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
272e0 20 20 20 20 72 65 73 20 3d 20 66 74 73 35 42 75      res = fts5Bu
272f0 66 66 65 72 43 6f 6d 70 61 72 65 28 26 62 75 66  fferCompare(&buf
27300 31 2c 20 26 62 75 66 32 29 3b 0a 20 20 20 20 20  1, &buf2);.     
27310 20 20 20 69 66 28 20 72 65 73 3c 3d 30 20 29 20     if( res<=0 ) 
27320 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
27330 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
27340 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
27350 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62  erSet(&p->rc, &b
27360 75 66 32 2c 20 62 75 66 31 2e 6e 2c 20 62 75 66  uf2, buf1.n, buf
27370 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  1.p);.  }..  fts
27380 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
27390 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  1);.  fts5Buffer
273a0 46 72 65 65 28 26 62 75 66 32 29 3b 0a 7d 0a 0a  Free(&buf2);.}..
273b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
273c0 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
273d0 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  eckSegment(.  Ft
273e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27400 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
27410 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
27420 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
27430 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
27440 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e  ment to check in
27450 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e  ternal consisten
27460 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43  cy */.){.  Fts5C
27470 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
27480 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73   p->pConfig;.  s
27490 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
274a0 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  mt = 0;.  int rc
274b0 32 3b 0a 20 20 69 6e 74 20 69 49 64 78 50 72 65  2;.  int iIdxPre
274c0 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67  vLeaf = pSeg->pg
274d0 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74  noFirst-1;.  int
274e0 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20   iDlidxPrevLeaf 
274f0 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
27500 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70  ;..  if( pSeg->p
27510 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20 72 65  gnoFirst==0 ) re
27520 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64  turn;..  fts5Ind
27530 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
27540 20 26 70 53 74 6d 74 2c 20 73 71 6c 69 74 65 33   &pStmt, sqlite3
27550 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
27560 22 53 45 4c 45 43 54 20 73 65 67 69 64 2c 20 74  "SELECT segid, t
27570 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20  erm, (pgno>>1), 
27580 28 70 67 6e 6f 26 31 29 20 46 52 4f 4d 20 25 51  (pgno&1) FROM %Q
27590 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20  .'%q_idx' WHERE 
275a0 73 65 67 69 64 3d 25 64 22 2c 0a 20 20 20 20 20  segid=%d",.     
275b0 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
275c0 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70  Config->zName, p
275d0 53 65 67 2d 3e 69 53 65 67 69 64 0a 20 20 29 29  Seg->iSegid.  ))
275e0 3b 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20  ;..  /* Iterate 
275f0 74 68 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72  through the b-tr
27600 65 65 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a  ee hierarchy.  *
27610 2f 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  /.  while( p->rc
27620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
27630 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
27640 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
27650 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20  {.    i64 iRow; 
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27670 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
27680 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20   this leaf */.  
27690 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
276a0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
276b0 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73  /* Data for this
276c0 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 20 20 69 6e   leaf */..    in
276d0 74 20 6e 49 64 78 54 65 72 6d 20 3d 20 73 71 6c  t nIdxTerm = sql
276e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
276f0 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  s(pStmt, 1);.   
27700 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
27710 78 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63  xTerm = (const c
27720 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
27730 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
27740 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 49 64 78  1);.    int iIdx
27750 4c 65 61 66 20 3d 20 73 71 6c 69 74 65 33 5f 63  Leaf = sqlite3_c
27760 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
27770 20 32 29 3b 0a 20 20 20 20 69 6e 74 20 62 49 64   2);.    int bId
27780 78 44 6c 69 64 78 20 3d 20 73 71 6c 69 74 65 33  xDlidx = sqlite3
27790 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
277a0 74 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  t, 3);..    /* I
277b0 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75  f the leaf in qu
277c0 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  estion has alrea
277d0 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20  dy been trimmed 
277e0 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74  from the segment
277f0 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65  , .    ** ignore
27800 20 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74   this b-tree ent
27810 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  ry. Otherwise, l
27820 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  oad it into memo
27830 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ry. */.    if( i
27840 49 64 78 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67  IdxLeaf<pSeg->pg
27850 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e  noFirst ) contin
27860 75 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46  ue;.    iRow = F
27870 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
27880 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  D(pSeg->iSegid, 
27890 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 70  iIdxLeaf);.    p
278a0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
278b0 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20  ead(p, iRow);.  
278c0 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
278d0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
278e0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  Check that the l
278f0 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  eaf contains at 
27900 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20  least one term, 
27910 61 6e 64 20 74 68 61 74 20 69 74 20 69 73 20 65  and that it is e
27920 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f  qual.    ** to o
27930 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  r larger than th
27940 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a  e split-key in z
27950 49 64 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63  IdxTerm.  Also c
27960 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65  heck that if the
27970 72 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73  re.    ** is als
27980 6f 20 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65  o a rowid pointe
27990 72 20 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61  r within the lea
279a0 66 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 69  f page header, i
279b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20  t points to a.  
279c0 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65    ** location be
279d0 66 6f 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20  fore the term.  
279e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  */.    if( pLeaf
279f0 2d 3e 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c  ->nn<=pLeaf->szL
27a00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  eaf ){.      p->
27a10 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
27a20 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
27a30 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20      int iOff;   
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a50 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
27a60 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20  st term on leaf 
27a70 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f  */.      int iRo
27a80 77 69 64 4f 66 66 3b 20 20 20 20 20 20 20 20 20  widOff;         
27a90 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
27aa0 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
27ab0 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69   leaf */.      i
27ac0 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
27ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
27ae0 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65  ze of term on le
27af0 61 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  af in bytes */. 
27b00 20 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20       int res;   
27b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f   /* Comparison o
27b30 66 20 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74  f term and split
27b40 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69  -key */..      i
27b50 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69  Off = fts5LeafFi
27b60 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66  rstTermOff(pLeaf
27b70 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f  );.      iRowidO
27b80 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
27b90 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
27ba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  );.      if( iRo
27bb0 77 69 64 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a  widOff>=iOff ){.
27bc0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
27bd0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
27be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27bf0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
27c00 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
27c10 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
27c20 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  m);.        res 
27c30 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d  = memcmp(&pLeaf-
27c40 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65  >p[iOff], zIdxTe
27c50 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e  rm, MIN(nTerm, n
27c60 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  IdxTerm));.     
27c70 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
27c80 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49  res = nTerm - nI
27c90 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
27ca0 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72  if( res<0 ) p->r
27cb0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
27cc0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27cd0 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
27ce0 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65 61  eckPgidx(p, pLea
27cf0 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  f);.    }.    ft
27d00 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
27d10 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eaf);.    if( p-
27d20 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 0a 20  >rc ) break;... 
27d30 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20     /* Now check 
27d40 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45  that the iter.nE
27d50 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c  mpty leaves foll
27d60 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  owing the curren
27d70 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61  t leaf.    ** (a
27d80 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20  ) exist and (b) 
27d90 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
27da0 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64  . */.    fts5Ind
27db0 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
27dc0 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20 70  Empty(.        p
27dd0 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72 65 76  , pSeg, iIdxPrev
27de0 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72  Leaf+1, iDlidxPr
27df0 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65  evLeaf+1, iIdxLe
27e00 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20  af-1.    );.    
27e10 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61  if( p->rc ) brea
27e20 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  k;..    /* If th
27e30 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
27e40 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68  -index, check th
27e50 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68  at it looks righ
27e60 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  t. */.    if( bI
27e70 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  dxDlidx ){.     
27e80 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
27e90 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20  pDlidx = 0;  /* 
27ea0 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
27eb0 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e  rough doclist in
27ec0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
27ed0 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64   iPrevLeaf = iId
27ee0 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74  xLeaf;.      int
27ef0 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e   iSegid = pSeg->
27f00 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e  iSegid;.      in
27f10 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20  t iPg = 0;.     
27f20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20   i64 iKey;..    
27f30 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
27f40 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
27f50 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64  , 0, iSegid, iId
27f60 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  xLeaf);.        
27f70 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
27f80 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
27f90 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
27fa0 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
27fb0 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29   pDlidx).      )
27fc0 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  {..        /* Ch
27fd0 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65  eck any rowid-le
27fe0 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63  ss pages that oc
27ff0 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63  cur before the c
28000 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a  urrent leaf. */.
28010 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
28020 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67  iPrevLeaf+1; iPg
28030 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67  <fts5DlidxIterPg
28040 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b  no(pDlidx); iPg+
28050 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b  +){.          iK
28060 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ey = FTS5_SEGMEN
28070 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
28080 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iPg);.          
28090 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
280a0 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
280b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
280c0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
280d0 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 46 69    if( fts5LeafFi
280e0 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
280f0 66 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  f)!=0 ) p->rc = 
28100 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
28110 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
28120 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
28130 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
28140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28150 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35  iPrevLeaf = fts5
28160 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
28170 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20  lidx);..        
28180 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
28190 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69  e leaf page indi
281a0 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
281b0 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  rator really doe
281c0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  s.        ** con
281d0 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73  tain the rowid s
281e0 75 67 67 65 73 74 65 64 20 62 79 20 74 68 65 20  uggested by the 
281f0 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  same. */.       
28200 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
28210 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
28220 64 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20  d, iPrevLeaf);. 
28230 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
28240 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
28250 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
28260 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
28270 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b       i64 iRowid;
28280 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
28290 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c  RowidOff = fts5L
282a0 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
282b0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
282c0 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46     ASSERT_SZLEAF
282d0 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  _OK(pLeaf);.    
282e0 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
282f0 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
28300 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
28310 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
28320 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
28330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28340 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
28350 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
28360 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
28370 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
28380 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21       if( iRowid!
28390 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  =fts5DlidxIterRo
283a0 77 69 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d  wid(pDlidx) ) p-
283b0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
283c0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
283d0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
283e0 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
283f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28400 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64    }..      iDlid
28410 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b  xPrevLeaf = iPg;
28420 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
28430 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
28440 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65 73 74  ;.      fts5Test
28450 44 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c 20  DlidxReverse(p, 
28460 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
28470 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
28480 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65      iDlidxPrevLe
28490 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  af = pSeg->pgnoL
284a0 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  ast;.      /* TO
284b0 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20  DO: Check there 
284c0 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e  is no doclist in
284d0 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  dex */.    }..  
284e0 20 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d    iIdxPrevLeaf =
284f0 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a   iIdxLeaf;.  }..
28500 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
28510 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
28520 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
28530 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
28540 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67  = rc2;..  /* Pag
28550 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73  e iter.iLeaf mus
28560 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67  t now be the rig
28570 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65  htmost leaf-page
28580 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20   in the segment 
28590 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70  */.#if 0.  if( p
285a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
285b0 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70  && iter.iLeaf!=p
285c0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
285d0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
285e0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23  5_CORRUPT;.  }.#
285f0 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
28600 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  Run internal che
28610 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  cks to ensure th
28620 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  at the FTS index
28630 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c   (a) is internal
28640 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e  ly .** consisten
28650 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
28660 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77  ns entries for w
28670 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20  hich the XOR of 
28680 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a  the checksums.**
28690 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62   as calculated b
286a0 79 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  y fts5IndexEntry
286b0 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d  Cksum() is cksum
286c0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
286d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
286e0 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65   any of the inte
286f0 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c  rnal checks fail
28700 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63  , or if the.** c
28710 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74  hecksum does not
28720 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53   match. Return S
28730 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20  QLITE_OK if all 
28740 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74 68  checks pass with
28750 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72  out.** error, or
28760 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69   some other SQLi
28770 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
28780 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28   another error (
28790 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63  e.g. OOM).** occ
287a0 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
287b0 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65  te3Fts5IndexInte
287c0 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49  grityCheck(Fts5I
287d0 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73  ndex *p, u64 cks
287e0 75 6d 29 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d  um){.  u64 cksum
287f0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
28800 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
28810 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74  um based on cont
28820 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20  ents of indexes 
28830 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
28840 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30  poslist = {0,0,0
28850 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75  };   /* Buffer u
28860 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f  sed to hold a po
28870 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 49  slist */.  Fts5I
28880 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 3b  ndexIter *pIter;
28890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
288a0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
288b0 72 6f 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64  rough entire ind
288c0 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ex */.  Fts5Stru
288d0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20  cture *pStruct; 
288e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
288f0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20   structure */.. 
28900 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74 72   /* Used by extr
28910 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73  a internal tests
28920 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45   only run if NDE
28930 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
28940 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75  ed */.  u64 cksu
28950 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  m3 = 0;         
28960 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
28970 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e  sum based on con
28980 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73  tents of indexes
28990 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
289a0 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b   term = {0,0,0};
289b0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
289c0 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73  used to hold mos
289d0 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f  t recent term */
289e0 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  .  .  /* Load th
289f0 65 20 46 54 53 20 69 6e 64 65 78 20 73 74 72 75  e FTS index stru
28a00 63 74 75 72 65 20 2a 2f 0a 20 20 70 53 74 72 75  cture */.  pStru
28a10 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
28a20 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a  reRead(p);..  /*
28a30 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
28a40 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f  internal nodes o
28a50 66 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d  f each segment m
28a60 61 74 63 68 20 74 68 65 20 6c 65 61 76 65 73 20  atch the leaves 
28a70 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  */.  if( pStruct
28a80 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
28a90 2c 20 69 53 65 67 3b 0a 20 20 20 20 66 6f 72 28  , iSeg;.    for(
28aa0 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
28ab0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
28ac0 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72  vl++){.      for
28ad0 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
28ae0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
28af0 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
28b00 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
28b10 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
28b20 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74  *pSeg = &pStruct
28b30 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
28b40 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
28b50 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65     fts5IndexInte
28b60 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e  grityCheckSegmen
28b70 74 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20  t(p, pSeg);.    
28b80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
28b90 20 2f 2a 20 54 68 65 20 63 6b 73 75 6d 20 61 72   /* The cksum ar
28ba0 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
28bb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
28bc0 73 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  s a checksum cal
28bd0 63 75 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61 73  culated.  ** bas
28be0 65 64 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74  ed on all expect
28bf0 65 64 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ed entries in th
28c00 65 20 46 54 53 20 69 6e 64 65 78 20 28 69 6e 63  e FTS index (inc
28c10 6c 75 64 69 6e 67 20 70 72 65 66 69 78 20 69 6e  luding prefix in
28c20 64 65 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73  dex.  ** entries
28c30 29 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 68  ). This block ch
28c40 65 63 6b 73 20 74 68 61 74 20 61 20 63 68 65 63  ecks that a chec
28c50 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 20  ksum calculated 
28c60 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a  based on the.  *
28c70 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74  * actual content
28c80 73 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 69  s of FTS index i
28c90 73 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a  s identical..  *
28ca0 2a 0a 20 20 2a 2a 20 54 77 6f 20 76 65 72 73 69  *.  ** Two versi
28cb0 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ons of the same 
28cc0 63 68 65 63 6b 73 75 6d 20 61 72 65 20 63 61 6c  checksum are cal
28cd0 63 75 6c 61 74 65 64 2e 20 54 68 65 20 66 69 72  culated. The fir
28ce0 73 74 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76  st (stack.  ** v
28cf0 61 72 69 61 62 6c 65 20 63 6b 73 75 6d 32 29 20  ariable cksum2) 
28d00 62 61 73 65 64 20 6f 6e 20 65 6e 74 72 69 65 73  based on entries
28d10 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
28d20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
28d30 64 65 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64  dex.  ** while d
28d40 6f 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63  oing a linear sc
28d50 61 6e 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76  an of each indiv
28d60 69 64 75 61 6c 20 69 6e 64 65 78 20 69 6e 20 74  idual index in t
28d70 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  urn. .  **.  ** 
28d80 41 73 20 65 61 63 68 20 74 65 72 6d 20 76 69 73  As each term vis
28d90 69 74 65 64 20 62 79 20 74 68 65 20 6c 69 6e 65  ited by the line
28da0 61 72 20 73 63 61 6e 73 2c 20 61 20 73 65 70 61  ar scans, a sepa
28db0 72 61 74 65 20 71 75 65 72 79 20 66 6f 72 20 74  rate query for t
28dc0 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65 72  he.  ** same ter
28dd0 6d 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  m is performed. 
28de0 63 6b 73 75 6d 33 20 69 73 20 63 61 6c 63 75 6c  cksum3 is calcul
28df0 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
28e00 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65  e entries.  ** e
28e10 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65 73  xtracted by thes
28e20 65 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  e queries..  */.
28e30 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49    for(fts5MultiI
28e40 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63  terNew(p, pStruc
28e50 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  t, 0, 0, 0, 0, -
28e60 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20  1, 0, &pIter);. 
28e70 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
28e80 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
28e90 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
28ea0 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
28eb0 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
28ec0 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  .    int n;     
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ee0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
28ef0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
28f00 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20 20   i64 iPos = 0;  
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f20 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66 72  Position read fr
28f30 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20  om poslist */.  
28f40 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20    int iOff = 0; 
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f60 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 70   Offset within p
28f70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 36  oslist */.    i6
28f80 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d  4 iRowid = fts5M
28f90 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
28fa0 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ter);.    char *
28fb0 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d  z = (char*)fts5M
28fc0 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74  ultiIterTerm(pIt
28fd0 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a  er, &n);..    /*
28fe0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 65   If this is a ne
28ff0 77 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f  w term, query fo
29000 72 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73  r it. Update cks
29010 75 6d 33 20 77 69 74 68 20 74 68 65 20 72 65 73  um3 with the res
29020 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73  ults. */.    fts
29030 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65  5TestTerm(p, &te
29040 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32  rm, z, n, cksum2
29050 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 20  , &cksum3);..   
29060 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a   poslist.n = 0;.
29070 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50      fts5SegiterP
29080 6f 73 6c 69 73 74 28 70 2c 20 26 70 49 74 65 72  oslist(p, &pIter
29090 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46  ->aSeg[pIter->aF
290a0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 20  irst[1].iFirst] 
290b0 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a  , 0, &poslist);.
290c0 20 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71      while( 0==sq
290d0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
290e0 4e 65 78 74 36 34 28 70 6f 73 6c 69 73 74 2e 70  Next64(poslist.p
290f0 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f  , poslist.n, &iO
29100 66 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20 20  ff, &iPos) ){.  
29110 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46      int iCol = F
29120 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69  TS5_POS2COLUMN(i
29130 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Pos);.      int 
29140 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50  iTokOff = FTS5_P
29150 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b  OS2OFFSET(iPos);
29160 0a 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d  .      cksum2 ^=
29170 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
29180 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f  ksum(iRowid, iCo
29190 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20  l, iTokOff, -1, 
291a0 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  z, n);.    }.  }
291b0 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  .  fts5TestTerm(
291c0 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20  p, &term, 0, 0, 
291d0 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29  cksum2, &cksum3)
291e0 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ;..  fts5MultiIt
291f0 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29  erFree(p, pIter)
29200 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
29210 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
29220 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  m!=cksum2 ) p->r
29230 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
29240 3b 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  ;..  fts5Structu
29250 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
29260 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  t);.  fts5Buffer
29270 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 66  Free(&term);.  f
29280 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
29290 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  oslist);.  retur
292a0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
292b0 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n(p);.}.../*.** 
292c0 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20 72 65  Calculate and re
292d0 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
292e0 74 68 61 74 20 69 73 20 74 68 65 20 58 4f 52 20  that is the XOR 
292f0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
29300 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 6f  ry.** checksum o
29310 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 74 68  f all entries th
29320 61 74 20 77 6f 75 6c 64 20 62 65 20 67 65 6e 65  at would be gene
29330 72 61 74 65 64 20 62 79 20 74 68 65 20 74 6f 6b  rated by the tok
29340 65 6e 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  en specified.** 
29350 62 79 20 74 68 65 20 66 69 6e 61 6c 20 35 20 61  by the final 5 a
29360 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34  rguments..*/.u64
29370 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
29380 78 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 43 6f  xCksum(.  Fts5Co
29390 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20  nfig *pConfig,  
293a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
293b0 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63  figuration objec
293c0 74 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  t */.  i64 iRowi
293d0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
293e0 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65         /* Docume
293f0 6e 74 20 74 65 72 6d 20 61 70 70 65 61 72 73 20  nt term appears 
29400 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  in */.  int iCol
29410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29420 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
29430 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69  n term appears i
29440 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c  n */.  int iPos,
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29460 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
29470 6f 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73 20  on term appears 
29480 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  in */.  const ch
29490 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  ar *pTerm, int n
294a0 54 65 72 6d 20 20 20 20 2f 2a 20 54 65 72 6d 20  Term    /* Term 
294b0 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20  at iPos */.){.  
294c0 75 36 34 20 72 65 74 20 3d 20 30 3b 20 20 20 20  u64 ret = 0;    
294d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294e0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
294f0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20  */.  int iIdx;  
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29510 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72       /* For iter
29520 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e  ating through in
29530 64 65 78 65 73 20 2a 2f 0a 0a 20 20 72 65 74 20  dexes */..  ret 
29540 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  = fts5IndexEntry
29550 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43  Cksum(iRowid, iC
29560 6f 6c 2c 20 69 50 6f 73 2c 20 30 2c 20 70 54 65  ol, iPos, 0, pTe
29570 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 66  rm, nTerm);..  f
29580 6f 72 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c  or(iIdx=0; iIdx<
29590 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
295a0 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69  ; iIdx++){.    i
295b0 6e 74 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49  nt nByte = fts5I
295c0 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
295d0 65 6c 65 6e 28 70 54 65 72 6d 2c 20 6e 54 65 72  elen(pTerm, nTer
295e0 6d 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  m, pConfig->aPre
295f0 66 69 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20  fix[iIdx]);.    
29600 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
29610 20 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e     ret ^= fts5In
29620 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52  dexEntryCksum(iR
29630 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
29640 2c 20 69 49 64 78 2b 31 2c 20 70 54 65 72 6d 2c  , iIdx+1, pTerm,
29650 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
29660 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74   }..  return ret
29670 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
29680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
296c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
29710 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69  low this point i
29720 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
29730 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35  tion of the fts5
29740 5f 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72  _decode() scalar
29750 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  .** function onl
29760 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  y..*/../*.** Dec
29770 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61  ode a segment-da
29780 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68  ta rowid from th
29790 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20  e %_data table. 
297a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
297b0 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65  .** the opposite
297c0 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53   of macro FTS5_S
297d0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a  EGMENT_ROWID()..
297e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
297f0 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a  ts5DecodeRowid(.
29800 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
29810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29820 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20    /* Rowid from 
29830 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
29840 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20    int *piSegid, 
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29860 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e    /* OUT: Segmen
29870 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  t id */.  int *p
29880 62 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20  bDlidx,         
29890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
298a0 3a 20 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a  : Dlidx flag */.
298b0 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c    int *piHeight,
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298d0 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74    /* OUT: Height
298e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e   */.  int *piPgn
298f0 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
29900 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61        /* OUT: Pa
29910 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
29920 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74    *piPgno = (int
29930 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
29940 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
29950 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a  _PAGE_B) - 1));.
29960 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
29970 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a  5_DATA_PAGE_B;..
29980 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69    *piHeight = (i
29990 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
299a0 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
299b0 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31  TA_HEIGHT_B) - 1
299c0 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
299d0 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48   FTS5_DATA_HEIGH
299e0 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78  T_B;..  *pbDlidx
299f0 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
29a00 26 20 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f  & 0x0001);.  iRo
29a10 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
29a20 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53  A_DLI_B;..  *piS
29a30 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f  egid = (int)(iRo
29a40 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
29a50 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  < FTS5_DATA_ID_B
29a60 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74  ) - 1));.}..stat
29a70 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
29a80 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c  gRowid(int *pRc,
29a90 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
29aa0 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20  f, i64 iKey){.  
29ab0 69 6e 74 20 69 53 65 67 69 64 2c 20 69 48 65 69  int iSegid, iHei
29ac0 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69  ght, iPgno, bDli
29ad0 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  dx;       /* Row
29ae0 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f  id compenents */
29af0 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
29b00 69 64 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64  id(iKey, &iSegid
29b10 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69  , &bDlidx, &iHei
29b20 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
29b30 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
29b40 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d  {.    if( iKey==
29b50 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
29b60 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  WID ){.      sql
29b70 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
29b80 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
29b90 70 42 75 66 2c 20 22 7b 61 76 65 72 61 67 65 73  pBuf, "{averages
29ba0 7d 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  } ");.    }else{
29bb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
29bc0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
29bd0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
29be0 22 7b 73 74 72 75 63 74 75 72 65 7d 22 29 3b 0a  "{structure}");.
29bf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65      }.  }.  else
29c00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
29c10 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
29c20 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
29c30 7b 25 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64  {%ssegid=%d h=%d
29c40 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20   pgno=%d}",.    
29c50 20 20 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c      bDlidx ? "dl
29c60 69 64 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67  idx " : "", iSeg
29c70 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67  id, iHeight, iPg
29c80 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  no.    );.  }.}.
29c90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
29ca0 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
29cb0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cd0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
29ce0 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
29cf0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
29d00 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
29d10 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c  *p.){.  int iLvl
29d20 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  , iSeg;         
29d30 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
29d40 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
29d50 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a  s, segments */..
29d60 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
29d70 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  vl<p->nLevel; iL
29d80 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53  vl++){.    Fts5S
29d90 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
29da0 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c  Lvl = &p->aLevel
29db0 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69  [iLvl];.    sqli
29dc0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
29dd0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
29de0 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20  Buf, .        " 
29df0 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25  {lvl=%d nMerge=%
29e00 64 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c  d nSeg=%d", iLvl
29e10 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20  , pLvl->nMerge, 
29e20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29  pLvl->nSeg.    )
29e30 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30  ;.    for(iSeg=0
29e40 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65  ; iSeg<pLvl->nSe
29e50 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
29e60 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
29e70 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
29e80 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
29e90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
29ea0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
29eb0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
29ec0 20 22 20 7b 69 64 3d 25 64 20 6c 65 61 76 65 73   " {id=%d leaves
29ed0 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20  =%d..%d}", .    
29ee0 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67        pSeg->iSeg
29ef0 69 64 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  id, pSeg->pgnoFi
29f00 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  rst, pSeg->pgnoL
29f10 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ast.      );.   
29f20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
29f30 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
29f40 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
29f50 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  "}");.  }.}../*.
29f60 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20  ** This is part 
29f70 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
29f80 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61  de() debugging a
29f90 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  id..**.** Argume
29fa0 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20  nts pBlob/nBlob 
29fb0 63 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c  contain a serial
29fc0 69 7a 65 64 20 46 74 73 35 53 74 72 75 63 74 75  ized Fts5Structu
29fd0 72 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a  re object. This.
29fe0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
29ff0 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  nds a human-read
2a000 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
2a010 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ion of the same 
2a020 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65  object.** to the
2a030 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 61   buffer passed a
2a040 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2a050 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  ument. .*/.stati
2a060 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2a070 65 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  eStructure(.  in
2a080 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a0a0 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2a0b0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2a0c0 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e  fer *pBuf,.  con
2a0d0 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e  st u8 *pBlob, in
2a0e0 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74  t nBlob.){.  int
2a0f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a110 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2a120 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
2a130 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
2a140 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75   /* Decoded stru
2a150 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cture object */.
2a160 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75  .  rc = fts5Stru
2a170 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f  ctureDecode(pBlo
2a180 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29  b, nBlob, 0, &p)
2a190 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2a1a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
2a1b0 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  c = rc;.    retu
2a1c0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  rn;.  }..  fts5D
2a1d0 65 62 75 67 53 74 72 75 63 74 75 72 65 28 70 52  ebugStructure(pR
2a1e0 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66  c, pBuf, p);.  f
2a1f0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
2a200 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ase(p);.}../*.**
2a210 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66   This is part of
2a220 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
2a230 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64  () debugging aid
2a240 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
2a250 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f  s pBlob/nBlob co
2a260 6e 74 61 69 6e 20 61 6e 20 22 61 76 65 72 61 67  ntain an "averag
2a270 65 73 22 20 72 65 63 6f 72 64 2e 20 54 68 69 73  es" record. This
2a280 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70   function .** ap
2a290 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65  pends a human-re
2a2a0 61 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74  adable represent
2a2b0 61 74 69 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20  ation of record 
2a2c0 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 61  to the buffer pa
2a2d0 73 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20  ssed .** as the 
2a2e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2a2f0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
2a300 20 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61   fts5DecodeAvera
2a310 67 65 73 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ges(.  int *pRc,
2a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a330 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2a340 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : error code */.
2a350 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
2a360 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  uf,.  const u8 *
2a370 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62  pBlob, int nBlob
2a380 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  .){.  int i = 0;
2a390 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a3a0 53 70 61 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77  Space = "";..  w
2a3b0 68 69 6c 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b  hile( i<nBlob ){
2a3c0 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20  .    u64 iVal;. 
2a3d0 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46     i += sqlite3F
2a3e0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
2a3f0 6c 6f 62 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a  lob[i], &iVal);.
2a400 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2a410 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2a420 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 25 73  f(pRc, pBuf, "%s
2a430 25 64 22 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e  %d", zSpace, (in
2a440 74 29 69 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70  t)iVal);.    zSp
2a450 61 63 65 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d  ace = " ";.  }.}
2a460 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28  ../*.** Buffer (
2a470 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20  a/n) is assumed 
2a480 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73  to contain a lis
2a490 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20  t of serialized 
2a4a0 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a  varints. Read.**
2a4b0 20 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64   each varint and
2a4c0 20 61 70 70 65 6e 64 20 69 74 73 20 73 74 72 69   append its stri
2a4d0 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
2a4e0 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  n to buffer pBuf
2a4f0 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65  . Return.** afte
2a500 72 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 70  r either the inp
2a510 75 74 20 62 75 66 66 65 72 20 69 73 20 65 78 68  ut buffer is exh
2a520 61 75 73 74 65 64 20 6f 72 20 61 20 30 20 76 61  austed or a 0 va
2a530 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  lue is read..**.
2a540 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2a550 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
2a560 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20  r of bytes read 
2a570 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
2a580 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
2a590 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50   int fts5DecodeP
2a5a0 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c  oslist(int *pRc,
2a5b0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2a5c0 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  f, const u8 *a, 
2a5d0 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f  int n){.  int iO
2a5e0 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ff = 0;.  while(
2a5f0 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
2a600 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66  nt iVal;.    iOf
2a610 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2a620 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69  nt32(&a[iOff], i
2a630 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
2a640 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2a650 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2a660 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c 29 3b  f, " %d", iVal);
2a670 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f  .  }.  return iO
2a680 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ff;.}../*.** The
2a690 20 73 74 61 72 74 20 6f 66 20 62 75 66 66 65 72   start of buffer
2a6a0 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20   (a/n) contains 
2a6b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 64  the start of a d
2a6c0 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f 63 6c  oclist. The docl
2a6d0 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61  ist.** may or ma
2a6e0 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77 69 74  y not finish wit
2a6f0 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20  hin the buffer. 
2a700 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70  This function ap
2a710 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a 20  pends a text.** 
2a720 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2a730 66 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68  f the part of th
2a740 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 69  e doclist that i
2a750 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62 75 66  s present to buf
2a760 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a  fer.** pBuf. .**
2a770 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2a780 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
2a790 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
2a7a0 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
2a7b0 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  buffer..*/.stati
2a7c0 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65  c int fts5Decode
2a7d0 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70 52 63  Doclist(int *pRc
2a7e0 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
2a7f0 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c  uf, const u8 *a,
2a800 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20 69   int n){.  i64 i
2a810 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74  Docid = 0;.  int
2a820 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66   iOff = 0;..  if
2a830 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66  ( n>0 ){.    iOf
2a840 66 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47  f = sqlite3Fts5G
2a850 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34  etVarint(a, (u64
2a860 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  *)&iDocid);.    
2a870 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2a880 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2a890 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c  c, pBuf, " id=%l
2a8a0 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20  ld", iDocid);.  
2a8b0 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c  }.  while( iOff<
2a8c0 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f  n ){.    int nPo
2a8d0 73 3b 0a 20 20 20 20 69 6e 74 20 62 44 75 6d 6d  s;.    int bDumm
2a8e0 79 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  y;.    iOff += f
2a8f0 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
2a900 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  e(&a[iOff], &nPo
2a910 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
2a920 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63   iOff += fts5Dec
2a930 6f 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c 20  odePoslist(pRc, 
2a940 70 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  pBuf, &a[iOff], 
2a950 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73  MIN(n-iOff, nPos
2a960 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66  ));.    if( iOff
2a970 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  <n ){.      i64 
2a980 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f  iDelta;.      iO
2a990 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
2a9a0 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
2a9b0 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
2a9c0 74 61 29 3b 0a 20 20 20 20 20 20 69 44 6f 63 69  ta);.      iDoci
2a9d0 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
2a9e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2a9f0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2aa00 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64  (pRc, pBuf, " id
2aa10 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b  =%lld", iDocid);
2aa20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2aa30 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
2aa40 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
2aa50 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
2aa60 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
2aa70 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f  nction fts5_deco
2aa80 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de()..*/.static 
2aa90 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46  void fts5DecodeF
2aaa0 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
2aab0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2aac0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
2aad0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
2aae0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
2aaf0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2ab00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ab10 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
2ab20 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
2ab30 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
2ab40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2ab50 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
2ab60 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f   */.){.  i64 iRo
2ab70 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2ab80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2ab90 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69  d for record bei
2aba0 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
2abb0 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69 67  int iSegid,iHeig
2abc0 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b  ht,iPgno,bDlidx;
2abd0 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65  /* Rowid compone
2abe0 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  nts */.  const u
2abf0 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b  8 *aBlob; int n;
2ac00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f           /* Reco
2ac10 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rd to decode */.
2ac20 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46    u8 *a = 0;.  F
2ac30 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20  ts5Buffer s;    
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac50 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20  * Build up text 
2ac60 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a  to return here *
2ac70 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2ac80 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2ac90 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2aca0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  de */.  int nSpa
2acb0 63 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ce = 0;..  asser
2acc0 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20  t( nArg==2 );.  
2acd0 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69  memset(&s, 0, si
2ace0 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
2acf0 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71  );.  iRowid = sq
2ad00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
2ad10 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20  4(apVal[0]);..  
2ad20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
2ad30 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
2ad40 75 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29 20 69  ument (a blob) i
2ad50 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65 20 61  n aBlob[]. The a
2ad60 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79  Blob[].  ** copy
2ad70 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   is followed by 
2ad80 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
2ad90 41 44 44 49 4e 47 20 30 78 30 30 20 62 79 74 65  ADDING 0x00 byte
2ada0 73 2c 20 77 68 69 63 68 20 70 72 65 76 65 6e 74  s, which prevent
2adb0 73 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 6f 76  s.  ** buffer ov
2adc0 65 72 72 65 61 64 73 20 65 76 65 6e 20 69 66 20  erreads even if 
2add0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  the record is co
2ade0 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d  rrupt.  */.  n =
2adf0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
2ae00 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  ytes(apVal[1]);.
2ae10 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    aBlob = sqlite
2ae20 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56  3_value_blob(apV
2ae30 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61 63 65  al[1]);.  nSpace
2ae40 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41   = n + FTS5_DATA
2ae50 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20  _ZERO_PADDING;. 
2ae60 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65   a = (u8*)sqlite
2ae70 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
2ae80 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20  &rc, nSpace);.  
2ae90 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20  if( a==0 ) goto 
2aea0 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65  decode_out;.  me
2aeb0 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e  mcpy(a, aBlob, n
2aec0 29 3b 0a 0a 0a 20 20 66 74 73 35 44 65 63 6f 64  );...  fts5Decod
2aed0 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26  eRowid(iRowid, &
2aee0 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c  iSegid, &bDlidx,
2aef0 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e   &iHeight, &iPgn
2af00 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67  o);..  fts5Debug
2af10 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69  Rowid(&rc, &s, i
2af20 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44  Rowid);.  if( bD
2af30 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35  lidx ){.    Fts5
2af40 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20  Data dlidx;.    
2af50 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c  Fts5DlidxLvl lvl
2af60 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d  ;..    dlidx.p =
2af70 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e   a;.    dlidx.nn
2af80 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65   = n;..    memse
2af90 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(&lvl, 0, sizeo
2afa0 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
2afb0 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20  ;.    lvl.pData 
2afc0 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76  = &dlidx;.    lv
2afd0 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50  l.iLeafPgno = iP
2afe0 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74  gno;..    for(ft
2aff0 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
2b000 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d  lvl); lvl.bEof==
2b010 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  0; fts5DlidxLvlN
2b020 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20  ext(&lvl)){.    
2b030 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2b040 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2b050 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20  &rc, &s, .      
2b060 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c      " %d(%lld)",
2b070 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20   lvl.iLeafPgno, 
2b080 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20  lvl.iRowid.     
2b090 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
2b0a0 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20  e if( iSegid==0 
2b0b0 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  ){.    if( iRowi
2b0c0 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  d==FTS5_AVERAGES
2b0d0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
2b0e0 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67  fts5DecodeAverag
2b0f0 65 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e  es(&rc, &s, a, n
2b100 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2b110 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53 74      fts5DecodeSt
2b120 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c  ructure(&rc, &s,
2b130 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   a, n);.    }.  
2b140 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42  }else{.    Fts5B
2b150 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
2b160 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
2b170 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72  ent term read fr
2b180 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  om page */.    i
2b190 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20  nt szLeaf;      
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b1b0 4f 66 66 73 65 74 20 6f 66 20 70 67 69 64 78 20  Offset of pgidx 
2b1c0 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  in a[] */.    in
2b1d0 74 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20 20  t iPgidxOff;.   
2b1e0 20 69 6e 74 20 69 50 67 69 64 78 50 72 65 76 20   int iPgidxPrev 
2b1f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2b200 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * Previous value
2b210 20 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64 78   read from pgidx
2b220 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65 72   */.    int iTer
2b230 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mOff = 0;.    in
2b240 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b  t iRowidOff = 0;
2b250 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
2b260 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b     int nDoclist;
2b270 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65  ..    memset(&te
2b280 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  rm, 0, sizeof(Ft
2b290 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
2b2a0 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20   if( n<4 ){.    
2b2b0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2b2c0 66 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20  ferSet(&rc, &s, 
2b2d0 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63  7, (const u8*)"c
2b2e0 6f 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20  orrupt");.      
2b2f0 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b  goto decode_out;
2b300 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b310 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
2b320 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b  s5GetU16(&a[0]);
2b330 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66  .      iPgidxOff
2b340 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35   = szLeaf = fts5
2b350 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20  GetU16(&a[2]);. 
2b360 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f       if( iPgidxO
2b370 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
2b380 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2b390 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69  &a[iPgidxOff], i
2b3a0 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20  TermOff);.      
2b3b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2b3c0 44 65 63 6f 64 65 20 74 68 65 20 70 6f 73 69 74  Decode the posit
2b3d0 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20 61 74  ion list tail at
2b3e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2b3f0 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66  e page */.    if
2b400 28 20 69 52 6f 77 69 64 4f 66 66 21 3d 30 20 29  ( iRowidOff!=0 )
2b410 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  {.      iOff = i
2b420 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65  RowidOff;.    }e
2b430 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
2b440 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66  !=0 ){.      iOf
2b450 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  f = iTermOff;.  
2b460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2b470 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  Off = szLeaf;.  
2b480 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f    }.    fts5Deco
2b490 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26  dePoslist(&rc, &
2b4a0 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34  s, &a[4], iOff-4
2b4b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64  );..    /* Decod
2b4c0 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69  e any more docli
2b4d0 73 74 20 64 61 74 61 20 74 68 61 74 20 61 70 70  st data that app
2b4e0 65 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ears on the page
2b4f0 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
2b500 2a 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a  ** first term. *
2b510 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d  /.    nDoclist =
2b520 20 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54 65   (iTermOff ? iTe
2b530 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29 20  rmOff : szLeaf) 
2b540 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35  - iOff;.    fts5
2b550 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72  DecodeDoclist(&r
2b560 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
2b570 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20   nDoclist);..   
2b580 20 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66   while( iPgidxOf
2b590 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  f<n ){.      int
2b5a0 20 62 46 69 72 73 74 20 3d 20 28 69 50 67 69 64   bFirst = (iPgid
2b5b0 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20  xOff==szLeaf);  
2b5c0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66     /* True for f
2b5d0 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67  irst term on pag
2b5e0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
2b5f0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b610 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74   /* Bytes of dat
2b620 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  a */.      int i
2b630 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  End;.      .    
2b640 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66    iPgidxOff += f
2b650 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2b660 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42  a[iPgidxOff], nB
2b670 79 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67 69  yte);.      iPgi
2b680 64 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b  dxPrev += nByte;
2b690 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 50  .      iOff = iP
2b6a0 67 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20 20  gidxPrev;..     
2b6b0 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
2b6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
2b6d0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
2b6e0 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65  PgidxOff], nByte
2b6f0 29 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20  );.        iEnd 
2b700 3d 20 69 50 67 69 64 78 50 72 65 76 20 2b 20 6e  = iPgidxPrev + n
2b710 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Byte;.      }els
2b720 65 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20  e{.        iEnd 
2b730 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20  = szLeaf;.      
2b740 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 62 46 69  }..      if( bFi
2b750 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
2b760 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2b770 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
2b780 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
2b790 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79      term.n = nBy
2b7a0 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
2b7b0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2b7c0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
2b7d0 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
2b7e0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
2b7f0 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72  ndBlob(&rc, &ter
2b800 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66  m, nByte, &a[iOf
2b810 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  f]);.      iOff 
2b820 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20  += nByte;..     
2b830 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2b840 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a  erAppendPrintf(.
2b850 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
2b860 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
2b870 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
2b880 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
2b890 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66     );.      iOff
2b8a0 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f   += fts5DecodeDo
2b8b0 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
2b8c0 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f  a[iOff], iEnd-iO
2b8d0 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ff);.    }..    
2b8e0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
2b8f0 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64  term);.  }.  . d
2b900 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c  ecode_out:.  sql
2b910 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
2b920 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b930 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2b940 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
2b950 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
2b960 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45  s.p, s.n, SQLITE
2b970 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
2b980 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
2b990 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
2b9a0 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20  ode(pCtx, rc);. 
2b9b0 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
2b9c0 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree(&s);.}../*.*
2b9d0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
2b9e0 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
2b9f0 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
2ba00 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28  tion fts5_rowid(
2ba10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2ba20 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74  d fts5RowidFunct
2ba30 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
2ba40 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
2ba50 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2ba60 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
2ba70 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2baa0 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32  f args (always 2
2bab0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) */.  sqlite3_v
2bac0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
2bad0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2bae0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
2baf0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2bb00 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72  *zArg;.  if( nAr
2bb10 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  g==0 ){.    sqli
2bb20 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2bb30 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62  (pCtx, "should b
2bb40 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75  e: fts5_rowid(su
2bb50 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d  bject, ....)", -
2bb60 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
2bb70 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63   zArg = (const c
2bb80 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
2bb90 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
2bba0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  );.    if( 0==sq
2bbb0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
2bbc0 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29  rg, "segment") )
2bbd0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
2bbe0 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65  id;.      int se
2bbf0 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20  gid, pgno;.     
2bc00 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a   if( nArg!=3 ){.
2bc10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2bc20 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
2bc30 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  x, .            
2bc40 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35  "should be: fts5
2bc50 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27  _rowid('segment'
2bc60 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29 22  , segid, pgno))"
2bc70 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a  , -1.        );.
2bc80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2bc90 20 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c       segid = sql
2bca0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
2bcb0 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20  pVal[1]);.      
2bcc0 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33    pgno = sqlite3
2bcd0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
2bce0 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52  [2]);.        iR
2bcf0 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
2bd00 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
2bd10 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
2bd20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2bd30 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69  nt64(pCtx, iRowi
2bd40 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
2bd50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2bd60 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2bd70 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
2bd80 20 22 66 69 72 73 74 20 61 72 67 20 74 6f 20 66   "first arg to f
2bd90 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74  ts5_rowid() must
2bda0 20 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20 2c   be 'segment'" ,
2bdb0 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   -1.      );.   
2bdc0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2bdd0 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
2bde0 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74  s part of regist
2bdf0 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d  ering the FTS5 m
2be00 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62  odule with datab
2be10 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
2be20 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65  n db. It registe
2be30 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d  rs several user-
2be40 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
2be50 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a  unctions useful.
2be60 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a  ** with FTS5..**
2be70 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2be80 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
2be90 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2bea0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f  error occurs, so
2beb0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69  me other.** SQLi
2bec0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2bed0 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
2bee0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2bef0 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73  3Fts5IndexInit(s
2bf00 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
2bf10 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
2bf20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
2bf30 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35  .      db, "fts5
2bf40 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c  _decode", 2, SQL
2bf50 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
2bf60 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c  5DecodeFunction,
2bf70 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28   0, 0.  );.  if(
2bf80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bf90 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2bfa0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
2bfb0 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20  on(.        db, 
2bfc0 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31  "fts5_rowid", -1
2bfd0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
2bfe0 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74  , fts5RowidFunct
2bff0 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  ion, 0, 0.    );
2c000 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c010 3b 0a 7d 0a 0a                                   ;.}..