/ Hex Artifact Content
Login

Artifact 71d5ce47464f176e8708c7ec02d18613eb5eebda:


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 23 69 66  s5Int.h..*/..#if
0280: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
0290: 45 5f 46 54 53 35 0a 0a 23 69 6e 63 6c 75 64 65  E_FTS5..#include
02a0: 20 22 66 74 73 35 49 6e 74 2e 68 22 0a 0a 2f 2a   "fts5Int.h"../*
02b0: 0a 2a 2a 20 4f 76 65 72 76 69 65 77 3a 0a 2a 2a  .** Overview:.**
02c0: 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74  .** The %_data t
02d0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c  able contains al
02e0: 6c 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 65  l the FTS indexe
02f0: 73 20 66 6f 72 20 61 6e 20 46 54 53 35 20 76 69  s for an FTS5 vi
0300: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  rtual table..** 
0310: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  As well as the m
0320: 61 69 6e 20 74 65 72 6d 20 69 6e 64 65 78 2c 20  ain term index, 
0330: 74 68 65 72 65 20 6d 61 79 20 62 65 20 75 70 20  there may be up 
0340: 74 6f 20 33 31 20 70 72 65 66 69 78 20 69 6e 64  to 31 prefix ind
0350: 65 78 65 73 2e 0a 2a 2a 20 54 68 65 20 66 6f 72  exes..** The for
0360: 6d 61 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74  mat is similar t
0370: 6f 20 46 54 53 33 2f 34 2c 20 65 78 63 65 70 74  o FTS3/4, except
0380: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
0390: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d 74   all segment b-t
03a0: 72 65 65 20 6c 65 61 66 20 64 61 74 61 20 69 73  ree leaf data is
03b0: 20 73 74 6f 72 65 64 20 69 6e 20 66 69 78 65 64   stored in fixed
03c0: 20 73 69 7a 65 20 70 61 67 65 20 72 65 63 6f 72   size page recor
03d0: 64 73 20 0a 2a 2a 20 20 20 20 20 28 65 2e 67 2e  ds .**     (e.g.
03e0: 20 31 30 30 30 20 62 79 74 65 73 29 2e 20 41 20   1000 bytes). A 
03f0: 73 69 6e 67 6c 65 20 64 6f 63 6c 69 73 74 20 6d  single doclist m
0400: 61 79 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65  ay span multiple
0410: 20 70 61 67 65 73 2e 20 43 61 72 65 20 69 73 20   pages. Care is 
0420: 0a 2a 2a 20 20 20 20 20 74 61 6b 65 6e 20 74 6f  .**     taken to
0430: 20 65 6e 73 75 72 65 20 69 74 20 69 73 20 70 6f   ensure it is po
0440: 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72 61 74  ssible to iterat
0450: 65 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  e in either dire
0460: 63 74 69 6f 6e 20 74 68 72 6f 75 67 68 20 0a 2a  ction through .*
0470: 2a 20 20 20 20 20 74 68 65 20 65 6e 74 72 69 65  *     the entrie
0480: 73 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2c 20  s in a doclist, 
0490: 6f 72 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 20  or to seek to a 
04a0: 73 70 65 63 69 66 69 63 20 65 6e 74 72 79 20 77  specific entry w
04b0: 69 74 68 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20  ithin a .**     
04c0: 64 6f 63 6c 69 73 74 2c 20 77 69 74 68 6f 75 74  doclist, without
04d0: 20 6c 6f 61 64 69 6e 67 20 69 74 20 69 6e 74 6f   loading it into
04e0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
04f0: 20 2a 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74   * large doclist
0500: 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
0510: 20 70 61 67 65 73 20 68 61 76 65 20 61 73 73 6f   pages have asso
0520: 63 69 61 74 65 64 20 22 64 6f 63 6c 69 73 74 20  ciated "doclist 
0530: 69 6e 64 65 78 22 0a 2a 2a 20 20 20 20 20 72 65  index".**     re
0540: 63 6f 72 64 73 20 74 68 61 74 20 63 6f 6e 74 61  cords that conta
0550: 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  in a copy of the
0560: 20 66 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20   first docid on 
0570: 65 61 63 68 20 70 61 67 65 20 73 70 61 6e 6e 65  each page spanne
0580: 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20  d by.**     the 
0590: 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 20 69 73  doclist. This is
05a0: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
05b0: 70 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  p seek operation
05c0: 73 2c 20 61 6e 64 20 6d 65 72 67 65 73 20 6f 66  s, and merges of
05d0: 0a 2a 2a 20 20 20 20 20 6c 61 72 67 65 20 64 6f  .**     large do
05e0: 63 6c 69 73 74 73 20 77 69 74 68 20 76 65 72 79  clists with very
05f0: 20 73 6d 61 6c 6c 20 64 6f 63 6c 69 73 74 73 2e   small doclists.
0600: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 65 78 74 72 61  .**.**   * extra
0610: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 22   fields in the "
0620: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
0630: 22 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  " record the sta
0640: 74 65 20 6f 66 20 6f 6e 67 6f 69 6e 67 0a 2a 2a  te of ongoing.**
0650: 20 20 20 20 20 69 6e 63 72 65 6d 65 6e 74 61 6c       incremental
0660: 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
0670: 73 2e 0a 2a 2a 0a 2a 2f 0a 0a 0a 23 64 65 66 69  s..**.*/...#defi
0680: 6e 65 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b  ne FTS5_OPT_WORK
0690: 5f 55 4e 49 54 20 20 31 30 30 30 20 20 2f 2a 20  _UNIT  1000  /* 
06a0: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
06b0: 61 67 65 73 20 70 65 72 20 6f 70 74 69 6d 69 7a  ages per optimiz
06c0: 65 20 73 74 65 70 20 2a 2f 0a 23 64 65 66 69 6e  e step */.#defin
06d0: 65 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54  e FTS5_WORK_UNIT
06e0: 20 20 20 20 20 20 36 34 20 20 20 20 2f 2a 20 4e        64    /* N
06f0: 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
0700: 67 65 73 20 69 6e 20 75 6e 69 74 20 6f 66 20 77  ges in unit of w
0710: 6f 72 6b 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ork */..#define 
0720: 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
0730: 49 5a 45 20 34 20 20 20 20 20 2f 2a 20 41 64 64  IZE 4     /* Add
0740: 20 64 6c 69 64 78 20 69 66 20 74 68 69 73 20 6d   dlidx if this m
0750: 61 6e 79 20 65 6d 70 74 79 20 70 61 67 65 73 20  any empty pages 
0760: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
0770: 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 27 30 27  _MAIN_PREFIX '0'
0780: 0a 0a 23 69 66 20 46 54 53 35 5f 4d 41 58 5f 50  ..#if FTS5_MAX_P
0790: 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20 3e 20  REFIX_INDEXES > 
07a0: 33 31 0a 23 20 65 72 72 6f 72 20 22 46 54 53 35  31.# error "FTS5
07b0: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
07c0: 58 45 53 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  XES is too large
07d0: 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ".#endif../*.** 
07e0: 44 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 54  Details:.**.** T
07f0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
0800: 6d 61 6e 61 67 65 64 20 62 79 20 74 68 69 73 20  managed by this 
0810: 6d 6f 64 75 6c 65 2c 0a 2a 2a 0a 2a 2a 20 20 20  module,.**.**   
0820: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
0830: 5f 64 61 74 61 28 69 64 20 49 4e 54 45 47 45 52  _data(id INTEGER
0840: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c   PRIMARY KEY, bl
0850: 6f 63 6b 20 42 4c 4f 42 29 3b 0a 2a 2a 0a 2a 2a  ock BLOB);.**.**
0860: 20 2c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20   , contains the 
0870: 66 6f 6c 6c 6f 77 69 6e 67 20 35 20 74 79 70 65  following 5 type
0880: 73 20 6f 66 20 72 65 63 6f 72 64 73 2e 20 53 65  s of records. Se
0890: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 73  e the comments s
08a0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 74 68  urrounding.** th
08b0: 65 20 46 54 53 35 5f 2a 5f 52 4f 57 49 44 20 6d  e FTS5_*_ROWID m
08c0: 61 63 72 6f 73 20 62 65 6c 6f 77 20 66 6f 72 20  acros below for 
08d0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
08e0: 20 68 6f 77 20 25 5f 64 61 74 61 20 72 6f 77 69   how %_data rowi
08f0: 64 73 20 61 72 65 20 0a 2a 2a 20 61 73 73 69 67  ds are .** assig
0900: 6e 65 64 20 74 6f 20 65 61 63 68 20 66 6f 20 74  ned to each fo t
0910: 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 31 2e 20 53 74  hem..**.** 1. St
0920: 72 75 63 74 75 72 65 20 52 65 63 6f 72 64 73 3a  ructure Records:
0930: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 73 65 74  .**.**   The set
0940: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 68 61   of segments tha
0950: 74 20 6d 61 6b 65 20 75 70 20 61 6e 20 69 6e 64  t make up an ind
0960: 65 78 20 2d 20 74 68 65 20 69 6e 64 65 78 20 73  ex - the index s
0970: 74 72 75 63 74 75 72 65 20 2d 20 61 72 65 0a 2a  tructure - are.*
0980: 2a 20 20 20 72 65 63 6f 72 64 65 64 20 69 6e 20  *   recorded in 
0990: 61 20 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20  a single record 
09a0: 77 69 74 68 69 6e 20 74 68 65 20 25 5f 64 61 74  within the %_dat
09b0: 61 20 74 61 62 6c 65 2e 20 54 68 65 20 72 65 63  a table. The rec
09c0: 6f 72 64 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  ord consists.** 
09d0: 20 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 33 32    of a single 32
09e0: 2d 62 69 74 20 63 6f 6e 66 69 67 75 72 61 74 69  -bit configurati
09f0: 6f 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  on cookie value 
0a00: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 6c 69  followed by a li
0a10: 73 74 20 6f 66 20 0a 2a 2a 20 20 20 53 51 4c 69  st of .**   SQLi
0a20: 74 65 20 76 61 72 69 6e 74 73 2e 20 49 66 20 74  te varints. If t
0a30: 68 65 20 46 54 53 20 74 61 62 6c 65 20 66 65 61  he FTS table fea
0a40: 74 75 72 65 73 20 6d 6f 72 65 20 74 68 61 6e 20  tures more than 
0a50: 6f 6e 65 20 69 6e 64 65 78 20 28 62 65 63 61 75  one index (becau
0a60: 73 65 0a 2a 2a 20 20 20 74 68 65 72 65 20 61 72  se.**   there ar
0a70: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 70 72  e one or more pr
0a80: 65 66 69 78 20 69 6e 64 65 78 65 73 29 2c 20 69  efix indexes), i
0a90: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
0aa0: 74 68 61 74 20 61 6c 6c 20 73 68 61 72 65 0a 2a  that all share.*
0ab0: 2a 20 20 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  *   the same coo
0ac0: 6b 69 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  kie value..**.**
0ad0: 20 20 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 66     Immediately f
0ae0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6e  ollowing the con
0af0: 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69  figuration cooki
0b00: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 62 65  e, the record be
0b10: 67 69 6e 73 20 77 69 74 68 0a 2a 2a 20 20 20 74  gins with.**   t
0b20: 68 72 65 65 20 76 61 72 69 6e 74 73 3a 0a 2a 2a  hree varints:.**
0b30: 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d 62 65 72  .**     + number
0b40: 20 6f 66 20 6c 65 76 65 6c 73 2c 0a 2a 2a 20 20   of levels,.**  
0b50: 20 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65     + total numbe
0b60: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e  r of segments on
0b70: 20 61 6c 6c 20 6c 65 76 65 6c 73 2c 0a 2a 2a 20   all levels,.** 
0b80: 20 20 20 20 2b 20 76 61 6c 75 65 20 6f 66 20 77      + value of w
0b90: 72 69 74 65 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  rite counter..**
0ba0: 0a 2a 2a 20 20 20 54 68 65 6e 2c 20 66 6f 72 20  .**   Then, for 
0bb0: 65 61 63 68 20 6c 65 76 65 6c 20 66 72 6f 6d 20  each level from 
0bc0: 30 20 74 6f 20 6e 4d 61 78 3a 0a 2a 2a 0a 2a 2a  0 to nMax:.**.**
0bd0: 20 20 20 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66       + number of
0be0: 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
0bf0: 69 6e 20 6f 6e 67 6f 69 6e 67 20 6d 65 72 67 65  in ongoing merge
0c00: 2e 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ..**     + total
0c10: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0c20: 6e 74 73 20 69 6e 20 6c 65 76 65 6c 2e 0a 2a 2a  nts in level..**
0c30: 20 20 20 20 20 2b 20 66 6f 72 20 65 61 63 68 20       + for each 
0c40: 73 65 67 6d 65 6e 74 20 66 72 6f 6d 20 6f 6c 64  segment from old
0c50: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 3a 0a 2a  est to newest:.*
0c60: 2a 20 20 20 20 20 20 20 20 20 2b 20 73 65 67 6d  *         + segm
0c70: 65 6e 74 20 69 64 20 28 61 6c 77 61 79 73 20 3e  ent id (always >
0c80: 20 30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b   0).**         +
0c90: 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 20 28   b-tree height (
0ca0: 31 20 2d 3e 20 72 6f 6f 74 20 69 73 20 6c 65 61  1 -> root is lea
0cb0: 66 2c 20 32 20 2d 3e 20 72 6f 6f 74 20 69 73 20  f, 2 -> root is 
0cc0: 70 61 72 65 6e 74 20 6f 66 20 6c 65 61 66 20 65  parent of leaf e
0cd0: 74 63 2e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  tc.).**         
0ce0: 2b 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67  + first leaf pag
0cf0: 65 20 6e 75 6d 62 65 72 20 28 6f 66 74 65 6e 20  e number (often 
0d00: 31 2c 20 61 6c 77 61 79 73 20 67 72 65 61 74 65  1, always greate
0d10: 72 20 74 68 61 6e 20 30 29 0a 2a 2a 20 20 20 20  r than 0).**    
0d20: 20 20 20 20 20 2b 20 66 69 6e 61 6c 20 6c 65 61       + final lea
0d30: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a  f page number.**
0d40: 0a 2a 2a 20 32 2e 20 54 68 65 20 41 76 65 72 61  .** 2. The Avera
0d50: 67 65 73 20 52 65 63 6f 72 64 3a 0a 2a 2a 0a 2a  ges Record:.**.*
0d60: 2a 20 20 20 41 20 73 69 6e 67 6c 65 20 72 65 63  *   A single rec
0d70: 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65 20 25  ord within the %
0d80: 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 65  _data table. The
0d90: 20 64 61 74 61 20 69 73 20 61 20 6c 69 73 74 20   data is a list 
0da0: 6f 66 20 76 61 72 69 6e 74 73 2e 0a 2a 2a 20 20  of varints..**  
0db0: 20 54 68 65 20 66 69 72 73 74 20 76 61 6c 75 65   The first value
0dc0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
0dd0: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  f rows in the in
0de0: 64 65 78 2e 20 54 68 65 6e 2c 20 66 6f 72 20 65  dex. Then, for e
0df0: 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20  ach column.**   
0e00: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
0e10: 68 74 2c 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ht, the total nu
0e20: 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69  mber of tokens i
0e30: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  n the column for
0e40: 20 61 6c 6c 20 0a 2a 2a 20 20 20 72 6f 77 73 20   all .**   rows 
0e50: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
0e60: 0a 2a 2a 20 33 2e 20 53 65 67 6d 65 6e 74 20 6c  .** 3. Segment l
0e70: 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  eaves:.**.**   T
0e80: 45 52 4d 20 44 4f 43 4c 49 53 54 20 46 4f 52 4d  ERM DOCLIST FORM
0e90: 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4d 6f  AT:.**.**     Mo
0ea0: 73 74 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65  st of each segme
0eb0: 6e 74 20 6c 65 61 66 20 69 73 20 74 61 6b 65 6e  nt leaf is taken
0ec0: 20 75 70 20 62 79 20 74 65 72 6d 2f 64 6f 63 6c   up by term/docl
0ed0: 69 73 74 20 64 61 74 61 2e 20 54 68 65 20 0a 2a  ist data. The .*
0ee0: 2a 20 20 20 20 20 67 65 6e 65 72 61 6c 20 66 6f  *     general fo
0ef0: 72 6d 61 74 20 6f 66 20 74 68 65 20 74 65 72 6d  rmat of the term
0f00: 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 69 73  /doclist data is
0f10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
0f20: 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20 6f 66  varint : size of
0f30: 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a 20 20   first term.**  
0f40: 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20 20 20         blob:    
0f50: 66 69 72 73 74 20 74 65 72 6d 20 64 61 74 61 0a  first term data.
0f60: 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63 6c 69  **         docli
0f70: 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c 69 73  st: first doclis
0f80: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72  t.**         zer
0f90: 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20  o-or-more {.**  
0fa0: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
0fb0: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    number of byte
0fc0: 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68  s in common with
0fd0: 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 0a 2a   previous term.*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69  *           vari
0ff0: 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62  nt:  number of b
1000: 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d  ytes of new term
1010: 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a 2a 20   data (nNew).** 
1020: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20            blob: 
1030: 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20 6f 66     nNew bytes of
1040: 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 0a 2a   new term data.*
1050: 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f 63 6c  *           docl
1060: 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c 69 73  ist: next doclis
1070: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  t.**         }.*
1080: 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69 73 74  *.**     doclist
1090: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
10a0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10b0: 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 20 20  first rowid.**  
10c0: 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20         poslist: 
10d0: 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a 2a 2a  first poslist.**
10e0: 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72           zero-or
10f0: 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20  -more {.**      
1100: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 72 6f       varint:  ro
1110: 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77 61 79  wid delta (alway
1120: 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20 20 20  s > 0).**       
1130: 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e 65 78      poslist: nex
1140: 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20  t poslist.**    
1150: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
1160: 20 20 30 78 30 30 20 62 79 74 65 0a 2a 2a 0a 2a    0x00 byte.**.*
1170: 2a 20 20 20 20 20 70 6f 73 6c 69 73 74 20 66 6f  *     poslist fo
1180: 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rmat:.**.**     
1190: 20 20 20 20 76 61 72 69 6e 74 3a 20 73 69 7a 65      varint: size
11a0: 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62   of poslist in b
11b0: 79 74 65 73 20 6d 75 6c 74 69 70 6c 69 65 64 20  ytes multiplied 
11c0: 62 79 20 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64  by 2, not includ
11d0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
11e0: 20 20 20 20 20 20 20 74 68 69 73 20 66 69 65 6c         this fiel
11f0: 64 2e 20 50 6c 75 73 20 31 20 69 66 20 74 68 69  d. Plus 1 if thi
1200: 73 20 65 6e 74 72 79 20 63 61 72 72 69 65 73 20  s entry carries 
1210: 74 68 65 20 22 64 65 6c 65 74 65 22 20 66 6c 61  the "delete" fla
1220: 67 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  g..**         co
1230: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1240: 6f 72 20 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20  or column 0.**  
1250: 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d         zero-or-m
1260: 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ore {.**        
1270: 20 20 20 30 78 30 31 20 62 79 74 65 0a 2a 2a 20     0x01 byte.** 
1280: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
1290: 3a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  : column number 
12a0: 28 49 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  (I).**          
12b0: 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73   collist: collis
12c0: 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a  t for column I.*
12d0: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a  *         }.**.*
12e0: 2a 20 20 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f  *     collist fo
12f0: 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rmat:.**.**     
1300: 20 20 20 20 76 61 72 69 6e 74 3a 20 66 69 72 73      varint: firs
1310: 74 20 6f 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20  t offset + 2.** 
1320: 20 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d          zero-or-
1330: 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  more {.**       
1340: 20 20 20 20 76 61 72 69 6e 74 3a 20 6f 66 66 73      varint: offs
1350: 65 74 20 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20  et delta + 2.** 
1360: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20          }.**.** 
1370: 20 20 50 41 47 49 4e 41 54 49 4f 4e 0a 2a 2a 0a    PAGINATION.**.
1380: 2a 2a 20 20 20 20 20 54 68 65 20 66 6f 72 6d 61  **     The forma
1390: 74 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  t described abov
13a0: 65 20 69 73 20 6f 6e 6c 79 20 61 63 63 75 72 61  e is only accura
13b0: 74 65 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  te if the entire
13c0: 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 0a 2a 2a   term/doclist.**
13d0: 20 20 20 20 20 64 61 74 61 20 66 69 74 73 20 6f       data fits o
13e0: 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20  n a single leaf 
13f0: 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
1400: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20 74   not the case, t
1410: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 20 20 20  he format.**    
1420: 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 20 74   is changed in t
1430: 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20  wo ways:.**.**  
1440: 20 20 20 20 20 2b 20 69 66 20 74 68 65 20 66 69       + if the fi
1450: 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 61 20 70  rst rowid on a p
1460: 61 67 65 20 6f 63 63 75 72 73 20 62 65 66 6f 72  age occurs befor
1470: 65 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  e the first term
1480: 2c 20 69 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  , it.**         
1490: 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6c  is stored as a l
14a0: 69 74 65 72 61 6c 20 76 61 6c 75 65 3a 0a 2a 2a  iteral value:.**
14b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14c0: 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74 20 72  varint:  first r
14d0: 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  owid.**.**      
14e0: 20 2b 20 74 68 65 20 66 69 72 73 74 20 74 65 72   + the first ter
14f0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 69  m on each page i
1500: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
1510: 73 61 6d 65 20 77 61 79 20 61 73 20 74 68 65 0a  same way as the.
1520: 2a 2a 20 20 20 20 20 20 20 20 20 76 65 72 79 20  **         very 
1530: 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
1540: 65 20 73 65 67 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a  e segment:.**.**
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72               var
1560: 69 6e 74 20 3a 20 73 69 7a 65 20 6f 66 20 66 69  int : size of fi
1570: 72 73 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20  rst term.**     
1580: 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20 20          blob:   
1590: 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74 61   first term data
15a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 45 61 63 68 20  .**.**     Each 
15b0: 6c 65 61 66 20 70 61 67 65 20 62 65 67 69 6e 73  leaf page begins
15c0: 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   with:.**.**    
15d0: 20 20 20 2b 20 32 2d 62 79 74 65 20 75 6e 73 69     + 2-byte unsi
15e0: 67 6e 65 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  gned containing 
15f0: 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
1600: 72 6f 77 69 64 20 28 6f 72 20 30 29 2e 0a 2a 2a  rowid (or 0)..**
1610: 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74 65 20         + 2-byte 
1620: 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61 69 6e  unsigned contain
1630: 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20 66 69  ing offset to fi
1640: 72 73 74 20 74 65 72 6d 20 28 6f 72 20 30 29 2e  rst term (or 0).
1650: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 6c 6c 6f 77 65  .**.**   Followe
1660: 64 20 62 79 20 74 65 72 6d 2f 64 6f 63 6c 69 73  d by term/doclis
1670: 74 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 34 2e  t data..**.** 4.
1680: 20 53 65 67 6d 65 6e 74 20 69 6e 74 65 72 69 6f   Segment interio
1690: 72 20 6e 6f 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  r nodes:.**.**  
16a0: 20 54 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   The interior no
16b0: 64 65 73 20 74 75 72 6e 20 74 68 65 20 6c 69 73  des turn the lis
16c0: 74 20 6f 66 20 6c 65 61 76 65 73 20 69 6e 74 6f  t of leaves into
16d0: 20 61 20 62 2b 74 72 65 65 2e 20 0a 2a 2a 0a 2a   a b+tree. .**.*
16e0: 2a 20 20 20 45 61 63 68 20 69 6e 74 65 72 69 6f  *   Each interio
16f0: 72 20 6e 6f 64 65 20 62 65 67 69 6e 73 20 77 69  r node begins wi
1700: 74 68 20 61 20 76 61 72 69 6e 74 20 2d 20 74 68  th a varint - th
1710: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1720: 20 74 68 65 20 6c 65 66 74 0a 2a 2a 20 20 20 6d   the left.**   m
1730: 6f 73 74 20 63 68 69 6c 64 20 6e 6f 64 65 2e 20  ost child node. 
1740: 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 20  Following this, 
1750: 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70 61  for each leaf pa
1760: 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66 69  ge except the fi
1770: 72 73 74 2c 0a 2a 2a 20 20 20 74 68 65 20 69 6e  rst,.**   the in
1780: 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 63 6f 6e  terior nodes con
1790: 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tain:.**.**     
17a0: 61 29 20 49 66 20 74 68 65 20 6c 65 61 66 20 70  a) If the leaf p
17b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  age contains at 
17c0: 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20  least one term, 
17d0: 74 68 65 6e 20 61 20 74 65 72 6d 2d 70 72 65 66  then a term-pref
17e0: 69 78 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ix that.**      
17f0: 20 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61    is greater tha
1800: 6e 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 20 74  n all previous t
1810: 65 72 6d 73 2c 20 61 6e 64 20 6c 65 73 73 20 74  erms, and less t
1820: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1830: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 66 69  the.**        fi
1840: 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  rst term on the 
1850: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
1860: 20 20 20 20 20 62 29 20 49 66 20 74 68 65 20 6c       b) If the l
1870: 65 61 66 20 70 61 67 65 20 6e 6f 20 74 65 72 6d  eaf page no term
1880: 73 2c 20 61 20 72 65 63 6f 72 64 20 69 6e 64 69  s, a record indi
1890: 63 61 74 69 6e 67 20 68 6f 77 20 6d 61 6e 79 20  cating how many 
18a0: 63 6f 6e 73 65 63 75 74 69 76 65 0a 2a 2a 20 20  consecutive.**  
18b0: 20 20 20 20 20 20 6c 65 61 76 65 73 20 63 6f 6e        leaves con
18c0: 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2c 20 61  tain no terms, a
18d0: 6e 64 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  nd whether or no
18e0: 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 73  t there is an as
18f0: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 20 20 20 20  sociated.**     
1900: 20 20 20 62 79 2d 72 6f 77 69 64 20 69 6e 64 65     by-rowid inde
1910: 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  x record..**.** 
1920: 20 20 42 79 20 64 65 66 69 6e 69 74 69 6f 6e 2c    By definition,
1930: 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
1940: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 79  more than one ty
1950: 70 65 20 28 62 29 20 72 65 63 6f 72 64 20 69 6e  pe (b) record in
1960: 20 61 20 72 6f 77 2e 0a 2a 2a 20 20 20 54 79 70   a row..**   Typ
1970: 65 20 28 62 29 20 72 65 63 6f 72 64 73 20 6f 6e  e (b) records on
1980: 6c 79 20 65 76 65 72 20 61 70 70 65 61 72 20 6f  ly ever appear o
1990: 6e 20 68 65 69 67 68 74 3d 31 20 70 61 67 65 73  n height=1 pages
19a0: 20 2d 20 69 6d 6d 65 64 69 61 74 65 20 70 61 72   - immediate par
19b0: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 6c 65 61  ents.**   of lea
19c0: 76 65 73 2e 20 4f 6e 6c 79 20 74 79 70 65 20 28  ves. Only type (
19d0: 61 29 20 72 65 63 6f 72 64 73 20 61 72 65 20 70  a) records are p
19e0: 75 73 68 65 64 20 74 6f 20 68 69 67 68 65 72 20  ushed to higher 
19f0: 6c 65 76 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  levels..**.**   
1a00: 54 65 72 6d 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a  Term format:.**.
1a10: 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72 20  **     * Number 
1a20: 6f 66 20 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d  of bytes in comm
1a30: 6f 6e 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  on with previous
1a40: 20 74 65 72 6d 20 70 6c 75 73 20 32 2c 20 61 73   term plus 2, as
1a50: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20   a varint..**   
1a60: 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79    * Number of by
1a70: 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20  tes of new term 
1a80: 64 61 74 61 2c 20 61 73 20 61 20 76 61 72 69 6e  data, as a varin
1a90: 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 6e 65 77 20  t..**     * new 
1aa0: 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  term data..**.**
1ab0: 20 20 20 4e 6f 2d 74 65 72 6d 20 66 6f 72 6d 61     No-term forma
1ac0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 65  t:.**.**     * e
1ad0: 69 74 68 65 72 20 61 6e 20 30 78 30 30 20 6f 72  ither an 0x00 or
1ae0: 20 30 78 30 31 20 62 79 74 65 2e 20 49 66 20 74   0x01 byte. If t
1af0: 68 65 20 76 61 6c 75 65 20 30 78 30 31 20 69 73  he value 0x01 is
1b00: 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 72   used, then ther
1b10: 65 20 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  e .**       is a
1b20: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  n associated ind
1b30: 65 78 2d 62 79 2d 72 6f 77 69 64 20 72 65 63 6f  ex-by-rowid reco
1b40: 72 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65  rd..**     * the
1b50: 20 6e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 2d   number of zero-
1b60: 74 65 72 6d 20 6c 65 61 76 65 73 20 61 73 20 61  term leaves as a
1b70: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 35   varint..**.** 5
1b80: 2e 20 53 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73  . Segment doclis
1b90: 74 20 69 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a  t indexes:.**.**
1ba0: 20 20 20 44 6f 63 6c 69 73 74 20 69 6e 64 65 78     Doclist index
1bb0: 65 73 20 61 72 65 20 74 68 65 6d 73 65 6c 76 65  es are themselve
1bc0: 73 20 62 2d 74 72 65 65 73 2c 20 68 6f 77 65 76  s b-trees, howev
1bd0: 65 72 20 74 68 65 79 20 75 73 75 61 6c 6c 79 20  er they usually 
1be0: 63 6f 6e 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20  consist of.**   
1bf0: 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 72 65  a single leaf re
1c00: 63 6f 72 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66  cord only. The f
1c10: 6f 72 6d 61 74 20 6f 66 20 65 61 63 68 20 64 6f  ormat of each do
1c20: 63 6c 69 73 74 20 69 6e 64 65 78 20 6c 65 61 66  clist index leaf
1c30: 20 70 61 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a   page .**   is:.
1c40: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67  **.**     * Flag
1c50: 73 20 62 79 74 65 2e 20 42 69 74 73 20 61 72 65  s byte. Bits are
1c60: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30  :.**         0x0
1c70: 31 3a 20 43 6c 65 61 72 20 69 66 20 6c 65 61 66  1: Clear if leaf
1c80: 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f   is also the roo
1c90: 74 20 70 61 67 65 2c 20 6f 74 68 65 72 77 69 73  t page, otherwis
1ca0: 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  e set..**.**    
1cb0: 20 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f   * Page number o
1cc0: 66 20 66 74 73 20 69 6e 64 65 78 20 6c 65 61 66  f fts index leaf
1cd0: 20 70 61 67 65 2e 20 41 73 20 61 20 76 61 72 69   page. As a vari
1ce0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  nt..**.**     * 
1cf0: 46 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20 70  First docid on p
1d00: 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  age indicated by
1d10: 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c 64 2e   previous field.
1d20: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1d30: 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69 73 74  .**     * A list
1d40: 20 6f 66 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65   of varints, one
1d50: 20 66 6f 72 20 65 61 63 68 20 73 75 62 73 65 71   for each subseq
1d60: 75 65 6e 74 20 74 65 72 6d 6c 65 73 73 20 70 61  uent termless pa
1d70: 67 65 2e 20 41 20 0a 2a 2a 20 20 20 20 20 20 20  ge. A .**       
1d80: 70 6f 73 69 74 69 76 65 20 64 65 6c 74 61 20 69  positive delta i
1d90: 66 20 74 68 65 20 74 65 72 6d 6c 65 73 73 20 70  f the termless p
1da0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  age contains at 
1db0: 6c 65 61 73 74 20 6f 6e 65 20 64 6f 63 69 64 2c  least one docid,
1dc0: 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 61 6e   .**       or an
1dd0: 20 30 78 30 30 20 62 79 74 65 20 6f 74 68 65 72   0x00 byte other
1de0: 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  wise..**.**   In
1df0: 74 65 72 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69  ternal doclist i
1e00: 6e 64 65 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a  ndex nodes are:.
1e10: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67  **.**     * Flag
1e20: 73 20 62 79 74 65 2e 20 42 69 74 73 20 61 72 65  s byte. Bits are
1e30: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30  :.**         0x0
1e40: 31 3a 20 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f  1: Clear for roo
1e50: 74 20 70 61 67 65 2c 20 6f 74 68 65 72 77 69 73  t page, otherwis
1e60: 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  e set..**.**    
1e70: 20 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f   * Page number o
1e80: 66 20 66 69 72 73 74 20 63 68 69 6c 64 20 70 61  f first child pa
1e90: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1ea0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70  .**.**     * Cop
1eb0: 79 20 6f 66 20 66 69 72 73 74 20 64 6f 63 69 64  y of first docid
1ec0: 20 6f 6e 20 70 61 67 65 20 69 6e 64 69 63 61 74   on page indicat
1ed0: 65 64 20 62 79 20 70 72 65 76 69 6f 75 73 20 66  ed by previous f
1ee0: 69 65 6c 64 2e 20 41 73 20 61 20 76 61 72 69 6e  ield. As a varin
1ef0: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41  t..**.**     * A
1f00: 20 6c 69 73 74 20 6f 66 20 64 65 6c 74 61 2d 65   list of delta-e
1f10: 6e 63 6f 64 65 64 20 76 61 72 69 6e 74 73 20 2d  ncoded varints -
1f20: 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64   the first docid
1f30: 20 6f 6e 20 65 61 63 68 20 73 75 62 73 65 71 75   on each subsequ
1f40: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 63 68 69  ent.**       chi
1f50: 6c 64 20 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a  ld page. .**.*/.
1f60: 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f  ./*.** Rowids fo
1f70: 72 20 74 68 65 20 61 76 65 72 61 67 65 73 20 61  r the averages a
1f80: 6e 64 20 73 74 72 75 63 74 75 72 65 20 72 65 63  nd structure rec
1f90: 6f 72 64 73 20 69 6e 20 74 68 65 20 25 5f 64 61  ords in the %_da
1fa0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65  ta table..*/.#de
1fb0: 66 69 6e 65 20 46 54 53 35 5f 41 56 45 52 41 47  fine FTS5_AVERAG
1fc0: 45 53 5f 52 4f 57 49 44 20 20 20 20 20 31 20 20  ES_ROWID     1  
1fd0: 20 20 2f 2a 20 52 6f 77 69 64 20 75 73 65 64 20    /* Rowid used 
1fe0: 66 6f 72 20 74 68 65 20 61 76 65 72 61 67 65 73  for the averages
1ff0: 20 72 65 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69   record */.#defi
2000: 6e 65 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  ne FTS5_STRUCTUR
2010: 45 5f 52 4f 57 49 44 20 20 20 31 30 20 20 20 20  E_ROWID   10    
2020: 2f 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65  /* The structure
2030: 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a   record */../*.*
2040: 2a 20 4d 61 63 72 6f 73 20 64 65 74 65 72 6d 69  * Macros determi
2050: 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 73 20  ning the rowids 
2060: 75 73 65 64 20 62 79 20 73 65 67 6d 65 6e 74 20  used by segment 
2070: 6e 6f 64 65 73 2e 20 41 6c 6c 20 6e 6f 64 65 73  nodes. All nodes
2080: 20 69 6e 20 61 6c 6c 0a 2a 2a 20 73 65 67 6d 65   in all.** segme
2090: 6e 74 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 65  nts for all inde
20a0: 78 65 73 20 28 74 68 65 20 72 65 67 75 6c 61 72  xes (the regular
20b0: 20 46 54 53 20 69 6e 64 65 78 20 61 6e 64 20 61   FTS index and a
20c0: 6e 79 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  ny prefix indexe
20d0: 73 29 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  s).** are stored
20e0: 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74   in the %_data t
20f0: 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67 65 20  able with large 
2100: 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 73 2e  positive rowids.
2110: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74  .**.** The %_dat
2120: 61 20 74 61 62 6c 65 20 6d 61 79 20 63 6f 6e 74  a table may cont
2130: 61 69 6e 20 75 70 20 74 6f 20 28 31 3c 3c 46 54  ain up to (1<<FT
2140: 53 35 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58  S5_SEGMENT_INDEX
2150: 5f 42 49 54 53 29 20 0a 2a 2a 20 69 6e 64 65 78  _BITS) .** index
2160: 65 73 20 2d 20 6f 6e 65 20 72 65 67 75 6c 61 72  es - one regular
2170: 20 74 65 72 6d 20 69 6e 64 65 78 20 61 6e 64 20   term index and 
2180: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 72 65  zero or more pre
2190: 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a  fix indexes..**.
21a0: 2a 2a 20 45 61 63 68 20 73 65 67 6d 65 6e 74 20  ** Each segment 
21b0: 69 6e 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20  in an index has 
21c0: 61 20 75 6e 69 71 75 65 20 69 64 20 67 72 65 61  a unique id grea
21d0: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a  ter than zero..*
21e0: 2a 0a 2a 2a 20 45 61 63 68 20 6e 6f 64 65 20 69  *.** Each node i
21f0: 6e 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  n a segment b-tr
2200: 65 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61  ee is assigned a
2210: 20 22 70 61 67 65 20 6e 75 6d 62 65 72 22 20 74   "page number" t
2220: 68 61 74 20 69 73 20 75 6e 69 71 75 65 0a 2a 2a  hat is unique.**
2230: 20 77 69 74 68 69 6e 20 6e 6f 64 65 73 20 6f 66   within nodes of
2240: 20 69 74 73 20 68 65 69 67 68 74 20 77 69 74 68   its height with
2250: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 28  in the segment (
2260: 6c 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20  leaf nodes have 
2270: 61 20 68 65 69 67 68 74 20 0a 2a 2a 20 6f 66 20  a height .** of 
2280: 30 2c 20 70 61 72 65 6e 74 73 20 31 2c 20 65 74  0, parents 1, et
2290: 63 2e 29 2e 20 50 61 67 65 20 6e 75 6d 62 65 72  c.). Page number
22a0: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
22b0: 73 65 71 75 65 6e 74 69 61 6c 6c 79 20 73 6f 20  sequentially so 
22c0: 74 68 61 74 0a 2a 2a 20 61 20 6e 6f 64 65 73 20  that.** a nodes 
22d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 61  page number is a
22e0: 6c 77 61 79 73 20 6f 6e 65 20 6d 6f 72 65 20 74  lways one more t
22f0: 68 61 6e 20 69 74 73 20 6c 65 66 74 20 73 69 62  han its left sib
2300: 6c 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ling..**.** The 
2310: 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 64 65  rowid for a node
2320: 20 69 73 20 74 68 65 6e 20 66 6f 75 6e 64 20 75   is then found u
2330: 73 69 6e 67 20 74 68 65 20 46 54 53 35 5f 53 45  sing the FTS5_SE
2340: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 6d 61  GMENT_ROWID() ma
2350: 63 72 6f 0a 2a 2a 20 62 65 6c 6f 77 2e 20 54 68  cro.** below. Th
2360: 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 2a  e FTS5_SEGMENT_*
2370: 5f 42 49 54 53 20 6d 61 63 72 6f 73 20 64 65 66  _BITS macros def
2380: 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
2390: 66 20 62 69 74 73 20 75 73 65 64 0a 2a 2a 20 74  f bits used.** t
23a0: 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 74 68 72  o encode the thr
23b0: 65 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ee FTS5_SEGMENT_
23c0: 52 4f 57 49 44 28 29 20 61 72 67 75 6d 65 6e 74  ROWID() argument
23d0: 73 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 72  s. This module r
23e0: 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
23f0: 5f 46 55 4c 4c 20 61 6e 64 20 66 61 69 6c 73 20  _FULL and fails 
2400: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65 72  the current oper
2410: 61 74 69 6f 6e 20 69 66 20 74 68 65 79 20 65 76  ation if they ev
2420: 65 72 20 70 72 6f 76 65 20 74 6f 6f 20 73 6d 61  er prove too sma
2430: 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ll..*/.#define F
2440: 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 20 20  TS5_DATA_ID_B   
2450: 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61 78 20    16     /* Max 
2460: 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20 36 35  seg id number 65
2470: 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  535 */.#define F
2480: 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 20 20  TS5_DATA_DLI_B  
2490: 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f 63 6c     1     /* Docl
24a0: 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67 20 28  ist-index flag (
24b0: 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66 69 6e  1 bit) */.#defin
24c0: 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  e FTS5_DATA_HEIG
24d0: 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a 20 4d  HT_B  5     /* M
24e0: 61 78 20 62 2d 74 72 65 65 20 68 65 69 67 68 74  ax b-tree height
24f0: 20 6f 66 20 33 32 20 2a 2f 0a 23 64 65 66 69 6e   of 32 */.#defin
2500: 65 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  e FTS5_DATA_PAGE
2510: 5f 42 20 20 20 33 31 20 20 20 20 20 2f 2a 20 4d  _B   31     /* M
2520: 61 78 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ax page number o
2530: 66 20 32 31 34 37 34 38 33 36 34 38 20 2a 2f 0a  f 2147483648 */.
2540: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 5f 64 72  .#define fts5_dr
2550: 69 28 73 65 67 69 64 2c 20 64 6c 69 64 78 2c 20  i(segid, dlidx, 
2560: 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 28 20  height, pgno) ( 
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 5c 0a 20 28 28 69 36 34 29 28 73 65 67 69 64 29  \. ((i64)(segid)
25a0: 20 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f    << (FTS5_DATA_
25b0: 50 41 47 45 5f 42 2b 46 54 53 35 5f 44 41 54 41  PAGE_B+FTS5_DATA
25c0: 5f 48 45 49 47 48 54 5f 42 2b 46 54 53 35 5f 44  _HEIGHT_B+FTS5_D
25d0: 41 54 41 5f 44 4c 49 5f 42 29 29 20 2b 20 20 20  ATA_DLI_B)) +   
25e0: 20 5c 0a 20 28 28 69 36 34 29 28 64 6c 69 64 78   \. ((i64)(dlidx
25f0: 29 20 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41  )  << (FTS5_DATA
2600: 5f 50 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44  _PAGE_B + FTS5_D
2610: 41 54 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b  ATA_HEIGHT_B)) +
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 5c 0a 20 28 28 69 36 34 29 28 68 65 69 67    \. ((i64)(heig
2640: 68 74 29 20 3c 3c 20 28 46 54 53 35 5f 44 41 54  ht) << (FTS5_DAT
2650: 41 5f 50 41 47 45 5f 42 29 29 20 2b 20 20 20 20  A_PAGE_B)) +    
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 20 5c 0a 20 28 28 69 36 34 29 28 70 67 6e     \. ((i64)(pgn
2690: 6f 29 29 20 20 20 20 20 20 20 20 20 20 20 20 20  o))             
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 5c 0a 29 0a 0a 23 64 65 66 69 6e 65      \.)..#define
26e0: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
26f0: 57 49 44 28 73 65 67 69 64 2c 20 68 65 69 67 68  WID(segid, heigh
2700: 74 2c 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72  t, pgno) fts5_dr
2710: 69 28 73 65 67 69 64 2c 20 30 2c 20 68 65 69 67  i(segid, 0, heig
2720: 68 74 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e  ht, pgno).#defin
2730: 65 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57  e FTS5_DLIDX_ROW
2740: 49 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74  ID(segid, height
2750: 2c 20 70 67 6e 6f 29 20 20 20 66 74 73 35 5f 64  , pgno)   fts5_d
2760: 72 69 28 73 65 67 69 64 2c 20 31 2c 20 68 65 69  ri(segid, 1, hei
2770: 67 68 74 2c 20 70 67 6e 6f 29 0a 0a 23 69 66 20  ght, pgno)..#if 
2780: 30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 69 67  0./*.** The heig
2790: 68 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d  ht of segment b-
27a0: 74 72 65 65 73 20 69 73 20 61 63 74 75 61 6c 6c  trees is actuall
27b0: 79 20 6c 69 6d 69 74 65 64 20 74 6f 20 6f 6e 65  y limited to one
27c0: 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 28   less than .** (
27d0: 31 3c 3c 48 45 49 47 48 54 5f 42 49 54 53 29 2e  1<<HEIGHT_BITS).
27e0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
27f0: 20 74 68 65 20 72 6f 77 69 64 20 61 64 64 72 65   the rowid addre
2800: 73 73 20 73 70 61 63 65 20 66 6f 72 20 6e 6f 64  ss space for nod
2810: 65 73 0a 2a 2a 20 77 69 74 68 20 73 75 63 68 20  es.** with such 
2820: 61 20 68 65 69 67 68 74 20 69 73 20 75 73 65 64  a height is used
2830: 20 62 79 20 64 6f 63 6c 69 73 74 20 69 6e 64 65   by doclist inde
2840: 78 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  xes..*/.#define 
2850: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58  FTS5_SEGMENT_MAX
2860: 5f 48 45 49 47 48 54 20 28 28 31 20 3c 3c 20 46  _HEIGHT ((1 << F
2870: 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
2880: 42 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  B)-1).#endif../*
2890: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 65 67 6d  .** Maximum segm
28a0: 65 6e 74 73 20 70 65 72 6d 69 74 74 65 64 20 69  ents permitted i
28b0: 6e 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  n a single index
28c0: 20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53   .*/.#define FTS
28d0: 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 32 30  5_MAX_SEGMENT 20
28e0: 30 30 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  00..#if 0./*.** 
28f0: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
2900: 65 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  e doclist index 
2910: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2920: 6c 65 61 66 20 70 61 67 65 20 70 67 6e 6f 20 6f  leaf page pgno o
2930: 66 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 73 65 67  f segment.** seg
2940: 69 64 20 69 6e 20 69 6e 64 65 78 20 69 64 78 2e  id in index idx.
2950: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .*/.#define FTS5
2960: 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57  _DOCLIST_IDX_ROW
2970: 49 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74  ID(segid, height
2980: 2c 20 70 67 6e 6f 29 20 5c 0a 20 20 20 20 20 20  , pgno) \.      
2990: 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52    FTS5_SEGMENT_R
29a0: 4f 57 49 44 28 73 65 67 69 64 2c 20 46 54 53 35  OWID(segid, FTS5
29b0: 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49  _SEGMENT_MAX_HEI
29c0: 47 48 54 2c 20 70 67 6e 6f 29 0a 23 65 6e 64 69  GHT, pgno).#endi
29d0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
29e0: 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
29f0: 65 33 46 74 73 35 43 6f 72 72 75 70 74 28 29 20  e3Fts5Corrupt() 
2a00: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
2a10: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 20 7d 0a  CORRUPT_VTAB; }.
2a20: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45  #endif.../*.** E
2a30: 61 63 68 20 74 69 6d 65 20 61 20 62 6c 6f 62 20  ach time a blob 
2a40: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
2a50: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 69   %_data table, i
2a60: 74 20 69 73 20 70 61 64 64 65 64 20 77 69 74 68  t is padded with
2a70: 20 74 68 69 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65   this.** many ze
2a80: 72 6f 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  ro bytes. This m
2a90: 61 6b 65 73 20 69 74 20 65 61 73 69 65 72 20 74  akes it easier t
2aa0: 6f 20 64 65 63 6f 64 65 20 74 68 65 20 76 61 72  o decode the var
2ab0: 69 6f 75 73 20 72 65 63 6f 72 64 20 66 6f 72 6d  ious record form
2ac0: 61 74 73 0a 2a 2a 20 77 69 74 68 6f 75 74 20 6f  ats.** without o
2ad0: 76 65 72 72 65 61 64 69 6e 67 20 69 66 20 74 68  verreading if th
2ae0: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 63 6f  e records are co
2af0: 72 72 75 70 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  rrupt..*/.#defin
2b00: 65 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  e FTS5_DATA_ZERO
2b10: 5f 50 41 44 44 49 4e 47 20 38 0a 0a 74 79 70 65  _PADDING 8..type
2b20: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 42  def struct Fts5B
2b30: 74 72 65 65 49 74 65 72 20 46 74 73 35 42 74 72  treeIter Fts5Btr
2b40: 65 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  eeIter;.typedef 
2b50: 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65  struct Fts5Btree
2b60: 49 74 65 72 4c 65 76 65 6c 20 46 74 73 35 42 74  IterLevel Fts5Bt
2b70: 72 65 65 49 74 65 72 4c 65 76 65 6c 3b 0a 74 79  reeIterLevel;.ty
2b80: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2b90: 35 43 68 75 6e 6b 49 74 65 72 20 46 74 73 35 43  5ChunkIter Fts5C
2ba0: 68 75 6e 6b 49 74 65 72 3b 0a 74 79 70 65 64 65  hunkIter;.typede
2bb0: 66 20 73 74 72 75 63 74 20 46 74 73 35 44 61 74  f struct Fts5Dat
2bc0: 61 20 46 74 73 35 44 61 74 61 3b 0a 74 79 70 65  a Fts5Data;.type
2bd0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2be0: 6c 69 64 78 49 74 65 72 20 46 74 73 35 44 6c 69  lidxIter Fts5Dli
2bf0: 64 78 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  dxIter;.typedef 
2c00: 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78  struct Fts5Dlidx
2c10: 4c 76 6c 20 46 74 73 35 44 6c 69 64 78 4c 76 6c  Lvl Fts5DlidxLvl
2c20: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2c30: 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
2c40: 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
2c50: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2c60: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
2c70: 72 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  r Fts5MultiSegIt
2c80: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2c90: 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20  ct Fts5NodeIter 
2ca0: 46 74 73 35 4e 6f 64 65 49 74 65 72 3b 0a 74 79  Fts5NodeIter;.ty
2cb0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2cc0: 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35  5PageWriter Fts5
2cd0: 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65  PageWriter;.type
2ce0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50  def struct Fts5P
2cf0: 6f 73 49 74 65 72 20 46 74 73 35 50 6f 73 49 74  osIter Fts5PosIt
2d00: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2d10: 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20 46  ct Fts5SegIter F
2d20: 74 73 35 53 65 67 49 74 65 72 3b 0a 74 79 70 65  ts5SegIter;.type
2d30: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2d40: 6f 63 6c 69 73 74 49 74 65 72 20 46 74 73 35 44  oclistIter Fts5D
2d50: 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74 79 70 65  oclistIter;.type
2d60: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2d70: 65 67 57 72 69 74 65 72 20 46 74 73 35 53 65 67  egWriter Fts5Seg
2d80: 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20  Writer;.typedef 
2d90: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2da0: 74 75 72 65 20 46 74 73 35 53 74 72 75 63 74 75  ture Fts5Structu
2db0: 72 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  re;.typedef stru
2dc0: 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ct Fts5Structure
2dd0: 4c 65 76 65 6c 20 46 74 73 35 53 74 72 75 63 74  Level Fts5Struct
2de0: 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ureLevel;.typede
2df0: 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74 72  f struct Fts5Str
2e00: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 46 74  uctureSegment Ft
2e10: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2e20: 6e 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  nt;..struct Fts5
2e30: 44 61 74 61 20 7b 0a 20 20 75 38 20 2a 70 3b 20  Data {.  u8 *p; 
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2e60: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
2e70: 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f 72 64 20  ntaining record 
2e80: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2eb0: 72 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73 20  record in bytes 
2ec0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 2f 2a 20 52 65 66 20 63 6f 75 6e       /* Ref coun
2ef0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  t */.};../*.** O
2f00: 6e 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f  ne object per %_
2f10: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  data table..*/.s
2f20: 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20  truct Fts5Index 
2f30: 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
2f40: 70 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20  pConfig;        
2f50: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
2f60: 61 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69  able configurati
2f70: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  on */.  char *zD
2f80: 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20  ataTbl;         
2f90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2fa0: 6f 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  of %_data table 
2fb0: 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e  */.  int nWorkUn
2fc0: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
2fd0: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67       /* Leaf pag
2fe0: 65 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f  es in a "unit" o
2ff0: 66 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a  f work */..  /*.
3000: 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72    ** Variables r
3010: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63  elated to the ac
3020: 63 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f  cumulation of to
3030: 6b 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74  kens and doclist
3040: 73 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a  s within the.  *
3050: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  * in-memory hash
3060: 20 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74   tables before t
3070: 68 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20  hey are flushed 
3080: 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  to disk..  */.  
3090: 46 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b  Fts5Hash *pHash;
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
30c0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
30d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65   */.  int nMaxPe
30e0: 6e 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20 20  ndingData;      
30f0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e        /* Max pen
3100: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
3110: 20 66 6c 75 73 68 20 74 6f 20 64 69 73 6b 20 2a   flush to disk *
3120: 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67  /.  int nPending
3130: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
3140: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62      /* Current b
3150: 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20  ytes of pending 
3160: 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57  data */.  i64 iW
3170: 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20  riteRowid;      
3180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
3190: 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64  id for current d
31a0: 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  oc being written
31b0: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
31c0: 20 73 63 72 61 74 63 68 3b 0a 0a 20 20 2f 2a 20   scratch;..  /* 
31d0: 45 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  Error state. */.
31e0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 72 72    /* Current err
3210: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  or code */..  /*
3220: 20 53 74 61 74 65 20 75 73 65 64 20 62 79 20 74   State used by t
3230: 68 65 20 66 74 73 35 44 61 74 61 58 58 58 28 29  he fts5DataXXX()
3240: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20   functions. */. 
3250: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
3260: 52 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20  Reader;         
3270: 20 2f 2a 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62   /* RO incr-blob
3280: 20 6f 70 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20   open on %_data 
3290: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
32a0: 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 72  e3_stmt *pWriter
32b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 49  ;          /* "I
32c0: 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61  NSERT ... %_data
32d0: 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f   VALUES(?,?)" */
32e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
32f0: 2a 70 44 65 6c 65 74 65 72 3b 20 20 20 20 20 20  *pDeleter;      
3300: 20 20 20 2f 2a 20 22 44 45 4c 45 54 45 20 46 52     /* "DELETE FR
3310: 4f 4d 20 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64  OM %_data ... id
3320: 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a  >=? AND id<=?" *
3330: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  /.  int nRead;  
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
3360: 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65  ber of blocks re
3370: 61 64 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  ad */.};..struct
3380: 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
3390: 20 7b 0a 20 20 69 6e 74 20 62 44 65 73 63 3b 20   {.  int bDesc; 
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
33c0: 20 44 45 53 43 20 6f 72 64 65 72 2c 20 66 61 6c   DESC order, fal
33d0: 73 65 20 66 6f 72 20 41 53 43 20 2a 2f 0a 20 20  se for ASC */.  
33e0: 75 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a  u8 *a;.  int n;.
33f0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4f    int i;..  /* O
3400: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e  utput variables.
3410: 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74 20   aPoslist==0 at 
3420: 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  EOF */.  i64 iRo
3430: 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73 6c  wid;.  u8 *aPosl
3440: 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73 6c  ist;.  int nPosl
3450: 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  ist;.};../*.** E
3460: 61 63 68 20 69 74 65 72 61 74 6f 72 20 75 73 65  ach iterator use
3470: 64 20 62 79 20 65 78 74 65 72 6e 61 6c 20 6d 6f  d by external mo
3480: 64 75 6c 65 73 20 69 73 20 61 6e 20 69 6e 73 74  dules is an inst
3490: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70  ance of this typ
34a0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  e..*/.struct Fts
34b0: 35 49 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 46  5IndexIter {.  F
34c0: 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  ts5Index *pIndex
34d0: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
34e0: 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74  e *pStruct;.  Ft
34f0: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
3500: 70 4d 75 6c 74 69 3b 0a 20 20 46 74 73 35 44 6f  pMulti;.  Fts5Do
3510: 63 6c 69 73 74 49 74 65 72 20 2a 70 44 6f 63 6c  clistIter *pDocl
3520: 69 73 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65  ist;.  Fts5Buffe
3530: 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20 20  r poslist;      
3540: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
3550: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72   containing curr
3560: 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 7d  ent poslist */.}
3570: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  ;../*.** The con
3580: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 22 73 74  tents of the "st
3590: 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20  ructure" record 
35a0: 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 61  for each index a
35b0: 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a 2a  re represented.*
35c0: 2a 20 75 73 69 6e 67 20 61 6e 20 46 74 73 35 53  * using an Fts5S
35d0: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20  tructure record 
35e0: 69 6e 20 6d 65 6d 6f 72 79 2e 20 57 68 69 63 68  in memory. Which
35f0: 20 75 73 65 73 20 69 6e 73 74 61 6e 63 65 73 20   uses instances 
3600: 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 74 68 65 72  of the .** other
3610: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 58 58   Fts5StructureXX
3620: 58 20 74 79 70 65 73 20 61 73 20 63 6f 6d 70 6f  X types as compo
3630: 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  nents..*/.struct
3640: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
3650: 67 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20 69 53  gment {.  int iS
3660: 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  egid;           
3670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
3680: 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74  ment id */.  int
3690: 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20   nHeight;       
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36b0: 48 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e  Height of segmen
36c0: 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e  t b-tree */.  in
36d0: 74 20 70 67 6e 6f 46 69 72 73 74 3b 20 20 20 20  t pgnoFirst;    
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36f0: 20 46 69 72 73 74 20 6c 65 61 66 20 70 61 67 65   First leaf page
3700: 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
3710: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f  nt */.  int pgno
3720: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
3730: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
3740: 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
3750: 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d   in segment */.}
3760: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  ;.struct Fts5Str
3770: 75 63 74 75 72 65 4c 65 76 65 6c 20 7b 0a 20 20  uctureLevel {.  
3780: 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20 20 20 20  int nMerge;     
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
37b0: 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72 2d 6d 65  ments in incr-me
37c0: 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  rge */.  int nSe
37d0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
37e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
37f0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
3800: 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f  ents on level */
3810: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3820: 53 65 67 6d 65 6e 74 20 2a 61 53 65 67 3b 20 20  Segment *aSeg;  
3830: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
3840: 65 67 6d 65 6e 74 73 2e 20 61 53 65 67 5b 30 5d  egments. aSeg[0]
3850: 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d   is oldest. */.}
3860: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  ;.struct Fts5Str
3870: 75 63 74 75 72 65 20 7b 0a 20 20 75 36 34 20 6e  ucture {.  u64 n
3880: 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20 20 20  WriteCounter;   
3890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
38a0: 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69 74 74  tal leaves writt
38b0: 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f  en to level 0 */
38c0: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b  .  int nSegment;
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65 67 6d     /* Total segm
38f0: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73 74 72  ents in this str
3900: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
3910: 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  nLevel;         
3920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3930: 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20  umber of levels 
3940: 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  in this index */
3950: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3960: 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 30 5d 3b  Level aLevel[0];
3970: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6e     /* Array of n
3980: 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62 6a 65  Level level obje
3990: 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  cts */.};../*.**
39a0: 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 79   An object of ty
39b0: 70 65 20 46 74 73 35 53 65 67 57 72 69 74 65 72  pe Fts5SegWriter
39c0: 20 69 73 20 75 73 65 64 20 74 6f 20 77 72 69 74   is used to writ
39d0: 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  e to segments..*
39e0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 61 67  /.struct Fts5Pag
39f0: 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  eWriter {.  int 
3a00: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3a20: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
3a30: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 46 74  his page */.  Ft
3a40: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a60: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3a70: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
3a80: 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
3a90: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
3aa0: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
3ab0: 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73 20  aining previous 
3ac0: 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  term on page */.
3ad0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c  };.struct Fts5Dl
3ae0: 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20 69 6e  idxWriter {.  in
3af0: 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  t pgno;         
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b10: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
3b20: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
3b30: 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64 3b 20  int bPrevValid; 
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b50: 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72 65 76  /* True if iPrev
3b60: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69   is valid */.  i
3b70: 36 34 20 69 50 72 65 76 3b 20 20 20 20 20 20 20  64 iPrev;       
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b90: 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64  * Previous docid
3ba0: 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74   value written t
3bb0: 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74 73 35  o page */.  Fts5
3bc0: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3be0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3bf0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b   page data */.};
3c00: 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67 57  .struct Fts5SegW
3c10: 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 69 53  riter {.  int iS
3c20: 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  egid;           
3c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
3c40: 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  id to write to *
3c50: 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 72 3b  /.  int nWriter;
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3c80: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 57 72 69   entries in aWri
3c90: 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 50 61 67  ter */.  Fts5Pag
3ca0: 65 57 72 69 74 65 72 20 2a 61 57 72 69 74 65 72  eWriter *aWriter
3cb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  ;        /* Arra
3cc0: 79 20 6f 66 20 50 61 67 65 57 72 69 74 65 72 20  y of PageWriter 
3cd0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 36 34  objects */.  i64
3ce0: 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20 20 20   iPrevRowid;    
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d00: 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 77  Previous docid w
3d10: 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72 65 6e  ritten to curren
3d20: 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38 20 62  t leaf */.  u8 b
3d30: 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
3d40: 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ist;        /* T
3d50: 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69  rue if next rowi
3d60: 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 64 6f  d is first in do
3d70: 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62 46  clist */.  u8 bF
3d80: 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3b  irstRowidInPage;
3d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3da0: 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69 64  ue if next rowid
3db0: 20 69 73 20 66 69 72 73 74 20 69 6e 20 70 61 67   is first in pag
3dc0: 65 20 2a 2f 0a 20 20 75 38 20 62 46 69 72 73 74  e */.  u8 bFirst
3dd0: 54 65 72 6d 49 6e 50 61 67 65 3b 20 20 20 20 20  TermInPage;     
3de0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3df0: 66 20 6e 65 78 74 20 74 65 72 6d 20 77 69 6c 6c  f next term will
3e00: 20 62 65 20 66 69 72 73 74 20 69 6e 20 6c 65 61   be first in lea
3e10: 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  f */.  int nLeaf
3e20: 57 72 69 74 74 65 6e 3b 20 20 20 20 20 20 20 20  Written;        
3e30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3e40: 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 77   of leaf pages w
3e50: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
3e60: 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20  nEmpty;         
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3e80: 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74 69 67 75  umber of contigu
3e90: 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f  ous term-less no
3ea0: 64 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 44  des */..  int nD
3eb0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  lidx;           
3ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
3ed0: 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
3ee0: 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 2a 2f  Dlidx[] array */
3ef0: 0a 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74  .  Fts5DlidxWrit
3f00: 65 72 20 2a 61 44 6c 69 64 78 3b 20 20 20 20 20  er *aDlidx;     
3f10: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 46     /* Array of F
3f20: 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 6f  ts5DlidxWriter o
3f30: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
3f40: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
3f50: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
3f60: 20 74 68 65 20 6d 65 72 67 65 64 20 72 65 73 75   the merged resu
3f70: 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f  lts of one or mo
3f80: 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20  re segments,.** 
3f90: 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65  visiting each te
3fa0: 72 6d 2f 64 6f 63 69 64 20 70 61 69 72 20 69 6e  rm/docid pair in
3fb0: 20 74 68 65 20 6d 65 72 67 65 64 20 64 61 74 61   the merged data
3fc0: 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20  ..**.** nSeg is 
3fd0: 61 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20 6f  always a power o
3fe0: 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68  f two greater th
3ff0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
4000: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
4010: 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74 68  segments that th
4020: 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65 72  is object is mer
4030: 67 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e 20  ging data from. 
4040: 42 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d 20  Both the aSeg[] 
4050: 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20  and.** aFirst[] 
4060: 61 72 72 61 79 73 20 61 72 65 20 73 69 7a 65 64  arrays are sized
4070: 20 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65 73   at nSeg entries
4080: 2e 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72 72  . The aSeg[] arr
4090: 61 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a 20  ay is padded.** 
40a0: 77 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65  with zeroed obje
40b0: 63 74 73 20 2d 20 74 68 65 73 65 20 61 72 65 20  cts - these are 
40c0: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74 68  handled as if th
40d0: 65 79 20 77 65 72 65 20 69 74 65 72 61 74 6f 72  ey were iterator
40e0: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65  s opened.** on e
40f0: 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  mpty segments..*
4100: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
4110: 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73 65   of comparing se
4120: 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61  gments aSeg[N] a
4130: 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68  nd aSeg[N+1], wh
4140: 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65  ere N is an.** e
4150: 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20 73  ven number, is s
4160: 74 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74 5b  tored in aFirst[
4170: 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65  (nSeg+N)/2]. The
4180: 20 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68 65   "result" of the
4190: 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20   .** comparison 
41a0: 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20  in this context 
41b0: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
41c0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61  the iterator tha
41d0: 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
41e0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61  oints to the sma
41f0: 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64 20  ller term/rowid 
4200: 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65  combination. Ite
4210: 72 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61 72  rators at EOF ar
4220: 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  e.** considered 
4230: 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68  to be greater th
4240: 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74 65  an all other ite
4250: 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46  rators..**.** aF
4260: 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73  irst[1] contains
4270: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61 53   the index in aS
4280: 65 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65 72  eg[] of the iter
4290: 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ator that points
42a0: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c   to.** the small
42b0: 65 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e  est key overall.
42c0: 20 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75 6e   aFirst[0] is un
42d0: 75 73 65 64 2e 20 0a 2a 2f 0a 0a 74 79 70 65 64  used. .*/..typed
42e0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43 52  ef struct Fts5CR
42f0: 65 73 75 6c 74 20 46 74 73 35 43 52 65 73 75 6c  esult Fts5CResul
4300: 74 3b 0a 73 74 72 75 63 74 20 46 74 73 35 43 52  t;.struct Fts5CR
4310: 65 73 75 6c 74 20 7b 0a 20 20 75 31 36 20 69 46  esult {.  u16 iF
4320: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
4330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 65            /* aSe
4340: 67 5b 5d 20 69 6e 64 65 78 20 6f 66 20 66 69 72  g[] index of fir
4350: 73 74 65 73 74 20 69 74 65 72 61 74 6f 72 20 2a  stest iterator *
4360: 2f 0a 20 20 75 38 20 62 54 65 72 6d 45 71 3b 20  /.  u8 bTermEq; 
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4380: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4390: 68 65 20 74 65 72 6d 73 20 61 72 65 20 65 71 75  he terms are equ
43a0: 61 6c 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  al */.};..struct
43b0: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
43c0: 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20  r {.  int nSeg; 
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
43f0: 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f   aSeg[] array */
4400: 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74     /* True to it
4430: 65 72 61 74 65 20 69 6e 20 72 65 76 65 72 73 65  erate in reverse
4440: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20   order */.  int 
4450: 62 53 6b 69 70 45 6d 70 74 79 3b 20 20 20 20 20  bSkipEmpty;     
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4470: 72 75 65 20 74 6f 20 73 6b 69 70 20 64 65 6c 65  rue to skip dele
4480: 74 65 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20  ted entries */. 
4490: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 61 53   Fts5SegIter *aS
44a0: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
44b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67   /* Array of seg
44c0: 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a  ment iterators *
44d0: 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  /.  Fts5CResult 
44e0: 2a 61 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *aFirst;        
44f0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d      /* Current m
4500: 65 72 67 65 20 73 74 61 74 65 20 28 73 65 65 20  erge state (see 
4510: 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  above) */.};../*
4520: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
4530: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
4540: 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
4550: 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63 68  t, visiting each
4560: 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a 20 70   term/docid.** p
4570: 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d 65  air in the segme
4580: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a  nt..**.** pSeg:.
4590: 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e 74  **   The segment
45a0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
45b0: 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ugh..**.** iLeaf
45c0: 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65  Pgno:.**   Curre
45d0: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
45e0: 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d 65  ber within segme
45f0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f  nt..**.** iLeafO
4600: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65  ffset:.**   Byte
4610: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74   offset within t
4620: 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
4630: 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72 73  that is the firs
4640: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
4650: 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  *   position lis
4660: 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74 65  t data (one byte
4670: 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73 69   passed the posi
4680: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
4690: 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77 69  ield)..**   rowi
46a0: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  d field of the c
46b0: 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73  urrent entry. Us
46c0: 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68  ually this is th
46d0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e size field of 
46e0: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
46f0: 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65  n list data. The
4700: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
4710: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
4720: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
4730: 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61   .**   is the la
4740: 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20  st thing on the 
4750: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
4760: 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66   pLeaf:.**   Buf
4770: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
4780: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
4790: 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55   data. Set to NU
47a0: 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  LL at EOF..**.**
47b0: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20   iTermLeafPgno, 
47c0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a  iTermLeafOffset:
47d0: 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20  .**   Leaf page 
47e0: 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e  number containin
47f0: 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  g the last term 
4800: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65  read from the se
4810: 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20  gment. And.**   
4820: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
4830: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
4840: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a   the term data..
4850: 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20  **.** flags:.** 
4860: 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53    Mask of FTS5_S
4870: 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65  EGITER_XXX value
4880: 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61  s. Interpreted a
4890: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
48a0: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
48b0: 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20  ONETERM:.**     
48c0: 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  If set, set the 
48d0: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
48e0: 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74  t to EOF after t
48f0: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
4900: 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  st .**     has b
4910: 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44  een exhausted. D
4920: 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f  o not proceed to
4930: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69   the next term i
4940: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
4950: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
4960: 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20  TER_REVERSE:.** 
4970: 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73      This flag is
4980: 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69   only ever set i
4990: 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  f FTS5_SEGITER_O
49a0: 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73  NETERM is also s
49b0: 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74  et. If.**     it
49c0: 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65   is set, iterate
49d0: 20 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73 20   through docids 
49e0: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
49f0: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
4a00: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
4a10: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
4a20: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
4a30: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
4a40: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
4a50: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
4a60: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
4a70: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4a80: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
4a90: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
4aa0: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
4ab0: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
4ac0: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
4ad0: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
4ae0: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
4af0: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
4b00: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
4b10: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
4b20: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
4b30: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
4b40: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
4b50: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
4b60: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   page..*/.struct
4b70: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
4b80: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
4b90: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
4ba0: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
4bb0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
4bc0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
4bf0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
4c00: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
4c10: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4c20: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4c30: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4c40: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4c50: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4c70: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4c80: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
4c90: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
4ca0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
4cb0: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
4cc0: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
4cd0: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4ce0: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4cf0: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
4d00: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
4d10: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
4d20: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
4d30: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
4d40: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
4d50: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
4d60: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
4d70: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
4d80: 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  t;..  /* The fol
4d90: 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20  lowing are only 
4da0: 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35  used if the FTS5
4db0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
4dc0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f   flag is set. */
4dd0: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
4de0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4df0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e     /* Current en
4e00: 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66  try in aRowidOff
4e10: 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  set[] */.  int n
4e20: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4e40: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4e50: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
4e60: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  rray */.  int *a
4e70: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
4e90: 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20  ay of offset to 
4ea0: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a  rowid fields */.
4eb0: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
4ec0: 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20   *pDlidx;       
4ed0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
4ee0: 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
4ef0: 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61  x */..  /* Varia
4f00: 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62  bles populated b
4f10: 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20  ased on current 
4f20: 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35  entry. */.  Fts5
4f30: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4f50: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
4f60: 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
4f90: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b  d */.  int nPos;
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4fc0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75 72   of bytes in cur
4fd0: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  rent position li
4fe0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c  st */.  int bDel
4ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5000: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5010: 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c  if the delete fl
5020: 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a  ag is set */.};.
5030: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45  .#define FTS5_SE
5040: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78  GITER_ONETERM 0x
5050: 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  01.#define FTS5_
5060: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
5070: 30 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  0x02.../*.** Obj
5080: 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e  ect for iteratin
5090: 67 20 74 68 72 6f 75 67 68 20 70 61 67 69 6e 61  g through pagina
50a0: 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 72  ted data..*/.str
50b0: 75 63 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65  uct Fts5ChunkIte
50c0: 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  r {.  Fts5Data *
50d0: 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
50e0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
50f0: 20 6c 65 61 66 20 64 61 74 61 2e 20 4e 55 4c 4c   leaf data. NULL
5100: 20 2d 3e 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 36   -> EOF. */.  i6
5110: 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 20 20 20  4 iLeafRowid;   
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5130: 20 41 62 73 6f 6c 75 74 65 20 72 6f 77 69 64 20   Absolute rowid 
5140: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
5150: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20  */.  int nRem;  
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e       /* Remainin
5180: 67 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  g bytes of data 
5190: 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 2f 2a  to read */..  /*
51a0: 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
51b0: 72 73 20 2a 2f 0a 20 20 75 38 20 2a 70 3b 20 20  rs */.  u8 *p;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
51e0: 65 72 20 74 6f 20 63 68 75 6e 6b 20 6f 66 20 64  er to chunk of d
51f0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ata */.  int n; 
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
5220: 20 6f 66 20 62 75 66 66 65 72 20 70 20 69 6e 20   of buffer p in 
5230: 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  bytes */.};../*.
5240: 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74  ** Object for it
5250: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
5260: 61 20 73 69 6e 67 6c 65 20 70 6f 73 69 74 69 6f  a single positio
5270: 6e 20 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a  n list on disk..
5280: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f  */.struct Fts5Po
5290: 73 49 74 65 72 20 7b 0a 20 20 46 74 73 35 43 68  sIter {.  Fts5Ch
52a0: 75 6e 6b 49 74 65 72 20 63 68 75 6e 6b 3b 20 20  unkIter chunk;  
52b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
52c0: 72 65 6e 74 20 63 68 75 6e 6b 20 6f 66 20 64 61  rent chunk of da
52d0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  ta */.  int iOff
52e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
52f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
5300: 74 20 77 69 74 68 69 6e 20 63 68 75 6e 6b 20 64  t within chunk d
5310: 61 74 61 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43  ata */..  int iC
5320: 6f 6c 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a  ol;.  int iPos;.
5330: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  };../*.** Object
5340: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
5350: 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e  hrough the conen
5360: 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69  ts of a single i
5370: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20  nternal node in 
5380: 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
5390: 74 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74  truct Fts5NodeIt
53a0: 65 72 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e  er {.  /* Intern
53b0: 61 6c 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61  al. Set and mana
53c0: 67 65 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49  ged by fts5NodeI
53d0: 74 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f  terXXX() functio
53e0: 6e 73 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a  ns. Except, .  *
53f0: 2a 20 74 68 65 20 45 4f 46 20 74 65 73 74 20 66  * the EOF test f
5400: 6f 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  or the iterator 
5410: 69 73 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72  is (Fts5NodeIter
5420: 2e 61 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a  .aData==0).  */.
5430: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74    const u8 *aDat
5440: 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a  a;.  int nData;.
5450: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f    int iOff;..  /
5460: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
5470: 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  es */.  Fts5Buff
5480: 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e  er term;.  int n
5490: 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68  Empty;.  int iCh
54a0: 69 6c 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64  ild;.  int bDlid
54b0: 78 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  x;.};../*.** An 
54c0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
54d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69  following type i
54e0: 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
54f0: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  e through the co
5500: 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64  ntents.** of a d
5510: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63  oclist-index rec
5520: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61  ord..**.** pData
5530: 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f  :.**   Record co
5540: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63  ntaining the doc
5550: 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e  list-index data.
5560: 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20  .**.** bEof:.** 
5570: 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e    Set to true on
5580: 63 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20  ce iterator has 
5590: 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a  reached EOF..**.
55a0: 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65  ** iOff:.**   Se
55b0: 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  t to the current
55c0: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72   offset within r
55d0: 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a  ecord pData..*/.
55e0: 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78  struct Fts5Dlidx
55f0: 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61  Lvl {.  Fts5Data
5600: 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
5610: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
5620: 72 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f  r current page o
5630: 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a  f this level */.
5640: 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20    int iOff;     
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  /* Current offse
5670: 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a  t into pData */.
5680: 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20    int bEof;     
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64  /* At EOF alread
56b0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  y */.  int iFirs
56c0: 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tOff;           
56d0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
56e0: 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72  reverse iterator
56f0: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  s */..  /* Outpu
5700: 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  t variables */. 
5710: 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20   int iLeafPgno; 
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5730: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
5740: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
5750: 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ge */.  i64 iRow
5760: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
5770: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
5780: 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65  owid on leaf iLe
5790: 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72  afPgno */.};.str
57a0: 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65  uct Fts5DlidxIte
57b0: 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a  r {.  int nLvl;.
57c0: 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
57d0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76  Fts5DlidxLvl aLv
57e0: 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 0a 0a 2f 2a 0a 2a  l[1];.};..../*.*
57f0: 2a 20 41 6e 20 46 74 73 35 42 74 72 65 65 49 74  * An Fts5BtreeIt
5800: 65 72 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  er object is use
5810: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
5820: 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72 69 65 73  ough all entries
5830: 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65   in the.** b-tre
5840: 65 20 68 69 65 72 61 72 63 68 79 20 62 65 6c 6f  e hierarchy belo
5850: 6e 67 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  nging to a singl
5860: 65 20 66 74 73 35 20 73 65 67 6d 65 6e 74 2e 20  e fts5 segment. 
5870: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
5880: 0a 2a 2a 20 22 62 2d 74 72 65 65 20 68 69 65 72  .** "b-tree hier
5890: 61 72 63 68 79 22 20 69 73 20 61 6c 6c 20 62 2d  archy" is all b-
58a0: 74 72 65 65 20 6e 6f 64 65 73 20 65 78 63 65 70  tree nodes excep
58b0: 74 20 6c 65 61 76 65 73 2e 20 45 61 63 68 20 65  t leaves. Each e
58c0: 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62  ntry in the.** b
58d0: 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
58e0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
58f0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
5900: 20 20 20 69 4c 65 61 66 3a 20 20 54 68 65 20 70     iLeaf:  The p
5910: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
5920: 65 20 6c 65 61 66 20 70 61 67 65 20 74 68 65 20  e leaf page the 
5930: 65 6e 74 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e  entry points to.
5940: 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20  .**.**   term:  
5950: 20 41 20 73 70 6c 69 74 2d 6b 65 79 20 74 68 61   A split-key tha
5960: 74 20 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c  t all terms on l
5970: 65 61 66 20 70 61 67 65 20 24 69 4c 65 61 66 20  eaf page $iLeaf 
5980: 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 0a  must be greater.
5990: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 68 61  **           tha
59a0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 2e 20 54  n or equal to. T
59b0: 68 65 20 22 74 65 72 6d 22 20 61 73 73 6f 63 69  he "term" associ
59c0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
59d0: 72 73 74 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20  rst b-tree.**   
59e0: 20 20 20 20 20 20 20 20 68 69 65 72 61 72 63 68          hierarch
59f0: 79 20 65 6e 74 72 79 20 28 74 68 65 20 6f 6e 65  y entry (the one
5a00: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
5a10: 6c 65 61 66 20 70 61 67 65 20 31 29 20 69 73 20  leaf page 1) is 
5a20: 61 6c 77 61 79 73 20 0a 2a 2a 20 20 20 20 20 20  always .**      
5a30: 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74       an empty st
5a40: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45  ring..**.**   nE
5a50: 6d 70 74 79 3a 20 54 68 65 20 6e 75 6d 62 65 72  mpty: The number
5a60: 20 6f 66 20 65 6d 70 74 79 20 28 74 65 72 6d 6c   of empty (terml
5a70: 65 73 73 29 20 6c 65 61 66 20 70 61 67 65 73 20  ess) leaf pages 
5a80: 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  that immediately
5a90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 66 6f  .**           fo
5aa0: 6c 6c 6f 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a  llowing iLeaf..*
5ab0: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 42 74 72  *.** The Fts5Btr
5ac0: 65 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73  eeIter object is
5ad0: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
5ae0: 72 74 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72  rt of the integr
5af0: 69 74 79 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a  ity-check code..
5b00: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 42 74  */.struct Fts5Bt
5b10: 72 65 65 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20  reeIterLevel {. 
5b20: 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 3b   Fts5NodeIter s;
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
5b50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
5b60: 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  e */.  Fts5Data 
5b70: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5b80: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
5b90: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  or the current n
5ba0: 6f 64 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74  ode */.};.struct
5bb0: 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20 7b   Fts5BtreeIter {
5bc0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b  .  Fts5Index *p;
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
5bf0: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
5c00: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
5c10: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
5c20: 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
5c30: 68 20 74 68 69 73 20 73 65 67 6d 65 6e 74 27 73  h this segment's
5c40: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
5c50: 20 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20   nLvl;          
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5c70: 53 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d 20 61  Size of aLvl[] a
5c80: 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 42 74  rray */.  Fts5Bt
5c90: 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 61 4c  reeIterLevel *aL
5ca0: 76 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65 76  vl;       /* Lev
5cb0: 65 6c 20 66 6f 72 20 65 61 63 68 20 74 69 65 72  el for each tier
5cc0: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20   of b-tree */.. 
5cd0: 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61   /* Output varia
5ce0: 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75  bles */.  Fts5Bu
5cf0: 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
5d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
5d10: 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  rent term */.  i
5d20: 6e 74 20 69 4c 65 61 66 3b 20 20 20 20 20 20 20  nt iLeaf;       
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5d40: 2a 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e 69 6e  * Leaf containin
5d50: 67 20 74 65 72 6d 73 20 3e 3d 20 63 75 72 72 65  g terms >= curre
5d60: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
5d70: 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20   nEmpty;        
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d90: 4e 75 6d 62 65 72 20 6f 66 20 22 65 6d 70 74 79  Number of "empty
5da0: 22 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  " leaves followi
5db0: 6e 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20 69 6e  ng iLeaf */.  in
5dc0: 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20  t bEof;         
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5de0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 61 74 20   Set to true at 
5df0: 45 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62 44 6c  EOF */.  int bDl
5e00: 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
5e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
5e20: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
5e30: 20 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b 0a 0a   a dlidx */.};..
5e40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
5e50: 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75 74  5PutU16(u8 *aOut
5e60: 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61  , u16 iVal){.  a
5e70: 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e  Out[0] = (iVal>>
5e80: 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20  8);.  aOut[1] = 
5e90: 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a  (iVal&0xFF);.}..
5ea0: 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35 47  static u16 fts5G
5eb0: 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a  etU16(const u8 *
5ec0: 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  aIn){.  return (
5ed0: 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38  (u16)aIn[0] << 8
5ee0: 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a 2f  ) + aIn[1];.}../
5ef0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
5f00: 6f 70 79 20 6f 66 20 74 68 65 20 73 71 6c 69 74  opy of the sqlit
5f10: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
5f20: 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74 68 65  routine from the
5f30: 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a 2a 2a   SQLite core..**
5f40: 20 45 78 63 65 70 74 2c 20 74 68 69 73 20 76 65   Except, this ve
5f50: 72 73 69 6f 6e 20 64 6f 65 73 20 68 61 6e 64 6c  rsion does handl
5f60: 65 20 74 68 65 20 73 69 6e 67 6c 65 20 62 79 74  e the single byt
5f70: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
5f80: 63 6f 72 65 0a 2a 2a 20 76 65 72 73 69 6f 6e 20  core.** version 
5f90: 64 65 70 65 6e 64 73 20 6f 6e 20 62 65 69 6e 67  depends on being
5fa0: 20 68 61 6e 64 6c 65 64 20 62 65 66 6f 72 65 20   handled before 
5fb0: 69 74 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  its function is 
5fc0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  called..*/.int s
5fd0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
5fe0: 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69  int32(const unsi
5ff0: 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33  gned char *p, u3
6000: 32 20 2a 76 29 7b 0a 20 20 75 33 32 20 61 2c 62  2 *v){.  u32 a,b
6010: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 31 2d 62 79  ;..  /* The 1-by
6020: 74 65 20 63 61 73 65 2e 20 4f 76 65 72 77 68 65  te case. Overwhe
6030: 6c 6d 69 6e 67 6c 79 20 74 68 65 20 6d 6f 73 74  lmingly the most
6040: 20 63 6f 6d 6d 6f 6e 2e 20 2a 2f 0a 20 20 61 20   common. */.  a 
6050: 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70 30  = *p;.  /* a: p0
6060: 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20   (unmasked) */. 
6070: 20 69 66 20 28 21 28 61 26 30 78 38 30 29 29 0a   if (!(a&0x80)).
6080: 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65    {.    /* Value
6090: 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  s between 0 and 
60a0: 31 32 37 20 2a 2f 0a 20 20 20 20 2a 76 20 3d 20  127 */.    *v = 
60b0: 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  a;.    return 1;
60c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 32  .  }..  /* The 2
60d0: 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20  -byte case */.  
60e0: 70 2b 2b 3b 0a 20 20 62 20 3d 20 2a 70 3b 0a 20  p++;.  b = *p;. 
60f0: 20 2f 2a 20 62 3a 20 70 31 20 28 75 6e 6d 61 73   /* b: p1 (unmas
6100: 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21 28  ked) */.  if (!(
6110: 62 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20 20  b&0x80)).  {.   
6120: 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77 65   /* Values betwe
6130: 65 6e 20 31 32 38 20 61 6e 64 20 31 36 33 38 33  en 128 and 16383
6140: 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20 30 78 37   */.    a &= 0x7
6150: 66 3b 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37 3b  f;.    a = a<<7;
6160: 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20 62 3b  .    *v = a | b;
6170: 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
6180: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 33 2d 62   }..  /* The 3-b
6190: 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20 70 2b  yte case */.  p+
61a0: 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34 3b 0a  +;.  a = a<<14;.
61b0: 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20    a |= *p;.  /* 
61c0: 61 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32 20 28  a: p0<<14 | p2 (
61d0: 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69  unmasked) */.  i
61e0: 66 20 28 21 28 61 26 30 78 38 30 29 29 0a 20 20  f (!(a&0x80)).  
61f0: 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20  {.    /* Values 
6200: 62 65 74 77 65 65 6e 20 31 36 33 38 34 20 61 6e  between 16384 an
6210: 64 20 32 30 39 37 31 35 31 20 2a 2f 0a 20 20 20  d 2097151 */.   
6220: 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29   a &= (0x7f<<14)
6230: 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 62 20 26  |(0x7f);.    b &
6240: 3d 20 30 78 37 66 3b 0a 20 20 20 20 62 20 3d 20  = 0x7f;.    b = 
6250: 62 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61  b<<7;.    *v = a
6260: 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75 72 6e   | b;.    return
6270: 20 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20   3;.  }..  /* A 
6280: 33 32 2d 62 69 74 20 76 61 72 69 6e 74 20 69 73  32-bit varint is
6290: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 73   used to store s
62a0: 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ize information 
62b0: 69 6e 20 62 74 72 65 65 73 2e 0a 20 20 2a 2a 20  in btrees..  ** 
62c0: 4f 62 6a 65 63 74 73 20 61 72 65 20 72 61 72 65  Objects are rare
62d0: 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 32  ly larger than 2
62e0: 4d 69 42 20 6c 69 6d 69 74 20 6f 66 20 61 20 33  MiB limit of a 3
62f0: 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20 20  -byte varint..  
6300: 2a 2a 20 41 20 33 2d 62 79 74 65 20 76 61 72 69  ** A 3-byte vari
6310: 6e 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  nt is sufficient
6320: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
6330: 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 69 7a  o record the siz
6340: 65 0a 20 20 2a 2a 20 6f 66 20 61 20 31 30 34 38  e.  ** of a 1048
6350: 35 36 39 2d 62 79 74 65 20 42 4c 4f 42 20 6f 72  569-byte BLOB or
6360: 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20   string..  **.  
6370: 2a 2a 20 57 65 20 6f 6e 6c 79 20 75 6e 72 6f 6c  ** We only unrol
6380: 6c 20 74 68 65 20 66 69 72 73 74 20 31 2d 2c 20  l the first 1-, 
6390: 32 2d 2c 20 61 6e 64 20 33 2d 20 62 79 74 65 20  2-, and 3- byte 
63a0: 63 61 73 65 73 2e 20 20 54 68 65 20 76 65 72 79  cases.  The very
63b0: 0a 20 20 2a 2a 20 72 61 72 65 20 6c 61 72 67 65  .  ** rare large
63c0: 72 20 63 61 73 65 73 20 63 61 6e 20 62 65 20 68  r cases can be h
63d0: 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 73 6c  andled by the sl
63e0: 6f 77 65 72 20 36 34 2d 62 69 74 20 76 61 72 69  ower 64-bit vari
63f0: 6e 74 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 2e  nt.  ** routine.
6400: 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 36  .  */.  {.    u6
6410: 34 20 76 36 34 3b 0a 20 20 20 20 75 38 20 6e 3b  4 v64;.    u8 n;
6420: 0a 20 20 20 20 70 20 2d 3d 20 32 3b 0a 20 20 20  .    p -= 2;.   
6430: 20 6e 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   n = sqlite3GetV
6440: 61 72 69 6e 74 28 70 2c 20 26 76 36 34 29 3b 0a  arint(p, &v64);.
6450: 20 20 20 20 2a 76 20 3d 20 28 75 33 32 29 76 36      *v = (u32)v6
6460: 34 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  4;.    assert( n
6470: 3e 33 20 26 26 20 6e 3c 3d 39 20 29 3b 0a 20 20  >3 && n<=9 );.  
6480: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 7d 0a    return n;.  }.
6490: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
64a0: 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 75  s5GetVarintLen(u
64b0: 33 32 20 69 56 61 6c 29 7b 0a 20 20 69 66 28 20  32 iVal){.  if( 
64c0: 69 56 61 6c 3c 28 31 20 3c 3c 20 37 20 29 20 29  iVal<(1 << 7 ) )
64d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
64e0: 20 69 56 61 6c 3c 28 31 20 3c 3c 20 31 34 29 20   iVal<(1 << 14) 
64f0: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
6500: 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32 31 29  ( iVal<(1 << 21)
6510: 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 69   ) return 3;.  i
6520: 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32 38  f( iVal<(1 << 28
6530: 29 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  ) ) return 4;.  
6540: 72 65 74 75 72 6e 20 35 3b 0a 7d 0a 0a 2f 2a 0a  return 5;.}../*.
6550: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
6560: 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72 20  return a buffer 
6570: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
6580: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
6590: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
65a0: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
65b0: 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ed, return NULL 
65c0: 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72 6f  and set the erro
65d0: 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65  r code in.** the
65e0: 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
65f0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
6600: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
6610: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
6620: 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74  fts5IdxMalloc(Ft
6630: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
6640: 6e 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e  nByte){.  return
6650: 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c   sqlite3Fts5Mall
6660: 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e  ocZero(&p->rc, n
6670: 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Byte);.}../*.** 
6680: 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74  Compare the cont
6690: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66  ents of the pLef
66a0: 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74 68  t buffer with th
66b0: 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20  e pRight/nRight 
66c0: 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  blob..**.** Retu
66d0: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
66e0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
66f0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
6700: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
6710: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
6720: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
6730: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
6740: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
6750: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
6760: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
6770: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
6780: 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46  CompareBlob(.  F
6790: 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74  ts5Buffer *pLeft
67a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
67b0: 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65  * Left hand side
67c0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a   of comparison *
67d0: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52  /.  const u8 *pR
67e0: 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74  ight, int nRight
67f0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e      /* Right han
6800: 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72  d side of compar
6810: 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ison */.){.  int
6820: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66   nCmp = MIN(pLef
6830: 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20  t->n, nRight);. 
6840: 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d   int res = memcm
6850: 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67  p(pLeft->p, pRig
6860: 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  ht, nCmp);.  ret
6870: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70  urn (res==0 ? (p
6880: 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74  Left->n - nRight
6890: 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a  ) : res);.}.../*
68a0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
68b0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
68c0: 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e  two buffers usin
68d0: 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f  g memcmp(). If o
68e0: 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20  ne buffer.** is 
68f0: 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
6900: 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e  other, it is con
6910: 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73 73  sidered the less
6920: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
6930: 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73   -ve if pLeft is
6940: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52   smaller than pR
6950: 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20  ight, 0 if they 
6960: 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20  are equal or.** 
6970: 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73  +ve if pRight is
6980: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c   smaller than pL
6990: 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  eft. In other wo
69a0: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  rds:.**.**     r
69b0: 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70  es = *pLeft - *p
69c0: 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20  Right.*/.static 
69d0: 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43 6f  int fts5BufferCo
69e0: 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65 72  mpare(Fts5Buffer
69f0: 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66   *pLeft, Fts5Buf
6a00: 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  fer *pRight){.  
6a10: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
6a20: 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d  Left->n, pRight-
6a30: 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  >n);.  int res =
6a40: 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70   memcmp(pLeft->p
6a50: 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d  , pRight->p, nCm
6a60: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
6a70: 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e  s==0 ? (pLeft->n
6a80: 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20   - pRight->n) : 
6a90: 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  res);.}..#ifdef 
6aa0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
6ab0: 74 69 63 20 69 6e 74 20 66 74 73 35 42 6c 6f 62  tic int fts5Blob
6ac0: 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74  Compare(.  const
6ad0: 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74 20   u8 *pLeft, int 
6ae0: 6e 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74 20  nLeft, .  const 
6af0: 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20  u8 *pRight, int 
6b00: 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20  nRight.){.  int 
6b10: 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66 74  nCmp = MIN(nLeft
6b20: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
6b30: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
6b40: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d  eft, pRight, nCm
6b50: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
6b60: 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d 20  s==0 ? (nLeft - 
6b70: 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a  nRight) : res);.
6b80: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
6b90: 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d   Close the read-
6ba0: 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65  only blob handle
6bb0: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
6bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6bd0: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
6be0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
6bf0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20   if( p->pReader 
6c00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
6c10: 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20 70  lob *pReader = p
6c20: 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 70  ->pReader;.    p
6c30: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
6c40: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
6c50: 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b 0a  close(pReader);.
6c60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65    }.}../*.** Che
6c70: 63 6b 20 69 66 20 72 6f 77 20 69 52 6f 77 69 64  ck if row iRowid
6c80: 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 25   exists in the %
6c90: 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 61 6e 64  _data table, and
6ca0: 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e   that it contain
6cb0: 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 76 61 6c 75  s.** a blob valu
6cc0: 65 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e  e. If so, return
6cd0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 28 79   SQLITE_ERROR (y
6ce0: 65 73 20 2d 20 53 51 4c 49 54 45 5f 45 52 52 4f  es - SQLITE_ERRO
6cf0: 52 2c 20 6e 6f 74 20 0a 2a 2a 20 53 51 4c 49 54  R, not .** SQLIT
6d00: 45 5f 4f 4b 29 2e 20 49 66 20 6e 6f 74 2c 20 72  E_OK). If not, r
6d10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6d20: 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2a 0a 2a 2a  RUPT_VTAB..**.**
6d30: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6d40: 75 72 73 20 28 65 2e 67 2e 20 4f 4f 4d 20 6f 72  urs (e.g. OOM or
6d50: 20 49 4f 45 52 52 29 2c 20 72 65 74 75 72 6e 20   IOERR), return 
6d60: 74 68 65 20 72 65 6c 65 76 61 6e 74 20 65 72 72  the relevant err
6d70: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
6d80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
6d90: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
6da0: 20 65 66 66 69 63 69 65 6e 74 2e 20 49 74 20 69   efficient. It i
6db0: 73 20 70 61 72 74 20 6f 66 20 76 61 72 79 20 72  s part of vary r
6dc0: 61 72 65 6c 79 0a 2a 2a 20 69 6e 76 6f 6b 65 64  arely.** invoked
6dd0: 20 65 72 72 6f 72 20 68 61 6e 64 6c 69 6e 67 20   error handling 
6de0: 63 6f 64 65 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  code only..*/.#i
6df0: 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20 66  f 0.static int f
6e00: 74 73 35 43 68 65 63 6b 4d 69 73 73 69 6e 67 52  ts5CheckMissingR
6e10: 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a  owid(Fts5Index *
6e20: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
6e30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
6e40: 6d 74 20 3d 20 22 53 45 4c 45 43 54 20 74 79 70  mt = "SELECT typ
6e50: 65 6f 66 28 62 6c 6f 63 6b 29 3d 3d 27 62 6c 6f  eof(block)=='blo
6e60: 62 27 20 46 52 4f 4d 20 27 25 71 27 2e 25 51 20  b' FROM '%q'.%Q 
6e70: 57 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 3b 0a  WHERE id=%lld";.
6e80: 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20    int bOk = 0;. 
6e90: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
6ea0: 2a 7a 53 71 6c 3b 0a 0a 20 20 7a 53 71 6c 20 3d  *zSql;..  zSql =
6eb0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
6ec0: 28 7a 46 6d 74 2c 20 70 2d 3e 70 43 6f 6e 66 69  (zFmt, p->pConfi
6ed0: 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
6ee0: 54 62 6c 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Tbl, iRowid);.  
6ef0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
6f00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6f10: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
6f20: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
6f30: 2a 70 53 74 6d 74 3b 0a 20 20 20 20 72 63 20 3d  *pStmt;.    rc =
6f40: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6f50: 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  _v2(p->pConfig->
6f60: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
6f70: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
6f80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6f90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
6fa0: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
6fb0: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
6fc0: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 73 71          bOk = sq
6fd0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
6fe0: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
6ff0: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
7000: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
7010: 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
7020: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
7030: 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Sql);.  }..  if(
7040: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7050: 7b 0a 20 20 20 20 72 63 20 3d 20 62 4f 6b 20 3f  {.    rc = bOk ?
7060: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20   SQLITE_ERROR : 
7070: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
7080: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
7090: 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  }.#endif..static
70a0: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
70b0: 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28  ataReadOrBuffer(
70c0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
70d0: 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a   .  Fts5Buffer *
70e0: 70 42 75 66 2c 20 0a 20 20 69 36 34 20 69 52 6f  pBuf, .  i64 iRo
70f0: 77 69 64 0a 29 7b 0a 20 20 46 74 73 35 44 61 74  wid.){.  Fts5Dat
7100: 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  a *pRet = 0;.  i
7110: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
7120: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
7130: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
7140: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64      if( p->pRead
7150: 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  er ){.      /* T
7160: 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74  his call may ret
7170: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
7180: 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
7190: 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20  en a savepoint. 
71a0: 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
71b0: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
71c0: 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73  st used. In this
71d0: 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62   case a new blob
71e0: 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a   handle.      **
71f0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
7200: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
7210: 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d  blob *pBlob = p-
7220: 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20  >pReader;.      
7230: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
7240: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7250: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70  e3_blob_reopen(p
7260: 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20  Blob, iRowid);. 
7270: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
7280: 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20  pReader==0 );.  
7290: 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d      p->pReader =
72a0: 20 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66   pBlob;.      if
72b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
72c0: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43  ){.        fts5C
72d0: 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
72e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
72f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52   rc==SQLITE_ABOR
7300: 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
7310: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
7320: 2a 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61  * If the blob ha
7330: 6e 64 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  ndle is not yet 
7340: 6f 70 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73  open, open and s
7350: 65 65 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73  eek it. Otherwis
7360: 65 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  e, use.    ** th
7370: 65 20 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20  e blob_reopen() 
7380: 41 50 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68  API to reseek th
7390: 65 20 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20  e existing blob 
73a0: 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  handle.  */.    
73b0: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d  if( p->pReader==
73c0: 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
73d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  OK ){.      Fts5
73e0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
73f0: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
7400: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7410: 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66  _blob_open(pConf
7420: 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20  ig->db, .       
7430: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
7440: 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62   p->zDataTbl, "b
7450: 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30  lock", iRowid, 0
7460: 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20  , &p->pReader.  
7470: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
7480: 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f    /* If either o
7490: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  f the sqlite3_bl
74a0: 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c  ob_open() or sql
74b0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
74c0: 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
74d0: 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20 53  above returned S
74e0: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65 74  QLITE_ERROR, ret
74f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7500: 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64 2e  PT_VTAB instead.
7510: 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65 20  .    ** All the 
7520: 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66 75  reasons those fu
7530: 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72 65  nctions might re
7540: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
7550: 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20 20  R - missing.    
7560: 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69 6e  ** table, missin
7570: 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f  g row, non-blob/
7580: 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63 6f  text in block co
7590: 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65 20  lumn - indicate 
75a0: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67 20  .    ** backing 
75b0: 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  store corruption
75c0: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
75d0: 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  ==SQLITE_ERROR )
75e0: 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
75f0: 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  PT;..    if( rc=
7600: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7610: 20 20 20 20 75 38 20 2a 61 4f 75 74 3b 20 20 20      u8 *aOut;   
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61 74  /* Read blob dat
7640: 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  a into this buff
7650: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
7660: 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  nByte = sqlite3_
7670: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52  blob_bytes(p->pR
7680: 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66  eader);.      if
7690: 28 20 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20  ( pBuf ){.      
76a0: 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
76b0: 28 70 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (pBuf);.        
76c0: 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
76d0: 72 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  rc, pBuf, nByte)
76e0: 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d  ;.        aOut =
76f0: 20 70 42 75 66 2d 3e 70 3b 0a 20 20 20 20 20 20   pBuf->p;.      
7700: 20 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79 74    pBuf->n = nByt
7710: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
7720: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61          int nSpa
7730: 63 65 20 3d 20 6e 42 79 74 65 20 2b 20 46 54 53  ce = nByte + FTS
7740: 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
7750: 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 70 52 65  ING;.        pRe
7760: 74 20 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73  t = (Fts5Data*)s
7770: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
7780: 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65  Zero(&rc, nSpace
7790: 2b 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61  +sizeof(Fts5Data
77a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
77b0: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
77c0: 20 20 70 52 65 74 2d 3e 6e 20 3d 20 6e 42 79 74    pRet->n = nByt
77d0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4f 75  e;.          aOu
77e0: 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75  t = pRet->p = (u
77f0: 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20  8*)&pRet[1];.   
7800: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52 65         pRet->nRe
7810: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  f = 1;.        }
7820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7830: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7840: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
7850: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
7860: 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72 2c 20  ead(p->pReader, 
7870: 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30 29 3b  aOut, nByte, 0);
7880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7890: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
78a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
78b0: 74 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b 0a  te3_free(pRet);.
78c0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
78d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
78e0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
78f0: 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a      p->nRead++;.
7900: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
7910: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  et;.}../*.** Ret
7920: 72 69 65 76 65 20 61 20 72 65 63 6f 72 64 20 66  rieve a record f
7930: 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
7940: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  able..**.** If a
7950: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
7960: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
7970: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65   and an error le
7980: 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74  ft in the .** Ft
7990: 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a  s5Index object..
79a0: 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 44 61  */.static Fts5Da
79b0: 74 61 20 2a 66 74 73 35 44 61 74 61 52 65 61 64  ta *fts5DataRead
79c0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
79d0: 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46 74  64 iRowid){.  Ft
79e0: 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20 66  s5Data *pRet = f
79f0: 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66  ts5DataReadOrBuf
7a00: 66 65 72 28 70 2c 20 30 2c 20 69 52 6f 77 69 64  fer(p, 0, iRowid
7a10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 52  );.  assert( (pR
7a20: 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d  et==0)==(p->rc!=
7a30: 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
7a40: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
7a50: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 72 65 63  /*.** Read a rec
7a60: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ord from the %_d
7a70: 61 74 61 20 74 61 62 6c 65 20 69 6e 74 6f 20 74  ata table into t
7a80: 68 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69  he buffer suppli
7a90: 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63  ed as the.** sec
7aa0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
7ab0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
7ac0: 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
7ad0: 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20   is left in the 
7ae0: 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74  Fts5Index object
7af0: 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  . If an.** error
7b00: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
7b10: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
7b20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
7b30: 65 64 2c 20 69 74 20 69 73 20 61 20 0a 2a 2a 20  ed, it is a .** 
7b40: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
7b50: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 42 75   void fts5DataBu
7b60: 66 66 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a  ffer(Fts5Index *
7b70: 70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  p, Fts5Buffer *p
7b80: 42 75 66 2c 20 69 36 34 20 69 52 6f 77 69 64 29  Buf, i64 iRowid)
7b90: 7b 0a 20 20 28 76 6f 69 64 29 66 74 73 35 44 61  {.  (void)fts5Da
7ba0: 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28 70  taReadOrBuffer(p
7bb0: 2c 20 70 42 75 66 2c 20 69 52 6f 77 69 64 29 3b  , pBuf, iRowid);
7bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
7bd0: 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
7be0: 20 64 61 74 61 20 72 65 63 6f 72 64 20 72 65 74   data record ret
7bf0: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
7c00: 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66  ier call to.** f
7c10: 74 73 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a  ts5DataRead()..*
7c20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7c30: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 46 74  s5DataRelease(Ft
7c40: 73 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a  s5Data *pData){.
7c50: 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20    if( pData ){. 
7c60: 20 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61     assert( pData
7c70: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
7c80: 70 44 61 74 61 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pData->nRef--;. 
7c90: 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 6e 52     if( pData->nR
7ca0: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ef==0 ) sqlite3_
7cb0: 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 7d  free(pData);.  }
7cc0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7cd0: 66 74 73 35 44 61 74 61 52 65 66 65 72 65 6e 63  fts5DataReferenc
7ce0: 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61 74  e(Fts5Data *pDat
7cf0: 61 29 7b 0a 20 20 70 44 61 74 61 2d 3e 6e 52 65  a){.  pData->nRe
7d00: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e  f++;.}../*.** IN
7d10: 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
7d20: 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  a record into th
7d30: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
7d40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7d50: 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74 73  ts5DataWrite(Fts
7d60: 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
7d70: 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20  Rowid, const u8 
7d80: 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
7d90: 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  a){.  if( p->rc!
7da0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7db0: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  urn;..  if( p->p
7dc0: 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  Writer==0 ){.   
7dd0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73   int rc;.    Fts
7de0: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
7df0: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
7e00: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
7e10: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
7e20: 0a 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43  .        "REPLAC
7e30: 45 20 49 4e 54 4f 20 27 25 71 27 2e 25 51 28 69  E INTO '%q'.%Q(i
7e40: 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53  d, block) VALUES
7e50: 28 3f 2c 3f 29 22 2c 20 70 43 6f 6e 66 69 67 2d  (?,?)", pConfig-
7e60: 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
7e70: 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
7e80: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
7e90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
7ea0: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
7eb0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7ec0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43  e3_prepare_v2(pC
7ed0: 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c  onfig->db, zSql,
7ee0: 20 2d 31 2c 20 26 70 2d 3e 70 57 72 69 74 65 72   -1, &p->pWriter
7ef0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7f00: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
7f10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
7f20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7f30: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
7f40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
7f50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
7f60: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
7f70: 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69 52  ->pWriter, 1, iR
7f80: 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
7f90: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57  _bind_blob(p->pW
7fa0: 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61 2c  riter, 2, pData,
7fb0: 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 53   nData, SQLITE_S
7fc0: 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
7fd0: 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74 65  3_step(p->pWrite
7fe0: 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71  r);.  p->rc = sq
7ff0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
8000: 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Writer);.}../*.*
8010: 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66 6f  * Execute the fo
8020: 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a  llowing SQL:.**.
8030: 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  **     DELETE FR
8040: 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45 20  OM %_data WHERE 
8050: 69 64 20 42 45 54 57 45 45 4e 20 24 69 46 69 72  id BETWEEN $iFir
8060: 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f  st AND $iLast.*/
8070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8080: 35 44 61 74 61 44 65 6c 65 74 65 28 46 74 73 35  5DataDelete(Fts5
8090: 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46  Index *p, i64 iF
80a0: 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29  irst, i64 iLast)
80b0: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  {.  if( p->rc!=S
80c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
80d0: 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  n;..  if( p->pDe
80e0: 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  leter==0 ){.    
80f0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35  int rc;.    Fts5
8100: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
8110: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
8120: 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
8130: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
8140: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
8150: 46 52 4f 4d 20 27 25 71 27 2e 25 51 20 57 48 45  FROM '%q'.%Q WHE
8160: 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c  RE id>=? AND id<
8170: 3d 3f 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44  =?", pConfig->zD
8180: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 0a 20  b, p->zDataTbl. 
8190: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53     );.    if( zS
81a0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
81b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
81c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
81d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
81e0: 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66  prepare_v2(pConf
81f0: 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ig->db, zSql, -1
8200: 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  , &p->pDeleter, 
8210: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8220: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
8230: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
8240: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8250: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
8260: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8270: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
8280: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
8290: 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69  pDeleter, 1, iFi
82a0: 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rst);.  sqlite3_
82b0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44  bind_int64(p->pD
82c0: 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74  eleter, 2, iLast
82d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
82e0: 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a  p(p->pDeleter);.
82f0: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
8300: 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65  3_reset(p->pDele
8310: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ter);.}../*.** C
8320: 6c 6f 73 65 20 74 68 65 20 73 71 6c 69 74 65 33  lose the sqlite3
8330: 5f 62 6c 6f 62 20 68 61 6e 64 6c 65 20 75 73 65  _blob handle use
8340: 64 20 74 6f 20 72 65 61 64 20 72 65 63 6f 72 64  d to read record
8350: 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  s from the %_dat
8360: 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 41 6e 64 20  a table..** And 
8370: 64 69 73 63 61 72 64 20 61 6e 79 20 63 61 63 68  discard any cach
8380: 65 64 20 72 65 61 64 73 2e 20 54 68 69 73 20 66  ed reads. This f
8390: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
83a0: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a  d at the end of.
83b0: 2a 2a 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  ** a read transa
83c0: 63 74 69 6f 6e 20 6f 72 20 77 68 65 6e 20 61 6e  ction or when an
83d0: 79 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  y sub-transactio
83e0: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
83f0: 2e 0a 2a 2f 0a 23 69 66 20 30 0a 73 74 61 74 69  ..*/.#if 0.stati
8400: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
8410: 65 73 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a  eset(Fts5Index *
8420: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65  p){.  if( p->pRe
8430: 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ader ){.    sqli
8440: 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
8450: 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20  ->pReader);.    
8460: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
8470: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
8480: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72  .** Remove all r
8490: 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74 65  ecords associate
84a0: 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20 69  d with segment i
84b0: 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  Segid..*/.static
84c0: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
84d0: 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35  moveSegment(Fts5
84e0: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 53  Index *p, int iS
84f0: 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69  egid){.  i64 iFi
8500: 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  rst = FTS5_SEGME
8510: 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
8520: 20 30 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c   0, 0);.  i64 iL
8530: 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  ast = FTS5_SEGME
8540: 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b  NT_ROWID(iSegid+
8550: 31 2c 20 30 2c 20 30 29 2d 31 3b 0a 20 20 66 74  1, 0, 0)-1;.  ft
8560: 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20  s5DataDelete(p, 
8570: 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a  iFirst, iLast);.
8580: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
8590: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
85a0: 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65  an Fts5Structure
85b0: 20 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64   object returned
85c0: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a   by an earlier .
85d0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53  ** call to fts5S
85e0: 74 72 75 63 74 75 72 65 52 65 61 64 28 29 20 6f  tructureRead() o
85f0: 72 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  r fts5StructureD
8600: 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ecode()..*/.stat
8610: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
8620: 63 74 75 72 65 52 65 6c 65 61 73 65 28 46 74 73  ctureRelease(Fts
8630: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8640: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72  uct){.  if( pStr
8650: 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uct ){.    int i
8660: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8670: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
8680: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
8690: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
86a0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53  ct->aLevel[i].aS
86b0: 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eg);.    }.    s
86c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72  qlite3_free(pStr
86d0: 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  uct);.  }.}../*.
86e0: 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61  ** Deserialize a
86f0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74  nd return the st
8700: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 63  ructure record c
8710: 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
8720: 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a  in serialized.**
8730: 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66   form within buf
8740: 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e  fer pData/nData.
8750: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53  .**.** The Fts5S
8760: 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b  tructure.aLevel[
8770: 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53  ] and each Fts5S
8780: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53  tructureLevel.aS
8790: 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  eg[] array.** ar
87a0: 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64  e over-allocated
87b0: 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68   by one slot. Th
87c0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74  is allows the st
87d0: 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73  ructure contents
87e0: 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65  .** to be more e
87f0: 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a  asily edited..**
8800: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
8810: 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69  occurs, *ppOut i
8820: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
8830: 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  d an SQLite erro
8840: 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e  r code.** return
8850: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a  ed. Otherwise, *
8860: 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  ppOut is set to 
8870: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
8880: 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53   object and.** S
8890: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
88a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
88b0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
88c0: 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38  code(.  const u8
88d0: 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
88e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
88f0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72  r containing ser
8900: 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72  ialized structur
8910: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  e */.  int nData
8920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8930: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8940: 66 20 62 75 66 66 65 72 20 70 44 61 74 61 20 69  f buffer pData i
8950: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
8960: 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20   *piCookie,     
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8980: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  Configuration co
8990: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
89a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
89b0: 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
89c0: 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c  /* OUT: Deserial
89d0: 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  ized object */.)
89e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
89f0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20  ITE_OK;.  int i 
8a00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b  = 0;.  int iLvl;
8a10: 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20  .  int nLevel = 
8a20: 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  0;.  int nSegmen
8a30: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79  t = 0;.  int nBy
8a40: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
8a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
8a60: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
8a70: 6c 6f 63 61 74 65 20 61 74 20 70 52 65 74 20 2a  locate at pRet *
8a80: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
8a90: 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  e *pRet = 0;    
8aa0: 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65      /* Structure
8ab0: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   object to retur
8ac0: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20  n */..  /* Grab 
8ad0: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
8ae0: 20 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b   */.  if( piCook
8af0: 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d  ie ) *piCookie =
8b00: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 33   sqlite3Fts5Get3
8b10: 32 28 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20  2(pData);.  i = 
8b20: 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  4;..  /* Read th
8b30: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8b40: 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67  f levels and seg
8b50: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73  ments from the s
8b60: 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tart of the.  **
8b70: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
8b80: 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74  d.  */.  i += ft
8b90: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8ba0: 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29  Data[i], nLevel)
8bb0: 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  ;.  i += fts5Get
8bc0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8bd0: 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20  i], nSegment);. 
8be0: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
8bf0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8c00: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8c20: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
8c30: 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
8c40: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
8c50: 29 20 2a 20 28 6e 4c 65 76 65 6c 29 20 20 20 20  ) * (nLevel)    
8c60: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
8c70: 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52  ray */.  );.  pR
8c80: 65 74 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  et = (Fts5Struct
8c90: 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ure*)sqlite3Fts5
8ca0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
8cb0: 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  nByte);..  if( p
8cc0: 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d  Ret ){.    pRet-
8cd0: 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c  >nLevel = nLevel
8ce0: 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67  ;.    pRet->nSeg
8cf0: 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b  ment = nSegment;
8d00: 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  .    i += sqlite
8d10: 33 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  3GetVarint(&pDat
8d20: 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72  a[i], &pRet->nWr
8d30: 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  iteCounter);..  
8d40: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63    for(iLvl=0; rc
8d50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
8d60: 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  Lvl<nLevel; iLvl
8d70: 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
8d80: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
8d90: 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65  Lvl = &pRet->aLe
8da0: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
8db0: 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a 20 20 20   int nTotal;.   
8dc0: 20 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20     int iSeg;..  
8dd0: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8de0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8df0: 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  i], pLvl->nMerge
8e00: 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  );.      i += ft
8e10: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8e20: 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29  Data[i], nTotal)
8e30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8e40: 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d  nTotal>=pLvl->nM
8e50: 65 72 67 65 20 29 3b 0a 20 20 20 20 20 20 70 4c  erge );.      pL
8e60: 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  vl->aSeg = (Fts5
8e70: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8e80: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
8e90: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20  locZero(&rc, .  
8ea0: 20 20 20 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a          nTotal *
8eb0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8ec0: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 0a 20 20  ctureSegment).  
8ed0: 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66      );..      if
8ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8ef0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  ){.        pLvl-
8f00: 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a  >nSeg = nTotal;.
8f10: 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
8f20: 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b  =0; iSeg<nTotal;
8f30: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
8f40: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8f50: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8f60: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
8f70: 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  Seg].iSegid);.  
8f80: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
8f90: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
8fa0: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
8fb0: 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74  eg[iSeg].nHeight
8fc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
8fd0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
8fe0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
8ff0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
9000: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
9010: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
9020: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
9030: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
9040: 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg].pgnoLast);.
9050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9060: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
9070: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
9080: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
9090: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
90a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
90b0: 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b    *ppOut = pRet;
90c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
90d0: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
90e0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
90f0: 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20  ureAddLevel(int 
9100: 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74  *pRc, Fts5Struct
9110: 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b  ure **ppStruct){
9120: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
9130: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
9140: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9150: 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
9160: 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c  ;.    int nLevel
9170: 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   = pStruct->nLev
9180: 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  el;.    int nByt
9190: 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69  e = (.        si
91a0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
91b0: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
91c0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
91d0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
91e0: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
91f0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
9200: 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20   (nLevel+1)  /* 
9210: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
9220: 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53  /.    );..    pS
9230: 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f  truct = sqlite3_
9240: 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c  realloc(pStruct,
9250: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
9260: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
9270: 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63    memset(&pStruc
9280: 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c  t->aLevel[nLevel
9290: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  ], 0, sizeof(Fts
92a0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
92b0: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
92c0: 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20  ->nLevel++;.    
92d0: 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
92e0: 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65  truct;.    }else
92f0: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
9300: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9310: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9320: 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76  Extend level iLv
9330: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  l so that there 
9340: 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c  is room for at l
9350: 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65  east nExtra more
9360: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f  .** segments..*/
9370: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9380: 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
9390: 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52  Level(.  int *pR
93a0: 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74  c, .  Fts5Struct
93b0: 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20  ure *pStruct, . 
93c0: 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e   int iLvl, .  in
93d0: 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74  t nExtra, .  int
93e0: 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66   bInsert.){.  if
93f0: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
9400: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
9410: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
9420: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
9430: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
9440: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9450: 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20  ment *aNew;.    
9460: 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  int nByte;..    
9470: 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nByte = (pLvl->n
9480: 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20  Seg + nExtra) * 
9490: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
94a0: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
94b0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
94c0: 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61  _realloc(pLvl->a
94d0: 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Seg, nByte);.   
94e0: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
94f0: 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d     if( bInsert==
9500: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ){.        mem
9510: 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e  set(&aNew[pLvl->
9520: 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSeg], 0, sizeof
9530: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
9540: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
9550: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9560: 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65         int nMove
9570: 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20   = pLvl->nSeg * 
9580: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
9590: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
95a0: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61        memmove(&a
95b0: 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65  New[nExtra], aNe
95c0: 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20  w, nMove);.     
95d0: 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20     memset(aNew, 
95e0: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
95f0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20  ructureSegment) 
9600: 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  * nExtra);.     
9610: 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61   }.      pLvl->a
9620: 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  Seg = aNew;.    
9630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
9640: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
9650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9660: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
9670: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
9680: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
9690: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  record..**.** Th
96a0: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
96b0: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
96c0: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
96d0: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
96e0: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
96f0: 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72  located as descr
9700: 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f  ibed for functio
9710: 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  n fts5StructureD
9720: 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76  ecode() .** abov
9730: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
9740: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
9750: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
9760: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
9770: 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46  left in the.** F
9780: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
9790: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
97a0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
97b0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
97c0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
97d0: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
97e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
97f0: 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53  Structure *fts5S
9800: 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73  tructureRead(Fts
9810: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
9820: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
9830: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
9840: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
9850: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
9860: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72    /* Object to r
9870: 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73 35 44  eturn */.  Fts5D
9880: 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20  ata *pData;     
9890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 25 5f             /* %_
98a0: 64 61 74 61 20 65 6e 74 72 79 20 63 6f 6e 74 61  data entry conta
98b0: 69 6e 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  ining structure 
98c0: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
98d0: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
98f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
9900: 6b 69 65 20 2a 2f 0a 0a 20 20 70 44 61 74 61 20  kie */..  pData 
9910: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
9920: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
9930: 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 21  _ROWID);.  if( !
9940: 70 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 30  pData ) return 0
9950: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35  ;.  p->rc = fts5
9960: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
9970: 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d  pData->p, pData-
9980: 3e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70  >n, &iCookie, &p
9990: 52 65 74 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  Ret);..  if( p->
99a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
99b0: 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69   pConfig->iCooki
99c0: 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20  e!=iCookie ){.  
99d0: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
99e0: 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28  3Fts5ConfigLoad(
99f0: 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65  pConfig, iCookie
9a00: 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61  );.  }..  fts5Da
9a10: 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
9a20: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ;.  if( p->rc!=S
9a30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9a40: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
9a50: 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20  ease(pRet);.    
9a60: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
9a70: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
9a80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9a90: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9aa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64   segments in ind
9ab0: 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74  ex structure pSt
9ac0: 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ruct. This.** fu
9ad0: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
9ae0: 76 65 72 20 75 73 65 64 20 61 73 20 70 61 72 74  ver used as part
9af0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e   of assert() con
9b00: 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64  ditions..*/.#ifd
9b10: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9b20: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
9b30: 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67  tructureCountSeg
9b40: 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63 74  ments(Fts5Struct
9b50: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
9b60: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
9b70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9b80: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
9b90: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a   of segments */.
9ba0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
9bb0: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
9be0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
9bf0: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  vels */.    for(
9c00: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
9c10: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
9c20: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65  vl++){.      nSe
9c30: 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74  gment += pStruct
9c40: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
9c50: 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Seg;.    }.  }..
9c60: 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e    return nSegmen
9c70: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t;.}.#endif../*.
9c80: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64  ** Serialize and
9c90: 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75   store the "stru
9ca0: 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a  cture" record..*
9cb0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
9cc0: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
9cd0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  n error code in 
9ce0: 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62  the Fts5Index ob
9cf0: 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65  ject. If an.** e
9d00: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
9d10: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
9d20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
9d30: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
9d40: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
9d50: 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  eWrite(Fts5Index
9d60: 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75   *p, Fts5Structu
9d70: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
9d80: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9d90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
9da0: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
9db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
9dc0: 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65  fer to serialize
9dd0: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a   record into */.
9de0: 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
9e10: 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
9e20: 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  els */.    int i
9e30: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
9e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b           /* Cook
9e50: 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72  ie value to stor
9e60: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
9e70: 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
9e80: 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
9e90: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
9ea0: 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
9eb0: 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
9ec0: 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
9ed0: 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  r));..    /* App
9ee0: 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  end the current 
9ef0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  configuration co
9f00: 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f  okie */.    iCoo
9f10: 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  kie = p->pConfig
9f20: 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69  ->iCookie;.    i
9f30: 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69  f( iCookie<0 ) i
9f40: 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 20 20  Cookie = 0;.    
9f50: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9f60: 33 32 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  32(&p->rc, &buf,
9f70: 20 69 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20 20 20   iCookie);..    
9f80: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9f90: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9fa0: 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  buf, pStruct->nL
9fb0: 65 76 65 6c 29 3b 0a 20 20 20 20 66 74 73 35 42  evel);.    fts5B
9fc0: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
9fd0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
9fe0: 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
9ff0: 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  t);.    fts5Buff
a000: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
a010: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36  p->rc, &buf, (i6
a020: 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  4)pStruct->nWrit
a030: 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  eCounter);..    
a040: 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
a050: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
a060: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
a070: 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20   int iSeg;      
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a090: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
a0a0: 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
a0b0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  ts */.      Fts5
a0c0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
a0d0: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
a0e0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
a0f0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
a100: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
a110: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
a120: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66  nMerge);.      f
a130: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
a140: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
a150: 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b  uf, pLvl->nSeg);
a160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a170: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
a180: 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20  l->nSeg );..    
a190: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
a1a0: 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
a1b0: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
a1c0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
a1d0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
a1e0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
a1f0: 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20  iSeg].iSegid);. 
a200: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
a210: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
a220: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
a230: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65  ->aSeg[iSeg].nHe
a240: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 66  ight);.        f
a250: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
a260: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
a270: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
a280: 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg].pgnoFirst);
a290: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
a2a0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
a2b0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
a2c0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
a2d0: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
a2e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
a2f0: 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
a300: 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57  S5_STRUCTURE_ROW
a310: 49 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e  ID, buf.p, buf.n
a320: 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
a330: 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d  rFree(&buf);.  }
a340: 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63  .}..#if 0.static
a350: 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 53   void fts5DebugS
a360: 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74  tructure(int*,Ft
a370: 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74  s5Buffer*,Fts5St
a380: 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69  ructure*);.stati
a390: 63 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74  c void fts5Print
a3a0: 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20  Structure(const 
a3b0: 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20  char *zCaption, 
a3c0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
a3d0: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72  Struct){.  int r
a3e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a3f0: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
a400: 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20  .  memset(&buf, 
a410: 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b  0, sizeof(buf));
a420: 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75  .  fts5DebugStru
a430: 63 74 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c  cture(&rc, &buf,
a440: 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72   pStruct);.  fpr
a450: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73  intf(stdout, "%s
a460: 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f  : %s\n", zCaptio
a470: 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c  n, buf.p);.  ffl
a480: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66  ush(stdout);.  f
a490: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
a4a0: 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  uf);.}.#else.# d
a4b0: 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53  efine fts5PrintS
a4c0: 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65  tructure(x,y).#e
a4d0: 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74  ndif..static int
a4e0: 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65   fts5SegmentSize
a4f0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
a500: 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20  gment *pSeg){.  
a510: 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d  return 1 + pSeg-
a520: 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67  >pgnoLast - pSeg
a530: 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a  ->pgnoFirst;.}..
a540: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63  /*.** Return a c
a550: 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72  opy of index str
a560: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
a570: 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20  Except, promote 
a580: 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d  as many .** segm
a590: 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ents as possible
a5a0: 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f   to level iPromo
a5b0: 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63  te. If an OOM oc
a5c0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a  curs, NULL is .*
a5d0: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
a5e0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
a5f0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
a600: 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  o(.  Fts5Index *
a610: 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74  p,.  int iPromot
a620: 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f  e,.  int szPromo
a630: 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  te,.  Fts5Struct
a640: 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a  ure *pStruct.){.
a650: 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20    int il, is;.  
a660: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
a670: 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72  el *pOut = &pStr
a680: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f  uct->aLevel[iPro
a690: 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f  mote];..  if( pO
a6a0: 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  ut->nMerge==0 ){
a6b0: 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f  .    for(il=iPro
a6c0: 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75  mote+1; il<pStru
a6d0: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b  ct->nLevel; il++
a6e0: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
a6f0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
a700: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
a710: 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20  evel[il];.      
a720: 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
a730: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
a740: 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53   for(is=pLvl->nS
a750: 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d  eg-1; is>=0; is-
a760: 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  -){.        int 
a770: 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74  sz = fts5Segment
a780: 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67  Size(&pLvl->aSeg
a790: 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  [is]);.        i
a7a0: 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20  f( sz>szPromote 
a7b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
a7c0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
a7d0: 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
a7e0: 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f  c, pStruct, iPro
a7f0: 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  mote, 1, 1);.   
a800: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
a810: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a820: 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53   memcpy(pOut->aS
a830: 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  eg, &pLvl->aSeg[
a840: 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  is], sizeof(Fts5
a850: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
a860: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74  ));.        pOut
a870: 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20  ->nSeg++;.      
a880: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a    pLvl->nSeg--;.
a890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a8a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77  }.}../*.** A new
a8b0: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73   segment has jus
a8c0: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
a8d0: 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20  o level iLvl of 
a8e0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 0a  index structure.
a8f0: 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69 73  ** pStruct. This
a900: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
a910: 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d  ines if any segm
a920: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ents should be p
a930: 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20  romoted.** as a 
a940: 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73  result. Segments
a950: 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e   are promoted in
a960: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
a970: 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68  **.**   a) If th
a980: 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  e segment just w
a990: 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65  ritten is smalle
a9a0: 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f  r than one or mo
a9b0: 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20  re segments.**  
a9c0: 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70      within the p
a9d0: 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65  revious populate
a9e0: 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70  d level, it is p
a9f0: 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70  romoted to the p
aa00: 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20  revious.**      
aa10: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e  populated level.
aa20: 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74  .**.**   b) If t
aa30: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
aa40: 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65  written is large
aa50: 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73  r than the newes
aa60: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20  t segment on.** 
aa70: 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f       the next po
aa80: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74  pulated level, t
aa90: 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74  hen that segment
aaa0: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
aab0: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20  adjacent.**     
aac0: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61   segments that a
aad0: 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20  re also smaller 
aae0: 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73  than the one jus
aaf0: 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a  t written, are .
ab00: 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64  **      promoted
ab10: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  . .**.** If one 
ab20: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
ab30: 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74   are promoted, t
ab40: 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  he structure obj
ab50: 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a  ect is updated.*
ab60: 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69  * to reflect thi
ab70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
ab80: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50  d fts5StructureP
ab90: 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e  romote(.  Fts5In
aba0: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
abb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
abc0: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
abd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20   */.  int iLvl, 
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c        /* Index l
ac00: 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65  evel just update
ac10: 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  d */.  Fts5Struc
ac20: 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20 20  ture *pStruct   
ac30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
ac40: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
ac50: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ac60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
ac70: 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20  t iTst;.    int 
ac80: 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20  iPromote = -1;. 
ac90: 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65     int szPromote
aca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
acb0: 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74   /* Promote anyt
acc0: 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f  hing this size o
acd0: 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  r smaller */.   
ace0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
acf0: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f  gment *pSeg;   /
ad00: 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  * Segment just w
ad10: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
ad20: 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20  t szSeg;        
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ad40: 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a  ize of segment j
ad50: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a  ust written */..
ad60: 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74  .    pSeg = &pSt
ad70: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
ad80: 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74 2d  l].aSeg[pStruct-
ad90: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
ada0: 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67  eg-1];.    szSeg
adb0: 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70 67   = (1 + pSeg->pg
adc0: 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70  noLast - pSeg->p
add0: 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20 20  gnoFirst);..    
ade0: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e  /* Check for con
adf0: 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20  dition (a) */.  
ae00: 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d    for(iTst=iLvl-
ae10: 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70 53  1; iTst>=0 && pS
ae20: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54  truct->aLevel[iT
ae30: 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73  st].nSeg==0; iTs
ae40: 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20 69 54  t--);.    if( iT
ae50: 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  st>=0 ){.      i
ae60: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
ae70: 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  szMax = 0;.     
ae80: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
ae90: 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70 53 74  vel *pTst = &pSt
aea0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73  ruct->aLevel[iTs
aeb0: 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t];.      assert
aec0: 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d  ( pTst->nMerge==
aed0: 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
aee0: 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67  =0; i<pTst->nSeg
aef0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
af00: 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61  int sz = pTst->a
af10: 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20  Seg[i].pgnoLast 
af20: 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  - pTst->aSeg[i].
af30: 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20  pgnoFirst + 1;. 
af40: 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a         if( sz>sz
af50: 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a  Max ) szMax = sz
af60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
af70: 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67  if( szMax>=szSeg
af80: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
af90: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20  ondition (a) is 
afa0: 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68  true. Promote th
afb0: 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74  e newest segment
afc0: 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20 20   on level .     
afd0: 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65     ** iLvl to le
afe0: 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20  vel iTst.  */.  
aff0: 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d        iPromote =
b000: 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20 73   iTst;.        s
b010: 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78  zPromote = szMax
b020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b030: 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69  .    /* If condi
b040: 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74 20  tion (a) is not 
b050: 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62 29 20  met, assume (b) 
b060: 69 73 20 74 72 75 65 2e 20 53 74 72 75 63 74 75  is true. Structu
b070: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20  rePromoteTo().  
b080: 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
b090: 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a  if it is not.  *
b0a0: 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d 6f  /.    if( iPromo
b0b0: 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 50  te<0 ){.      iP
b0c0: 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20  romote = iLvl;. 
b0d0: 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d       szPromote =
b0e0: 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20   szSeg;.    }.  
b0f0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
b100: 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f  romoteTo(p, iPro
b110: 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c  mote, szPromote,
b120: 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d   pStruct);.  }.}
b130: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
b140: 70 49 74 65 72 2d 3e 69 4f 66 66 20 6f 66 66 73  pIter->iOff offs
b150: 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  et currently poi
b160: 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
b170: 69 6e 64 69 63 61 74 69 6e 67 20 6f 6e 65 0a 2a  indicating one.*
b180: 2a 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 2d 6c  * or more term-l
b190: 65 73 73 20 6e 6f 64 65 73 2c 20 61 64 76 61 6e  ess nodes, advan
b1a0: 63 65 20 70 61 73 74 20 69 74 20 61 6e 64 20 73  ce past it and s
b1b0: 65 74 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79  et pIter->nEmpty
b1c0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   to.** the numbe
b1d0: 72 20 6f 66 20 65 6d 70 74 79 20 63 68 69 6c 64  r of empty child
b1e0: 20 6e 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   nodes..*/.stati
b1f0: 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49  c void fts5NodeI
b200: 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28  terGobbleNEmpty(
b210: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49  Fts5NodeIter *pI
b220: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
b230: 72 2d 3e 69 4f 66 66 3c 70 49 74 65 72 2d 3e 6e  r->iOff<pIter->n
b240: 44 61 74 61 20 26 26 20 30 3d 3d 28 70 49 74 65  Data && 0==(pIte
b250: 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e  r->aData[pIter->
b260: 69 4f 66 66 5d 20 26 20 30 78 66 65 29 20 29 7b  iOff] & 0xfe) ){
b270: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69  .    pIter->bDli
b280: 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 44 61 74  dx = pIter->aDat
b290: 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26  a[pIter->iOff] &
b2a0: 20 30 78 30 31 3b 0a 20 20 20 20 70 49 74 65 72   0x01;.    pIter
b2b0: 2d 3e 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 70 49  ->iOff++;.    pI
b2c0: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  ter->iOff += fts
b2d0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49  5GetVarint32(&pI
b2e0: 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72  ter->aData[pIter
b2f0: 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72 2d 3e  ->iOff], pIter->
b300: 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c 73 65  nEmpty);.  }else
b310: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d  {.    pIter->nEm
b320: 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  pty = 0;.    pIt
b330: 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30 3b 0a  er->bDlidx = 0;.
b340: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76    }.}../*.** Adv
b350: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
b360: 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20 74 68   entry within th
b370: 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e node..*/.stati
b380: 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49  c void fts5NodeI
b390: 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70 52 63  terNext(int *pRc
b3a0: 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a  , Fts5NodeIter *
b3b0: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
b3c0: 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72  ter->iOff>=pIter
b3d0: 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 70  ->nData ){.    p
b3e0: 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b  Iter->aData = 0;
b3f0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69  .    pIter->iChi
b400: 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 45 6d  ld += pIter->nEm
b410: 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pty;.  }else{.  
b420: 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e 65 77    int nPre, nNew
b430: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66  ;.    pIter->iOf
b440: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
b450: 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61  nt32(&pIter->aDa
b460: 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c  ta[pIter->iOff],
b470: 20 6e 50 72 65 29 3b 0a 20 20 20 20 70 49 74 65   nPre);.    pIte
b480: 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  r->iOff += fts5G
b490: 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
b4a0: 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e  r->aData[pIter->
b4b0: 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
b4c0: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
b4d0: 3d 20 6e 50 72 65 2d 32 3b 0a 20 20 20 20 66 74  = nPre-2;.    ft
b4e0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
b4f0: 6f 62 28 70 52 63 2c 20 26 70 49 74 65 72 2d 3e  ob(pRc, &pIter->
b500: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 70 49 74 65  term, nNew, pIte
b510: 72 2d 3e 61 44 61 74 61 2b 70 49 74 65 72 2d 3e  r->aData+pIter->
b520: 69 4f 66 66 29 3b 0a 20 20 20 20 70 49 74 65 72  iOff);.    pIter
b530: 2d 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a  ->iOff += nNew;.
b540: 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69 6c      pIter->iChil
b550: 64 20 2b 3d 20 28 31 20 2b 20 70 49 74 65 72 2d  d += (1 + pIter-
b560: 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 66 74  >nEmpty);.    ft
b570: 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65  s5NodeIterGobble
b580: 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a 20  NEmpty(pIter);. 
b590: 20 20 20 69 66 28 20 2a 70 52 63 20 29 20 70 49     if( *pRc ) pI
b5a0: 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b 0a  ter->aData = 0;.
b5b0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e    }.}.../*.** In
b5c0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65  itialize the ite
b5d0: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74  rator object pIt
b5e0: 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  er to iterate th
b5f0: 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72 6e  rough the intern
b600: 61 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6e 6f  al.** segment no
b610: 64 65 20 69 6e 20 70 44 61 74 61 2e 0a 2a 2f 0a  de in pData..*/.
b620: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b630: 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 63 6f 6e  NodeIterInit(con
b640: 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 69 6e  st u8 *aData, in
b650: 74 20 6e 44 61 74 61 2c 20 46 74 73 35 4e 6f 64  t nData, Fts5Nod
b660: 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  eIter *pIter){. 
b670: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
b680: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
b690: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 44 61 74  );.  pIter->aDat
b6a0: 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 49 74  a = aData;.  pIt
b6b0: 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74  er->nData = nDat
b6c0: 61 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  a;.  pIter->iOff
b6d0: 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
b6e0: 33 32 28 61 44 61 74 61 2c 20 70 49 74 65 72 2d  32(aData, pIter-
b6f0: 3e 69 43 68 69 6c 64 29 3b 0a 20 20 66 74 73 35  >iChild);.  fts5
b700: 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e 45  NodeIterGobbleNE
b710: 6d 70 74 79 28 70 49 74 65 72 29 3b 0a 7d 0a 0a  mpty(pIter);.}..
b720: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6d  /*.** Free any m
b730: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
b740: 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  by the iterator 
b750: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
b760: 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49  c void fts5NodeI
b770: 74 65 72 46 72 65 65 28 46 74 73 35 4e 6f 64 65  terFree(Fts5Node
b780: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b790: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
b7a0: 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a  pIter->term);.}.
b7b0: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
b7c0: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
b7d0: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
b7e0: 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  rgument. If the 
b7f0: 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64  end of the .** d
b800: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67  oclist-index pag
b810: 65 20 69 73 20 72 65 61 63 68 65 64 2c 20 72 65  e is reached, re
b820: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
b830: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
b840: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74  5DlidxLvlNext(Ft
b850: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
b860: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
b870: 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61  Data = pLvl->pDa
b880: 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d  ta;..  if( pLvl-
b890: 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >iOff==0 ){.    
b8a0: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45  assert( pLvl->bE
b8b0: 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  of==0 );.    pLv
b8c0: 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20  l->iOff = 1;.   
b8d0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66   pLvl->iOff += f
b8e0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
b8f0: 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76  pData->p[1], pLv
b900: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  l->iLeafPgno);. 
b910: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d     pLvl->iOff +=
b920: 20 67 65 74 56 61 72 69 6e 74 28 26 70 44 61 74   getVarint(&pDat
b930: 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d  a->p[pLvl->iOff]
b940: 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69  , (u64*)&pLvl->i
b950: 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c  Rowid);.    pLvl
b960: 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c  ->iFirstOff = pL
b970: 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73  vl->iOff;.  }els
b980: 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  e{.    int iOff;
b990: 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c  .    for(iOff=pL
b9a0: 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70  vl->iOff; iOff<p
b9b0: 44 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29  Data->n; iOff++)
b9c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  {.      if( pDat
b9d0: 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65  a->p[iOff] ) bre
b9e0: 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ak; .    }..    
b9f0: 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  if( iOff<pData->
ba00: 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  n ){.      i64 i
ba10: 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  Val;.      pLvl-
ba20: 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69  >iLeafPgno += (i
ba30: 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off - pLvl->iOff
ba40: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66  ) + 1;.      iOf
ba50: 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  f += getVarint(&
ba60: 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pData->p[iOff], 
ba70: 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20  (u64*)&iVal);.  
ba80: 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64      pLvl->iRowid
ba90: 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20   += iVal;.      
baa0: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  pLvl->iOff = iOf
bab0: 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  f;.    }else{.  
bac0: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
bad0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
bae0: 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45   return pLvl->bE
baf0: 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  of;.}../*.** Adv
bb00: 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
bb10: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
bb20: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
bb30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
bb40: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28  5DlidxIterNextR(
bb50: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
bb60: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bb70: 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20  er, int iLvl){. 
bb80: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
bb90: 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
bba0: 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73  vl[iLvl];..  ass
bbb0: 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d  ert( iLvl<pIter-
bbc0: 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66  >nLvl );.  if( f
bbd0: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
bbe0: 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  pLvl) ){.    if(
bbf0: 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65   (iLvl+1) < pIte
bc00: 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20  r->nLvl ){.     
bc10: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
bc20: 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  xtR(p, pIter, iL
bc30: 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  vl+1);.      if(
bc40: 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30   pLvl[1].bEof==0
bc50: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
bc60: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c  DataRelease(pLvl
bc70: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
bc80: 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30    memset(pLvl, 0
bc90: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
bca0: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20  dxLvl));.       
bcb0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
bcc0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35              FTS5
bce0: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74  _DLIDX_ROWID(pIt
bcf0: 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c  er->iSegid, iLvl
bd00: 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50  , pLvl[1].iLeafP
bd10: 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
bd20: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
bd30: 2d 3e 70 44 61 74 61 20 29 20 66 74 73 35 44 6c  ->pData ) fts5Dl
bd40: 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29  idxLvlNext(pLvl)
bd50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bd60: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
bd70: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
bd80: 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  f;.}.static int 
bd90: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
bda0: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
bdb0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
bdc0: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
bdd0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
bde0: 74 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  tR(p, pIter, 0);
bdf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
be00: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
be10: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
be20: 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c  ent has the foll
be30: 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74  owing fields set
be40: 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20  .** as follows. 
be50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
be60: 74 73 20 75 70 20 74 68 65 20 72 65 73 74 20 6f  ts up the rest o
be70: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  f the iterator s
be80: 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69  o that it.** poi
be90: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
bea0: 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f   rowid in the do
beb0: 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a  clist-index..**.
bec0: 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20  **   pData:.**  
bed0: 20 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f     pointer to do
bee0: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
bef0: 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  rd, .**.** When 
bf00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
bf10: 20 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69   called pIter->i
bf20: 4c 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20  LeafPgno is the 
bf30: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a  page number the.
bf40: 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73  ** doclist is as
bf50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 28 74  sociated with (t
bf60: 68 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67  he one featuring
bf70: 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73   the term)..*/.s
bf80: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
bf90: 69 64 78 49 74 65 72 46 69 72 73 74 28 46 74 73  idxIterFirst(Fts
bfa0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
bfb0: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
bfc0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
bfd0: 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
bfe0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
bff0: 74 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  t(&pIter->aLvl[i
c000: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
c010: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
c020: 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  bEof;.}...static
c030: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
c040: 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20  erEof(Fts5Index 
c050: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
c060: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
c070: 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  urn p->rc!=SQLIT
c080: 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61  E_OK || pIter->a
c090: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a  Lvl[0].bEof;.}..
c0a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c0b0: 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46 74  DlidxIterLast(Ft
c0c0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
c0d0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
c0e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
c0f0: 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c  * Advance each l
c100: 65 76 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74  evel to the last
c110: 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61   entry on the la
c120: 73 74 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72  st page */.  for
c130: 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31  (i=pIter->nLvl-1
c140: 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
c150: 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29  OK && i>=0; i--)
c160: 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c  {.    Fts5DlidxL
c170: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
c180: 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20  r->aLvl[i];.    
c190: 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
c1a0: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30  LvlNext(pLvl)==0
c1b0: 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45   );.    pLvl->bE
c1c0: 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  of = 0;..    if(
c1d0: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74   i>0 ){.      Ft
c1e0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69  s5DlidxLvl *pChi
c1f0: 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a  ld = &pLvl[-1];.
c200: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
c210: 6c 65 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44  lease(pChild->pD
c220: 61 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  ata);.      mems
c230: 65 74 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69  et(pChild, 0, si
c240: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
c250: 6c 29 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c  l));.      pChil
c260: 64 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44  d->pData = fts5D
c270: 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20  ataRead(p, .    
c280: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
c290: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
c2a0: 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d  egid, i-1, pLvl-
c2b0: 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20  >iLeafPgno).    
c2c0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
c2d0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
c2e0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
c2f0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
c300: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65  ument to the pre
c310: 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a  vious entry..*/.
c320: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
c330: 6c 69 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35  lidxLvlPrev(Fts5
c340: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b  DlidxLvl *pLvl){
c350: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c  .  int iOff = pL
c360: 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73  vl->iOff;..  ass
c370: 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d  ert( pLvl->bEof=
c380: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66  =0 );.  if( iOff
c390: 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  <=pLvl->iFirstOf
c3a0: 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62  f ){.    pLvl->b
c3b0: 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Eof = 1;.  }else
c3c0: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c  {.    u8 *a = pL
c3d0: 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20  vl->pData->p;.  
c3e0: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
c3f0: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
c400: 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20  int ii;.    int 
c410: 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20  nZero = 0;..    
c420: 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66  /* Currently iOf
c430: 66 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  f points to the 
c440: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 20  first byte of a 
c450: 76 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f  varint. This blo
c460: 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65  ck .    ** decre
c470: 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c  ments iOff until
c480: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
c490: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c4a0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20  the previous .  
c4b0: 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b    ** varint. Tak
c4c0: 69 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20  ing care not to 
c4d0: 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20  read any memory 
c4e0: 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f  locations that o
c4f0: 63 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f  ccur.    ** befo
c500: 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  re the buffer in
c510: 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20   memory.  */.   
c520: 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e   iLimit = (iOff>
c530: 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b  9 ? iOff-9 : 0);
c540: 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b  .    for(iOff--;
c550: 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f   iOff>iLimit; iO
c560: 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  ff--){.      if(
c570: 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78   (a[iOff-1] & 0x
c580: 38 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  80)==0 ) break;.
c590: 20 20 20 20 7d 0a 0a 20 20 20 20 67 65 74 56 61      }..    getVa
c5a0: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
c5b0: 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20  u64*)&iVal);.   
c5c0: 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d   pLvl->iRowid -=
c5d0: 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d   iVal;.    pLvl-
c5e0: 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20  >iLeafPgno--;.. 
c5f0: 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77     /* Skip backw
c600: 61 72 64 73 20 70 61 73 74 20 61 6e 79 20 30 78  ards past any 0x
c610: 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20  00 varints. */. 
c620: 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31     for(ii=iOff-1
c630: 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72  ; ii>=pLvl->iFir
c640: 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d  stOff && a[ii]==
c650: 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20  0x00; ii--){.   
c660: 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20     nZero++;.    
c670: 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d 70 4c  }.    if( ii>=pL
c680: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26  vl->iFirstOff &&
c690: 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30 29 20   (a[ii] & 0x80) 
c6a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
c6b0: 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  byte immediately
c6c0: 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74   before the last
c6d0: 20 30 78 30 30 20 62 79 74 65 20 68 61 73 20 74   0x00 byte has t
c6e0: 68 65 20 30 78 38 30 20 62 69 74 0a 20 20 20 20  he 0x80 bit.    
c6f0: 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68 65    ** set. So the
c700: 20 6c 61 73 74 20 30 78 30 30 20 69 73 20 6f 6e   last 0x00 is on
c710: 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20 69 66  ly a varint 0 if
c720: 20 74 68 65 72 65 20 61 72 65 20 38 20 6d 6f 72   there are 8 mor
c730: 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a 2a 20  e 0x80.      ** 
c740: 62 79 74 65 73 20 62 65 66 6f 72 65 20 61 5b 69  bytes before a[i
c750: 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  i]. */.      int
c760: 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20   bZero = 0;     
c770: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
c780: 20 69 66 20 6c 61 73 74 20 30 78 30 30 20 63 6f   if last 0x00 co
c790: 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  unts */.      if
c7a0: 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e  ( (ii-8)>=pLvl->
c7b0: 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20  iFirstOff ){.   
c7c0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
c7d0: 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d      for(j=1; j<=
c7e0: 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20  8 && (a[ii-j] & 
c7f0: 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20  0x80); j++);.   
c800: 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e       bZero = (j>
c810: 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
c820: 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29    if( bZero==0 )
c830: 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a   nZero--;.    }.
c840: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
c850: 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20  gno -= nZero;.  
c860: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69    pLvl->iOff = i
c870: 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d  Off - nZero;.  }
c880: 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d  ..  return pLvl-
c890: 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63  >bEof;.}..static
c8a0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
c8b0: 65 72 50 72 65 76 52 28 46 74 73 35 49 6e 64 65  erPrevR(Fts5Inde
c8c0: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
c8d0: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
c8e0: 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69  iLvl){.  Fts5Dli
c8f0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
c900: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d  Iter->aLvl[iLvl]
c910: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
c920: 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b  l<pIter->nLvl );
c930: 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78  .  if( fts5Dlidx
c940: 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20 29 7b  LvlPrev(pLvl) ){
c950: 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31  .    if( (iLvl+1
c960: 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  ) < pIter->nLvl 
c970: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
c980: 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20 70  dxIterPrevR(p, p
c990: 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20  Iter, iLvl+1);. 
c9a0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d       if( pLvl[1]
c9b0: 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  .bEof==0 ){.    
c9c0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
c9d0: 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
c9e0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
c9f0: 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pLvl, 0, sizeof
ca00: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
ca10: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  .        pLvl->p
ca20: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
ca30: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
ca40: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
ca50: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
ca60: 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31  id, iLvl, pLvl[1
ca70: 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ].iLeafPgno).   
ca80: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
ca90: 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20  if( pLvl->pData 
caa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
cab0: 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  le( fts5DlidxLvl
cac0: 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b  Next(pLvl)==0 );
cad0: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  .          pLvl-
cae0: 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20  >bEof = 0;.     
caf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
cb00: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
cb10: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
cb20: 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bEof;.}.static i
cb30: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
cb40: 50 72 65 76 28 46 74 73 35 49 6e 64 65 78 20 2a  Prev(Fts5Index *
cb50: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
cb60: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
cb70: 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  rn fts5DlidxIter
cb80: 50 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20  PrevR(p, pIter, 
cb90: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  0);.}../*.** Fre
cba0: 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  e a doclist-inde
cbb0: 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  x iterator objec
cbc0: 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  t allocated by f
cbd0: 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
cbe0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
cbf0: 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  id fts5DlidxIter
cc00: 46 72 65 65 28 46 74 73 35 44 6c 69 64 78 49 74  Free(Fts5DlidxIt
cc10: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
cc20: 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69  ( pIter ){.    i
cc30: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
cc40: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c  0; i<pIter->nLvl
cc50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
cc60: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
cc70: 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61  ter->aLvl[i].pDa
cc80: 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ta);.    }.    s
cc90: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
cca0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
ccb0: 63 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  c Fts5DlidxIter 
ccc0: 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  *fts5DlidxIterIn
ccd0: 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
cce0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ccf0: 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61        /* Fts5 Ba
cd00: 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
cd10: 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74   within */.  int
cd20: 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd40: 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42  True for ORDER B
cd50: 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69  Y ASC */.  int i
cd60: 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
cd70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
cd80: 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
cd90: 74 20 69 4c 65 61 66 50 67 20 20 20 20 20 20 20  t iLeafPg       
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cdb0: 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   Leaf page numbe
cdc0: 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20  r to load dlidx 
cdd0: 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  for */.){.  Fts5
cde0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
cdf0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
ce00: 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
ce10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
ce20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ce30: 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a  bDone==0; i++){.
ce40: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
ce50: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
ce60: 49 74 65 72 29 20 2b 20 69 20 2a 20 73 69 7a 65  Iter) + i * size
ce70: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
ce80: 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 49  ;.    Fts5DlidxI
ce90: 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20  ter *pNew;..    
cea0: 70 4e 65 77 20 3d 20 28 46 74 73 35 44 6c 69 64  pNew = (Fts5Dlid
ceb0: 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72  xIter*)sqlite3_r
cec0: 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42  ealloc(pIter, nB
ced0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  yte);.    if( pN
cee0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
cef0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
cf00: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
cf10: 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
cf20: 20 3d 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f   = FTS5_DLIDX_RO
cf30: 57 49 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69  WID(iSegid, i, i
cf40: 4c 65 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46  LeafPg);.      F
cf50: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
cf60: 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b  l = &pNew->aLvl[
cf70: 69 5d 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20  i];.      pIter 
cf80: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65  = pNew;.      me
cf90: 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69  mset(pLvl, 0, si
cfa0: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
cfb0: 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  l));.      pLvl-
cfc0: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
cfd0: 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29  aRead(p, iRowid)
cfe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
cff0: 2d 3e 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c  ->pData && (pLvl
d000: 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20  ->pData->p[0] & 
d010: 30 78 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20  0x0001)==0 ){.  
d020: 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b        bDone = 1;
d030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d040: 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31  Iter->nLvl = i+1
d050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
d060: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
d070: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
d080: 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
d090: 64 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d  d;.    if( bRev=
d0a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
d0b0: 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 70  DlidxIterFirst(p
d0c0: 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Iter);.    }else
d0d0: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
d0e0: 78 49 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74  xIterLast(p, pIt
d0f0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
d100: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
d110: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
d120: 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
d130: 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65  pIter);.    pIte
d140: 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  r = 0;.  }..  re
d150: 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73  turn pIter;.}..s
d160: 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c  tatic i64 fts5Dl
d170: 69 64 78 49 74 65 72 52 6f 77 69 64 28 46 74 73  idxIterRowid(Fts
d180: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
d190: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74  r){.  return pIt
d1a0: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77  er->aLvl[0].iRow
d1b0: 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  id;.}.static int
d1c0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
d1d0: 6e 6f 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  no(Fts5DlidxIter
d1e0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
d1f0: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
d200: 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a  ].iLeafPgno;.}..
d210: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d220: 4c 65 61 66 48 65 61 64 65 72 28 46 74 73 35 44  LeafHeader(Fts5D
d230: 61 74 61 20 2a 70 4c 65 61 66 2c 20 69 6e 74 20  ata *pLeaf, int 
d240: 2a 70 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70  *piRowid, int *p
d250: 69 54 65 72 6d 29 7b 0a 20 20 2a 70 69 52 6f 77  iTerm){.  *piRow
d260: 69 64 20 3d 20 28 69 6e 74 29 66 74 73 35 47 65  id = (int)fts5Ge
d270: 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30  tU16(&pLeaf->p[0
d280: 5d 29 3b 0a 20 20 2a 70 69 54 65 72 6d 20 3d 20  ]);.  *piTerm = 
d290: 28 69 6e 74 29 66 74 73 35 47 65 74 55 31 36 28  (int)fts5GetU16(
d2a0: 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d  &pLeaf->p[2]);.}
d2b0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
d2c0: 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65 20   next leaf page 
d2d0: 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  into the segment
d2e0: 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74   iterator..*/.st
d2f0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d300: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20  gIterNextPage(. 
d310: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
d340: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
d350: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d370: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
d380: 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65  nce to next page
d390: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72   */.){.  Fts5Str
d3a0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
d3b0: 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  Seg = pIter->pSe
d3c0: 67 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  g;.  fts5DataRel
d3d0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
d3e0: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  f);.  pIter->iLe
d3f0: 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  afPgno++;.  if( 
d400: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d410: 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  <=pSeg->pgnoLast
d420: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70   ){.    pIter->p
d430: 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
d440: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
d450: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
d460: 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
d470: 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   0, pIter->iLeaf
d480: 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d  Pgno).    );.  }
d490: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
d4a0: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a  >pLeaf = 0;.  }.
d4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
d4c0: 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  t p points to a 
d4d0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
d4e0: 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20 62 65  g a varint to be
d4f0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
d500: 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69  a.** position li
d510: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52  st size field. R
d520: 65 61 64 20 74 68 65 20 76 61 72 69 6e 74 20 61  ead the varint a
d530: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  nd return the nu
d540: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a  mber of bytes.**
d550: 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20 72 65   read. Before re
d560: 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e  turning, set *pn
d570: 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  Sz to the number
d580: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
d590: 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73   position.** lis
d5a0: 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f  t, and *pbDel to
d5b0: 20 74 72 75 65 20 69 66 20 74 68 65 20 64 65 6c   true if the del
d5c0: 65 74 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ete flag is set,
d5d0: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
d5e0: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
d5f0: 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  nt fts5GetPoslis
d600: 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a  tSize(const u8 *
d610: 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e  p, int *pnSz, in
d620: 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74  t *pbDel){.  int
d630: 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   nSz;.  int n = 
d640: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
d650: 70 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72  p, nSz);.  asser
d660: 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a  t_nc( nSz>=0 );.
d670: 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b    *pnSz = nSz/2;
d680: 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20  .  *pbDel = nSz 
d690: 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75  & 0x0001;.  retu
d6a0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn n;.}../*.** F
d6b0: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
d6c0: 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79  Offset currently
d6d0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
d6e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a  irst byte of a.*
d6f0: 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  * position-list 
d700: 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64  size field. Read
d710: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
d720: 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72  e field and stor
d730: 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66  e it.** in the f
d740: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
d750: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35  es:.**.**   Fts5
d760: 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20  SegIter.nPos.** 
d770: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62 44    Fts5SegIter.bD
d780: 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46  el.**.** Leave F
d790: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
d7a0: 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20  Offset pointing 
d7b0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
d7c0: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73  e of the .** pos
d7d0: 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65  ition list conte
d7e0: 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a  nt (if any)..*/.
d7f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d800: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
d810: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d820: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d830: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
d840: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d850: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
d860: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  r->iLeafOffset; 
d870: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65   /* Offset to re
d880: 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 69 66 28  ad at */.    if(
d890: 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c   iOff>=pIter->pL
d8a0: 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  eaf->n ){.      
d8b0: 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
d8c0: 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RUPT;.    }else{
d8d0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
d8e0: 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65  *a = &pIter->pLe
d8f0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 3b 0a 20 20 20  af->p[iOff];.   
d900: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
d910: 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74  ffset += fts5Get
d920: 50 6f 73 6c 69 73 74 53 69 7a 65 28 61 2c 20 26  PoslistSize(a, &
d930: 70 49 74 65 72 2d 3e 6e 50 6f 73 2c 20 26 70 49  pIter->nPos, &pI
d940: 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20 20 20  ter->bDel);.    
d950: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
d960: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
d970: 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79  Offset currently
d980: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
d990: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d9a0: 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66   .** "nSuffix" f
d9b0: 69 65 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20  ield of a term. 
d9c0: 46 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  Function paramet
d9d0: 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e  er nKeep contain
d9e0: 73 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  s the value.** o
d9f0: 66 20 74 68 65 20 22 6e 50 72 65 66 69 78 22 20  f the "nPrefix" 
da00: 66 69 65 6c 64 20 28 69 66 20 74 68 65 72 65 20  field (if there 
da10: 77 61 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20  was one - it is 
da20: 70 61 73 73 65 64 20 30 20 69 66 20 74 68 69 73  passed 0 if this
da30: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
da40: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67   term in the seg
da50: 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ment)..**.** Thi
da60: 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c  s function popul
da70: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74  ates:.**.**   Ft
da80: 73 35 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a  s5SegIter.term.*
da90: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
daa0: 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f  rowid.**.** acco
dab0: 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76  rdingly and leav
dac0: 65 73 20 28 46 74 73 35 53 65 67 49 74 65 72 2e  es (Fts5SegIter.
dad0: 69 4c 65 61 66 4f 66 66 73 65 74 29 20 73 65 74  iLeafOffset) set
dae0: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   to the content 
daf0: 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  of.** the first 
db00: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54  position list. T
db10: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
db20: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f   belonging to do
db30: 63 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35  cument .** (Fts5
db40: 53 65 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e  SegIter.iRowid).
db50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
db60: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
db70: 65 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70  erm(Fts5Index *p
db80: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
db90: 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29  Iter, int nKeep)
dba0: 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65  {.  u8 *a = pIte
dbb0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20  r->pLeaf->p;    
dbc0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
dbd0: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
dbe0: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  */.  int iOff = 
dbf0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
dc00: 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  et;  /* Offset t
dc10: 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69  o read at */.  i
dc20: 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc40: 2a 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64  * Bytes of new d
dc50: 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b  ata */..  iOff +
dc60: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
dc70: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77  2(&a[iOff], nNew
dc80: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d  );.  pIter->term
dc90: 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74  .n = nKeep;.  ft
dca0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
dcb0: 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  ob(&p->rc, &pIte
dcc0: 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26  r->term, nNew, &
dcd0: 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66  a[iOff]);.  iOff
dce0: 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65   += nNew;.  pIte
dcf0: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
dd00: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74  et = iOff;.  pIt
dd10: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
dd20: 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  o = pIter->iLeaf
dd30: 50 67 6e 6f 3b 0a 20 20 69 66 28 20 69 4f 66 66  Pgno;.  if( iOff
dd40: 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  >=pIter->pLeaf->
dd50: 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67  n ){.    fts5Seg
dd60: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
dd70: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
dd80: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
dd90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
dda0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
ddb0: 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
ddc0: 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  RUPT;.      retu
ddd0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f  rn;.    }.    iO
dde0: 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20  ff = 4;.    a = 
ddf0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
de00: 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73  .  }.  iOff += s
de10: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
de20: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
de30: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
de40: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  .  pIter->iLeafO
de50: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a  ffset = iOff;.}.
de60: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
de70: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
de80: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
de90: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
dea0: 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  he entries in.**
deb0: 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54   segment pSeg. T
dec0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
ded0: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
dee0: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
def0: 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  when .** this fu
df00: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
df10: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
df20: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
df30: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
df40: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
df50: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
df60: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
df70: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
df80: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
df90: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
dfa0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
dfb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
dfc0: 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20  5SegIterInit(.  
dfd0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a  /* FTS index obj
e000: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
e010: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
e020: 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
e030: 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
e040: 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
e050: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
e060: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
e070: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
e080: 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  .){.  if( pSeg->
e090: 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a  pgnoFirst==0 ){.
e0a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
e0b0: 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65  ens if the segme
e0c0: 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  nt is being used
e0d0: 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20   as an input to 
e0e0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20  an incremental. 
e0f0: 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20     ** merge and 
e100: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72  all data has alr
e110: 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d  eady been "trimm
e120: 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f  ed". See functio
e130: 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69  n.    ** fts5Tri
e140: 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20  mSegments() for 
e150: 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  details. In this
e160: 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20   case leave the 
e170: 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a  iterator empty..
e180: 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
e190: 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28  r will see the (
e1a0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
e1b0: 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20   and assume the 
e1c0: 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  iterator is.    
e1d0: 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64  ** at EOF alread
e1e0: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
e1f0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
e200: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
e210: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
e220: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e230: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72      memset(pIter
e240: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
e250: 65 72 29 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  er));.    pIter-
e260: 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20  >pSeg = pSeg;.  
e270: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
e280: 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  no = pSeg->pgnoF
e290: 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35  irst-1;.    fts5
e2a0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
e2b0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a  p, pIter);.  }..
e2c0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
e2d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38  ITE_OK ){.    u8
e2e0: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
e2f0: 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74 65 72  af->p;.    pIter
e300: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
e310: 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d  fts5GetU16(&a[2]
e320: 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  );.    fts5SegIt
e330: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
e340: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73  ter, 0);.    fts
e350: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
e360: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
e370: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
e380: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
e390: 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74  ver called on it
e3a0: 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20  erators created 
e3b0: 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46  by calls to.** F
e3c0: 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20  ts5IndexQuery() 
e3d0: 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44  with the FTS5IND
e3e0: 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c  EX_QUERY_DESC fl
e3f0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ag set..**.** Th
e400: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e  e iterator is in
e410: 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74   an unusual stat
e420: 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
e430: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20  tion is called: 
e440: 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  the.** Fts5SegIt
e450: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76  er.iLeafOffset v
e460: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
e470: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  o the offset of 
e480: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
e490: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
e4a0: 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72  t size field for
e4b0: 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76   the first relev
e4c0: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
e4d0: 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65   page..** Fts5Se
e4e0: 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73  gIter.rowid is s
e4f0: 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64  et, but nPos and
e500: 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a   bDel are not..*
e510: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
e520: 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  on advances the 
e530: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
e540: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
e550: 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76  e last .** relev
e560: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
e570: 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65   page and, if ne
e580: 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c  cessary, initial
e590: 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f  izes the .** aRo
e5a0: 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20  widOffset[] and 
e5b0: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72  iRowidOffset var
e5c0: 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20  iables. At this 
e5d0: 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61 74  point the iterat
e5e0: 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20  or.** is in its 
e5f0: 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20  regular state - 
e600: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
e610: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74  fOffset points t
e620: 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62  o the first.** b
e630: 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74  yte of the posit
e640: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion list content
e650: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
e660: 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a   said rowid..*/.
e670: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e680: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
e690: 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  itPage(Fts5Index
e6a0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
e6b0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
e6c0: 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
e6d0: 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  ->n;.  int i = p
e6e0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e6f0: 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  t;.  u8 *a = pIt
e700: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
e710: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74  int iRowidOffset
e720: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
e730: 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65  1 ){.    i64 iDe
e740: 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  lta = 0;.    int
e750: 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62   nPos;.    int b
e760: 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 69 20 2b 3d  Dummy;..    i +=
e770: 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
e780: 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73  ize(&a[i], &nPos
e790: 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
e7a0: 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 69  i += nPos;.    i
e7b0: 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b  f( i>=n ) break;
e7c0: 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72  .    i += getVar
e7d0: 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a  int(&a[i], (u64*
e7e0: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 69  )&iDelta);.    i
e7f0: 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62  f( iDelta==0 ) b
e800: 72 65 61 6b 3b 0a 20 20 20 20 70 49 74 65 72 2d  reak;.    pIter-
e810: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
e820: 61 3b 0a 0a 20 20 20 20 69 66 28 20 69 52 6f 77  a;..    if( iRow
e830: 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d  idOffset>=pIter-
e840: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b  >nRowidOffset ){
e850: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  .      int nNew 
e860: 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  = pIter->nRowidO
e870: 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20  ffset + 8;.     
e880: 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e   int *aNew = (in
e890: 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  t*)sqlite3_reall
e8a0: 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64  oc(pIter->aRowid
e8b0: 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a  Offset, nNew*siz
e8c0: 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  eof(int));.     
e8d0: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
e8e0: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
e8f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e910: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72     }.      pIter
e920: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->aRowidOffset =
e930: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74   aNew;.      pIt
e940: 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74  er->nRowidOffset
e950: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a   = nNew;.    }..
e960: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
e970: 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66  dOffset[iRowidOf
e980: 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d  fset++] = pIter-
e990: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
e9a0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e9b0: 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  fset = i;.  }.  
e9c0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
e9d0: 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73  set = iRowidOffs
e9e0: 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65  et;.  fts5SegIte
e9f0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
ea00: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  er);.}../*.**.*/
ea10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ea20: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
ea30: 65 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  ewPage(Fts5Index
ea40: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
ea50: 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
ea60: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
ea70: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
ea80: 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73  REVERSE );.  ass
ea90: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
eaa0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
eab0: 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66  _ONETERM );..  f
eac0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
ead0: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
eae0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
eaf0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
eb00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
eb10: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e  Iter->iLeafPgno>
eb20: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
eb30: 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35  Pgno ){.    Fts5
eb40: 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Data *pNew;.    
eb50: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
eb60: 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66  --;.    pNew = f
eb70: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
eb80: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
eb90: 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  D(.          pIt
eba0: 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
ebb0: 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61  , 0, pIter->iLea
ebc0: 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20  fPgno.    ));.  
ebd0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
ebe0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
ebf0: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
ec00: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
ec10: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
ec20: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
ec30: 66 73 65 74 3c 70 4e 65 77 2d 3e 6e 20 29 7b 0a  fset<pNew->n ){.
ec40: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
ec50: 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20  >pLeaf = pNew;. 
ec60: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ec70: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49  iLeafOffset = pI
ec80: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
ec90: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
eca0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ecb0: 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
ecc0: 66 66 2c 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  ff, dummy;.     
ecd0: 20 20 20 66 74 73 35 4c 65 61 66 48 65 61 64 65     fts5LeafHeade
ece0: 72 28 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 4f  r(pNew, &iRowidO
ecf0: 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ff, &dummy);.   
ed00: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
ed10: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
ed20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
ed30: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
ed40: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ed50: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  t = iRowidOff;. 
ed60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ed70: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
ed80: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
ed90: 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74      u8 *a = &pIt
eda0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74  er->pLeaf->p[pIt
edb0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  er->iLeafOffset]
edc0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
edd0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20  >iLeafOffset += 
ede0: 67 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36  getVarint(a, (u6
edf0: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
ee00: 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
ee10: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
ee20: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
ee30: 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20  Release(pNew);. 
ee40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ee50: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ..  if( pIter->p
ee60: 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
ee70: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
ee80: 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
ee90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
eea0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
eeb0: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
eec0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
eed0: 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74  argument current
eee0: 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ly.** points to 
eef0: 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e  a delete marker.
ef00: 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72   A delete marker
ef10: 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74   is an entry wit
ef20: 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f  h a 0 byte.** po
ef30: 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a  sition-list..*/.
ef40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
ef50: 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
ef60: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ef70: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
ef80: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65  pIter){.  Fts5Se
ef90: 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
efa0: 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
efb0: 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
efc0: 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  st];.  return (p
efd0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
efe0: 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26  && pSeg->pLeaf &
eff0: 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29  & pSeg->nPos==0)
f000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
f010: 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  ce iterator pIte
f020: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
f030: 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  try. .**.** If a
f040: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
f050: 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
f060: 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
f070: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
f080: 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  . It .** is not 
f090: 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
f0a0: 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61  ror if the itera
f0b0: 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e  tor reaches EOF.
f0c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
f0d0: 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
f0e0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
f0f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
f100: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
f110: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
f120: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
f130: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
f140: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
f150: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
f160: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
f170: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
f180: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
f190: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
f1a0: 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
f1b0: 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20   *pbNewTerm     
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f1d0: 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77  OUT: Set for new
f1e0: 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73   term */.){.  as
f1f0: 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d  sert( pbNewTerm=
f200: 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d  =0 || *pbNewTerm
f210: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
f220: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f230: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
f240: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
f250: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a  ITER_REVERSE ){.
f260: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
f270: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30  ->iRowidOffset>0
f280: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
f290: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
f2a0: 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ->p;.        int
f2b0: 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69   iOff;.        i
f2c0: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  nt nPos;.       
f2d0: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
f2e0: 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
f2f0: 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ..        pIter-
f300: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b  >iRowidOffset--;
f310: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
f320: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
f330: 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77  ff = pIter->aRow
f340: 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e  idOffset[pIter->
f350: 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20  iRowidOffset];. 
f360: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
f370: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
f380: 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  e(&a[iOff], &nPo
f390: 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
f3a0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f       iOff += nPo
f3b0: 73 3b 0a 20 20 20 20 20 20 20 20 67 65 74 56 61  s;.        getVa
f3c0: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
f3d0: 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
f3e0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
f3f0: 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  owid -= iDelta;.
f400: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
f410: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
f420: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
f430: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
f440: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
f450: 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
f460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f470: 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 44 61  se{.      Fts5Da
f480: 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
f490: 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20  r->pLeaf;.      
f4a0: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
f4b0: 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
f4c0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65  ;.      int nKee
f4d0: 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  p = 0;..      /*
f4e0: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
f4f0: 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74  end of the posit
f500: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20  ion list within 
f510: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f520: 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 61  . */.      u8 *a
f530: 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20   = pLeaf->p;.   
f540: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65 61 66     int n = pLeaf
f550: 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66  ->n;..      iOff
f560: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
f570: 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e  ffset + pIter->n
f580: 50 6f 73 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  Pos;..      if( 
f590: 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  iOff<n ){.      
f5a0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e    /* The next en
f5b0: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75  try is on the cu
f5c0: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
f5d0: 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74 61        u64 iDelta
f5e0: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
f5f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
f600: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44  nt(&a[iOff], &iD
f610: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70  elta);.        p
f620: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f630: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
f640: 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
f650: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65  ){.          bNe
f660: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
f670: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e       if( iOff>=n
f680: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f690: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
f6a0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
f6b0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
f6c0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
f6d0: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  4;.          }el
f6e0: 73 65 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73  se if( iOff!=fts
f6f0: 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 20 29  5GetU16(&a[2]) )
f700: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
f710: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
f720: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
f730: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
f740: 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eep);.          
f750: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
f760: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
f770: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
f780: 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ta;.        }.  
f790: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
f7a0: 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a  ter->pSeg==0 ){.
f7b0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38          const u8
f7c0: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
f7d0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
f7e0: 2a 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  *zTerm;.        
f7f0: 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  int nList;.     
f800: 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65 72     if( 0==(pIter
f810: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
f820: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
f830: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f840: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
f850: 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a  Next(p->pHash);.
f860: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f870: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
f880: 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54  ry(p->pHash, &zT
f890: 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
f8a0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
f8b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73          if( pLis
f8c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
f8d0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f8e0: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f8f0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
f900: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
f910: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f920: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f930: 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
f940: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  st;.          pI
f950: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 3d 20  ter->pLeaf->n = 
f960: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  nList;.         
f970: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
f980: 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
f990: 49 74 65 72 2d 3e 74 65 72 6d 2c 20 73 74 72 6c  Iter->term, strl
f9a0: 65 6e 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29  en(zTerm), (u8*)
f9b0: 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  zTerm);.        
f9c0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
f9d0: 66 73 65 74 20 3d 20 67 65 74 56 61 72 69 6e 74  fset = getVarint
f9e0: 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70  (pList, (u64*)&p
f9f0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
fa00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fa10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
fa20: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
fa30: 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73  /* Next entry is
fa40: 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72   not on the curr
fa50: 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ent page */.    
fa60: 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d      while( iOff=
fa70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
fa80: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
fa90: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
faa0: 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d           pLeaf =
fab0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
fac0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
fad0: 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  af==0 ) break;. 
fae0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f           if( (iO
faf0: 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
fb00: 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20 29  &pLeaf->p[0])) )
fb10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f  {.            iO
fb20: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74  ff += sqlite3Get
fb30: 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70  Varint(&pLeaf->p
fb40: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
fb50: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
fb60: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
fb70: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
fb80: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
fb90: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65  }.          else
fba0: 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73   if( (iOff = fts
fbb0: 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
fbc0: 70 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 20 20  p[2])) ){.      
fbd0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
fbe0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
fbf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 4e 65  .            bNe
fc00: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
fc10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
fc20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
fc30: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
fc40: 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20  iterator is now 
fc50: 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72  at EOF. If so, r
fc60: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a  eturn early. */.
fc70: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
fc80: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
fc90: 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29    if( bNewTerm )
fca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
fcb0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
fcc0: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
fcd0: 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ERM ){.         
fce0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
fcf0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
fd00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
fd10: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
fd20: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
fd30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
fd40: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
fd50: 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70  (p, pIter, nKeep
fd60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
fd70: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
fd80: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
fd90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 62            if( pb
fda0: 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77  NewTerm ) *pbNew
fdb0: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
fdc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
fdd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
fde0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
fdf0: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
fe00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
fe10: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65      }.  }.}..#de
fe20: 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20  fine SWAPVAL(T, 
fe30: 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74  a, b) { T tmp; t
fe40: 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70  mp=a; a=b; b=tmp
fe50: 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  ; }../*.** Itera
fe60: 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
fe70: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
fe80: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  e first rowid in
fe90: 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73   a doclist. This
fea0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  .** function set
feb0: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75  s the iterator u
fec0: 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74  p so that iterat
fed0: 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
fee0: 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  der through.** t
fef0: 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73  he doclist..*/.s
ff00: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
ff10: 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74  egIterReverse(Ft
ff20: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
ff30: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
ff40: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
ff50: 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72   *pDlidx = pIter
ff60: 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35  ->pDlidx;.  Fts5
ff70: 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b  Data *pLast = 0;
ff80: 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
ff90: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69  = 0;..  if( pDli
ffa0: 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  dx ){.    int iS
ffb0: 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53  egid = pIter->pS
ffc0: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
ffd0: 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44  pgnoLast = fts5D
ffe0: 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
fff0: 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20  idx);.    pLast 
10000 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
10010 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
10020 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20  OWID(iSegid, 0, 
10030 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65  pgnoLast));.  }e
10040 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  lse{.    int iOf
10050 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
10080 77 69 74 68 69 6e 20 70 4c 65 61 66 20 2a 2f 0a  within pLeaf */.
10090 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
100a0 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
100b0 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  af;         /* C
100c0 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61  urrent leaf data
100d0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72   */..    /* Curr
100e0 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74  ently, Fts5SegIt
100f0 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 28  er.iLeafOffset (
10100 61 6e 64 20 69 4f 66 66 29 20 70 6f 69 6e 74 73  and iOff) points
10110 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 0a 20   to the first . 
10120 20 20 20 2a 2a 20 62 79 74 65 20 6f 66 20 70 6f     ** byte of po
10130 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74  sition-list cont
10140 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  ent for the curr
10150 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20  ent rowid. Back 
10160 69 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 6f 20  it up.    ** so 
10170 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
10180 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
10190 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
101a0 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a   size field. */.
101b0 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
101c0 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69 74 65  Offset -= sqlite
101d0 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65  3Fts5GetVarintLe
101e0 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b  n(pIter->nPos*2+
101f0 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20  pIter->bDel);.  
10200 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
10210 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
10220 20 61 73 73 65 72 74 28 20 69 4f 66 66 3e 3d 34   assert( iOff>=4
10230 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72   );..    /* Sear
10240 63 68 20 66 6f 72 20 61 20 6e 65 77 20 74 65 72  ch for a new ter
10250 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  m within the cur
10260 72 65 6e 74 20 6c 65 61 66 2e 20 49 66 20 6f 6e  rent leaf. If on
10270 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 0a  e can be found,.
10280 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73      ** then this
10290 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74   page contains t
102a0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64  he largest rowid
102b0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
102c0 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 77 68   term. */.    wh
102d0 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d  ile( iOff<pLeaf-
102e0 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >n ){.      int 
102f0 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 36 34 20  nPos;.      i64 
10300 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 6e  iDelta;.      in
10310 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 20  t bDummy;..     
10320 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 6f 73   /* Read the pos
10330 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
10340 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 69  field */.      i
10350 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f  Off += fts5GetPo
10360 73 6c 69 73 74 53 69 7a 65 28 26 70 4c 65 61 66  slistSize(&pLeaf
10370 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73  ->p[iOff], &nPos
10380 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
10390 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a    iOff += nPos;.
103a0 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
103b0 70 4c 65 61 66 2d 3e 6e 20 29 20 62 72 65 61 6b  pLeaf->n ) break
103c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;..      /* Rowi
103d0 64 20 64 65 6c 74 61 2e 20 4f 72 2c 20 69 66 20  d delta. Or, if 
103e0 30 78 30 30 2c 20 74 68 65 20 65 6e 64 20 6f 66  0x00, the end of
103f0 20 64 6f 63 6c 69 73 74 20 6d 61 72 6b 65 72 2e   doclist marker.
10400 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d   */.      nPos =
10410 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61   getVarint(&pLea
10420 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
10430 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
10440 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
10450 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
10460 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  Off += nPos;.   
10470 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
10480 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
10490 74 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c 61  true then the la
104a0 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20  rgest rowid for 
104b0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
104c0 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20  ** term may not 
104d0 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  be stored on the
104e0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53   current page. S
104f0 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61 72 64  o search forward
10500 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20 77   to.    ** see w
10510 68 65 72 65 20 73 61 69 64 20 72 6f 77 69 64 20  here said rowid 
10520 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20  really is.  */. 
10530 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
10540 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69  af->n ){.      i
10550 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46  nt pgno;.      F
10560 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
10570 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
10580 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20  r->pSeg;..      
10590 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69  /* The last rowi
105a0 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
105b0 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74   may not be on t
105c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
105d0 20 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a   Search.      **
105e0 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64   forward to find
105f0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
10600 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f  ning the last ro
10610 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  wid.  */.      f
10620 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69  or(pgno=pIter->i
10630 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e  LeafPgno+1; !p->
10640 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67  rc && pgno<=pSeg
10650 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f  ->pgnoLast; pgno
10660 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ++){.        i64
10670 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47   iAbs = FTS5_SEG
10680 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
10690 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f  >iSegid, 0, pgno
106a0 29 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44  );.        Fts5D
106b0 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35  ata *pNew = fts5
106c0 44 61 74 61 52 65 61 64 28 70 2c 20 69 41 62 73  DataRead(p, iAbs
106d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
106e0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
106f0 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 69 54 65   int iRowid, iTe
10700 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  rm;.          ft
10710 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4e 65  s5LeafHeader(pNe
10720 77 2c 20 26 69 52 6f 77 69 64 2c 20 26 69 54 65  w, &iRowid, &iTe
10730 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rm);.          i
10740 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  f( iRowid ){.   
10750 20 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c           SWAPVAL
10760 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77  (Fts5Data*, pNew
10770 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  , pLast);.      
10780 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d        pgnoLast =
10790 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20   pgno;.         
107a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
107b0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
107c0 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
107d0 28 20 69 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ( iTerm ) break;
107e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
107f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
10800 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e  /* If pLast is N
10810 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ULL at this poin
10820 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  t, then the last
10830 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   rowid for this 
10840 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65  doclist.  ** lie
10850 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75  s on the page cu
10860 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65  rrently indicate
10870 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
10880 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
10890 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65  .  ** pIter->iLe
108a0 61 66 4f 66 66 73 65 74 20 69 73 20 61 6c 72 65  afOffset is alre
108b0 61 64 79 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ady set to point
108c0 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
108d0 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20  -list size.  ** 
108e0 66 69 65 6c 64 20 61 73 73 6f 63 69 61 74 65 64  field associated
108f0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
10900 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f  relevant rowid o
10910 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  n the page..  **
10920 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61  .  ** Or, if pLa
10930 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  st is non-NULL, 
10940 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 70  then it is the p
10950 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
10960 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20  s the last.  ** 
10970 72 6f 77 69 64 2e 20 49 6e 20 74 68 69 73 20 63  rowid. In this c
10980 61 73 65 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ase configure th
10990 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68  e iterator so th
109a0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
109b0 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 72  the.  ** first r
109c0 6f 77 69 64 20 6f 6e 20 74 68 69 73 20 70 61 67  owid on this pag
109d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  e..  */.  if( pL
109e0 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ast ){.    int d
109f0 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74 20 69 4f  ummy;.    int iO
10a00 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  ff;.    fts5Data
10a10 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
10a20 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72  Leaf);.    pIter
10a30 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b  ->pLeaf = pLast;
10a40 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
10a50 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74  fPgno = pgnoLast
10a60 3b 0a 20 20 20 20 66 74 73 35 4c 65 61 66 48 65  ;.    fts5LeafHe
10a70 61 64 65 72 28 70 4c 61 73 74 2c 20 26 69 4f 66  ader(pLast, &iOf
10a80 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  f, &dummy);.    
10a90 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
10aa0 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66  t(&pLast->p[iOff
10ab0 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
10ac0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49  >iRowid);.    pI
10ad0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
10ae0 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20   = iOff;.  }..  
10af0 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
10b00 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
10b10 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ter);.}../*.** I
10b20 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
10b30 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
10b40 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
10b50 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a  d of a doclist..
10b60 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 64 6f  ** There is a do
10b70 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f  clist-index asso
10b80 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
10b90 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68  final term on th
10ba0 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61  e current .** pa
10bb0 67 65 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ge. If the curre
10bc0 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c  nt term is the l
10bd0 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  ast term on the 
10be0 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a  page, load the .
10bf0 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
10c00 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69   from disk and i
10c10 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65  nitialize an ite
10c20 72 61 74 6f 72 20 61 74 20 28 70 49 74 65 72 2d  rator at (pIter-
10c30 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61  >pDlidx)..*/.sta
10c40 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
10c50 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74  IterLoadDlidx(Ft
10c60 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
10c70 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
10c80 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70 49  .  int iSeg = pI
10c90 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
10ca0 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20  d;.  int bRev = 
10cb0 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
10cc0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
10cd0 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61 74  ERSE);.  Fts5Dat
10ce0 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
10cf0 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72  ->pLeaf; /* Curr
10d00 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
10d10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
10d20 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
10d30 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
10d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
10d50 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b  er->pDlidx==0 );
10d60 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
10d70 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
10d80 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73  ist ends on this
10d90 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65   page. If it doe
10da0 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65  s, return.  ** e
10db0 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61  arly without loa
10dc0 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74  ding the doclist
10dd0 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62 65  -index (as it be
10de0 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65  longs to a diffe
10df0 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  rent.  ** term. 
10e00 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
10e10 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70  iTermLeafPgno==p
10e20 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
10e30 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  ){.    int iOff 
10e40 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
10e50 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50  fset + pIter->nP
10e60 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  os;.    while( i
10e70 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a  Off<pLeaf->n ){.
10e80 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
10e90 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73  ;.      int nPos
10ea0 3b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  ;.      i64 iDel
10eb0 74 61 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 4f  ta;..      /* iO
10ec0 66 66 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ff is currently 
10ed0 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
10ee0 65 20 73 74 61 72 74 20 6f 66 20 70 6f 73 69 74  e start of posit
10ef0 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 2a 2f  ion list data */
10f00 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
10f10 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
10f20 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
10f30 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
10f40 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20  if( iDelta==0 ) 
10f50 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73  return;.      as
10f60 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c  sert_nc( iOff<pL
10f70 65 61 66 2d 3e 6e 20 29 3b 0a 20 20 20 20 20 20  eaf->n );.      
10f80 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50  iOff += fts5GetP
10f90 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 4c 65 61  oslistSize(&pLea
10fa0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  f->p[iOff], &nPo
10fb0 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
10fc0 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b     iOff += nPos;
10fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49  .    }.  }..  pI
10fe0 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74  ter->pDlidx = ft
10ff0 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
11000 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70  p, bRev, iSeg, p
11010 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
11020 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  gno);.}../*.** I
11030 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62  nitialize the ob
11040 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f  ject pIter to po
11050 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72  int to term pTer
11060 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73  m/nTerm within s
11070 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20  egment.** pSeg. 
11080 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
11090 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
110a0 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72 61  index, the itera
110b0 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f  tor is set to EO
110c0 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  F..**.** If an e
110d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
110e0 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
110f0 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
11100 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
11110 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
11120 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
11130 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
11140 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11150 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
11160 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11170 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
11180 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
11190 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
111a0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
111b0 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  ackend */.  cons
111c0 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
111d0 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
111e0 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a  erm to seek to *
111f0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
11220 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61  TS5INDEX_XXX fla
11230 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  gs */.  Fts5Stru
11240 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
11250 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  eg,     /* Descr
11260 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e  iption of segmen
11270 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
11280 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
11290 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
112a0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
112b0 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20 31  ){.  int iPg = 1
112c0 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74  ;.  int h;.  int
112d0 20 62 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20   bGe = (flags & 
112e0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
112f0 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c  SCAN);.  int bDl
11300 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  idx = 0;        
11310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11320 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
11330 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
11340 0a 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d  .  assert( bGe==
11350 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
11360 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
11370 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  SC)==0 );.  asse
11380 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65  rt( pTerm && nTe
11390 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  rm );.  memset(p
113a0 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
113b0 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
113c0 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
113d0 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
113e0 20 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69   sets stack vari
113f0 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20  able iPg to the 
11400 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
11410 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63   that may.  ** c
11420 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65  ontain term (pTe
11430 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74  rm/nTerm), if it
11440 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
11450 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  he segment. */. 
11460 20 66 6f 72 28 68 3d 70 53 65 67 2d 3e 6e 48 65   for(h=pSeg->nHe
11470 69 67 68 74 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d  ight-1; h>0; h--
11480 29 7b 0a 20 20 20 20 46 74 73 35 4e 6f 64 65 49  ){.    Fts5NodeI
11490 74 65 72 20 6e 6f 64 65 3b 20 20 20 20 20 20 20  ter node;       
114a0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74         /* For it
114b0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
114c0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 2a  internal nodes *
114d0 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
114e0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
114f0 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
11500 69 64 2c 20 68 2c 20 69 50 67 29 3b 0a 20 20 20  id, h, iPg);.   
11510 20 46 74 73 35 44 61 74 61 20 2a 70 4e 6f 64 65   Fts5Data *pNode
11520 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
11530 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  p, iRowid);.    
11540 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62  if( pNode==0 ) b
11550 72 65 61 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e  reak;..    fts5N
11560 6f 64 65 49 74 65 72 49 6e 69 74 28 70 4e 6f 64  odeIterInit(pNod
11570 65 2d 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20  e->p, pNode->n, 
11580 26 6e 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65  &node);.    asse
11590 72 74 28 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d  rt( node.term.n=
115a0 3d 30 20 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d  =0 );..    iPg =
115b0 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20   node.iChild;.  
115c0 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e    bDlidx = node.
115d0 62 44 6c 69 64 78 3b 0a 20 20 20 20 66 6f 72 28  bDlidx;.    for(
115e0 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74  fts5NodeIterNext
115f0 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b  (&p->rc, &node);
11600 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 2e 61 44  .        node.aD
11610 61 74 61 20 26 26 20 66 74 73 35 42 75 66 66 65  ata && fts5Buffe
11620 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f  rCompareBlob(&no
11630 64 65 2e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20  de.term, pTerm, 
11640 6e 54 65 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20  nTerm)<=0;.     
11650 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e     fts5NodeIterN
11660 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64  ext(&p->rc, &nod
11670 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
11680 69 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c  iPg = node.iChil
11690 64 3b 0a 20 20 20 20 20 20 62 44 6c 69 64 78 20  d;.      bDlidx 
116a0 3d 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20  = node.bDlidx;. 
116b0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64     }.    fts5Nod
116c0 65 49 74 65 72 46 72 65 65 28 26 6e 6f 64 65 29  eIterFree(&node)
116d0 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
116e0 6c 65 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20  lease(pNode);.  
116f0 7d 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65  }..  if( iPg<pSe
11700 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a  g->pgnoFirst ){.
11710 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e      iPg = pSeg->
11720 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62  pgnoFirst;.    b
11730 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Dlidx = 0;.  }..
11740 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
11750 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20  no = iPg - 1;.  
11760 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
11770 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  age(p, pIter);..
11780 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
11790 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  af ){.    int re
117a0 73 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  s;.    pIter->iL
117b0 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
117c0 47 65 74 55 31 36 28 26 70 49 74 65 72 2d 3e 70  GetU16(&pIter->p
117d0 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20  Leaf->p[2]);.   
117e0 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
117f0 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30  Term(p, pIter, 0
11800 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  );.    fts5SegIt
11810 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
11820 74 65 72 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  ter);.    do {. 
11830 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35 42       res = fts5B
11840 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
11850 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70  (&pIter->term, p
11860 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
11870 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
11880 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 74   break;.      ft
11890 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
118a0 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20   pIter, 0);.    
118b0 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 70  }while( pIter->p
118c0 4c 65 61 66 20 26 26 20 70 2d 3e 72 63 3d 3d 53  Leaf && p->rc==S
118d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
118e0 20 69 66 28 20 62 47 65 3d 3d 30 20 26 26 20 72   if( bGe==0 && r
118f0 65 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  es ){.      /* S
11900 65 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70  et iterator to p
11910 6f 69 6e 74 20 74 6f 20 45 4f 46 20 2a 2f 0a 20  oint to EOF */. 
11920 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
11930 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
11940 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  f);.      pIter-
11950 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
11960 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
11970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11980 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70   bGe==0 ){.    p
11990 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
119a0 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
119b0 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74  ERM;.    if( pIt
119c0 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
119d0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
119e0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
119f0 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ESC ){.        p
11a00 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
11a10 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
11a20 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RSE;.      }.   
11a30 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b     if( bDlidx ){
11a40 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
11a50 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c  IterLoadDlidx(p,
11a60 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
11a70 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
11a80 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
11a90 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  RY_DESC ){.     
11aa0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
11ab0 76 65 72 73 65 28 70 2c 20 70 49 74 65 72 29 3b  verse(p, pIter);
11ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11ad0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
11ae0 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
11af0 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
11b00 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
11b10 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 0a  Term within the.
11b20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  ** in-memory has
11b30 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 72  h table. If ther
11b40 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72  e is no such ter
11b50 6d 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61  m in the hash-ta
11b60 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65  ble, the .** ite
11b70 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20  rator is set to 
11b80 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  EOF..**.** If an
11b90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
11ba0 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
11bb0 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
11bc0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
11bd0 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
11be0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
11bf0 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
11c00 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11c10 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
11c20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
11c30 64 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73  d fts5SegIterHas
11c40 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  hInit(.  Fts5Ind
11c50 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
11c60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
11c70 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f   backend */.  co
11c80 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
11c90 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
11ca0 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
11cb0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
11ce0 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66   FTS5INDEX_XXX f
11cf0 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 65  lags */.  Fts5Se
11d00 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
11d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
11d20 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
11d30 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
11d40 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69   *pList = 0;.  i
11d50 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20  nt nList = 0;.  
11d60 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b  const u8 *z = 0;
11d70 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20  .  int n = 0;.. 
11d80 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73   assert( p->pHas
11d90 68 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  h );.  assert( p
11da0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11db0 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d 3d  );..  if( pTerm=
11dc0 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46  =0 || (flags & F
11dd0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
11de0 43 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72  CAN) ){.    p->r
11df0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
11e00 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70  ashScanInit(p->p
11e10 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
11e20 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  r*)pTerm, nTerm)
11e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
11e40 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
11e50 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20  ->pHash, (const 
11e60 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73  char**)&z, &pLis
11e70 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
11e80 6e 20 3d 20 28 7a 20 3f 20 73 74 72 6c 65 6e 28  n = (z ? strlen(
11e90 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 29 20  (const char*)z) 
11ea0 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  : 0);.  }else{. 
11eb0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
11ec0 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
11ed0 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c  ONETERM;.    sql
11ee0 69 74 65 33 46 74 73 35 48 61 73 68 51 75 65 72  ite3Fts5HashQuer
11ef0 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  y(p->pHash, (con
11f00 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
11f10 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  nTerm, &pList, &
11f20 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20  nList);.    z = 
11f30 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e  pTerm;.    n = n
11f40 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Term;.  }..  if(
11f50 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74   pList ){.    Ft
11f60 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
11f70 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
11f80 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
11f90 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c  &pIter->term, n,
11fa0 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d   z);.    pLeaf =
11fb0 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
11fc0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  , sizeof(Fts5Dat
11fd0 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  a));.    if( pLe
11fe0 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  af==0 ) return;.
11ff0 20 20 20 20 70 4c 65 61 66 2d 3e 6e 52 65 66 20      pLeaf->nRef 
12000 3d 20 31 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e  = 1;.    pLeaf->
12010 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
12020 20 20 20 20 70 4c 65 61 66 2d 3e 6e 20 3d 20 6e      pLeaf->n = n
12030 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  List;.    pIter-
12040 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a  >pLeaf = pLeaf;.
12050 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
12060 4f 66 66 73 65 74 20 3d 20 67 65 74 56 61 72 69  Offset = getVari
12070 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36  nt(pLeaf->p, (u6
12080 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
12090 64 29 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61  d);..    if( fla
120a0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
120b0 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
120c0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
120d0 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
120e0 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66  REVERSE;.      f
120f0 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
12100 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
12110 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
12120 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12130 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
12140 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  er);.    }.  }.}
12150 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65  ../*.** Zero the
12160 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
12170 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
12180 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
12190 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
121a0 72 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74  rClear(Fts5SegIt
121b0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74  er *pIter){.  ft
121c0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
121d0 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  ter->term);.  ft
121e0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
121f0 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66  ter->pLeaf);.  f
12200 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
12210 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b  (pIter->pDlidx);
12220 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12230 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
12240 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  set);.  memset(p
12250 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
12260 46 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d  Fts5SegIter));.}
12270 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12280 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  DEBUG../*.** Thi
12290 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
122a0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
122b0 65 20 62 69 67 20 61 73 73 65 72 74 28 29 20 70  e big assert() p
122c0 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65  rocedure impleme
122d0 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41  nted by.** fts5A
122e0 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
122f0 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65  tup(). It ensure
12300 73 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  s that the resul
12310 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  t currently stor
12320 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69  ed.** in *pRes i
12330 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  s the correct re
12340 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
12350 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
12360 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a  sitions of the.*
12370 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e  * two iterators.
12380 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12390 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
123a0 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74  isonResult(.  Ft
123b0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
123c0 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65  pIter, .  Fts5Se
123d0 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73  gIter *p1,.  Fts
123e0 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20  5SegIter *p2,.  
123f0 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
12400 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20  s.){.  int i1 = 
12410 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  p1 - pIter->aSeg
12420 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20  ;.  int i2 = p2 
12430 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a  - pIter->aSeg;..
12440 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20    if( p1->pLeaf 
12450 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a  || p2->pLeaf ){.
12460 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61      if( p1->pLea
12470 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
12480 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
12490 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65  st==i2 );.    }e
124a0 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61  lse if( p2->pLea
124b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
124c0 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
124d0 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65  st==i1 );.    }e
124e0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
124f0 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65  Min = MIN(p1->te
12500 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e  rm.n, p2->term.n
12510 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  );.      int res
12520 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65   = memcmp(p1->te
12530 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70  rm.p, p2->term.p
12540 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69  , nMin);.      i
12550 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
12560 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70  = p1->term.n - p
12570 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20  2->term.n;..    
12580 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
12590 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
125a0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31  pRes->bTermEq==1
125b0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
125c0 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d  rt( p1->iRowid!=
125d0 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20  p2->iRowid );.  
125e0 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31        res = ((p1
125f0 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69  ->iRowid > p2->i
12600 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
12610 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20  Rev) ? -1 : 1;. 
12620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12630 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12640 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a  ->bTermEq==0 );.
12650 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
12660 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
12670 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12680 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a  ->iFirst==i1 );.
12690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
126a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
126b0 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b  s->iFirst==i2 );
126c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
126d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
126e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
126f0 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49  o-op unless SQLI
12700 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
12710 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f  ned when this mo
12720 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69  dule.** is compi
12730 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73  led. In that cas
12740 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
12750 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20   is essentially 
12760 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  an assert() .** 
12770 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  statement used t
12780 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
12790 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
127a0 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
127b0 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63  ] array.** are c
127c0 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
127d0 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
127e0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
127f0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
12800 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
12810 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
12820 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
12830 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
12840 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
12850 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a  r->nSeg; i+=2){.
12860 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
12870 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  r *p1 = &pIter->
12880 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46  aSeg[i];.      F
12890 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d  ts5SegIter *p2 =
128a0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b   &pIter->aSeg[i+
128b0 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52  1];.      Fts5CR
128c0 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
128d0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49  Iter->aFirst[(pI
128e0 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f  ter->nSeg + i) /
128f0 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41   2];.      fts5A
12900 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
12910 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c  esult(pIter, p1,
12920 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20   p2, pRes);.    
12930 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  }..    for(i=1; 
12940 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f  i<(pIter->nSeg /
12950 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20   2); i+=2){.    
12960 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
12970 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
12980 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 46  irst[i];.      F
12990 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d  ts5SegIter *p1 =
129a0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
129b0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32  Iter->aFirst[i*2
129c0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
129d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
129e0 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  2 = &pIter->aSeg
129f0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
12a00 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  i*2+1].iFirst ];
12a10 0a 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  ..      fts5Asse
12a20 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75  rtComparisonResu
12a30 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32  lt(pIter, p1, p2
12a40 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20  , pRes);.    }. 
12a50 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
12a60 69 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d 75  ine fts5AssertMu
12a70 6c 74 69 49 74 65 72 53 65 74 75 70 28 78 2c 79  ltiIterSetup(x,y
12a80 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12a90 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
12aa0 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70  n necessary to p
12ab0 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61  opulate pIter->a
12ac0 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a  First[iOut]..**.
12ad0 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
12ae0 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  ed value is non-
12af0 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
12b00 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e   the index of an
12b10 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65   entry.** in the
12b20 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61   pIter->aSeg[] a
12b30 72 72 61 79 20 74 68 61 74 20 69 73 20 28 61 29  rray that is (a)
12b40 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64   not at EOF, and
12b50 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   (b) pointing.**
12b60 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69   to a key that i
12b70 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
12b80 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72   another, higher
12b90 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73   priority, .** s
12ba0 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20  egment-iterator 
12bb0 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65  in the pSeg->aSe
12bc0 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  g[] array..*/.st
12bd0 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
12be0 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
12bf0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
12c00 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75   *pIter, int iOu
12c10 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20  t){.  int i1;   
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12c40 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35  f left-hand Fts5
12c50 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74  SegIter */.  int
12c60 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   i2;            
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c80 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68  Index of right-h
12c90 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
12ca0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20  */.  int iRes;. 
12cb0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
12cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12cd0 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74   /* Left-hand Ft
12ce0 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46  s5SegIter */.  F
12cf0 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20  ts5SegIter *p2; 
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d10 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73  * Right-hand Fts
12d20 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
12d30 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
12d40 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
12d50 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72  [iOut];..  asser
12d60 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e  t( iOut<pIter->n
12d70 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b  Seg && iOut>0 );
12d80 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
12d90 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74  ->bRev==0 || pIt
12da0 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a  er->bRev==1 );..
12db0 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74    if( iOut>=(pIt
12dc0 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20  er->nSeg/2) ){. 
12dd0 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20     i1 = (iOut - 
12de0 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a  pIter->nSeg/2) *
12df0 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20   2;.    i2 = i1 
12e00 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  + 1;.  }else{.  
12e10 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46    i1 = pIter->aF
12e20 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69  irst[iOut*2].iFi
12e30 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49  rst;.    i2 = pI
12e40 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
12e50 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  *2+1].iFirst;.  
12e60 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d  }.  p1 = &pIter-
12e70 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20  >aSeg[i1];.  p2 
12e80 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
12e90 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65  2];..  pRes->bTe
12ea0 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20  rmEq = 0;.  if( 
12eb0 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20  p1->pLeaf==0 ){ 
12ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
12ed0 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  p1 is at EOF */.
12ee0 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
12ef0 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70   }else if( p2->p
12f00 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f  Leaf==0 ){     /
12f10 2a 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f  * If p2 is at EO
12f20 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20  F */.    iRes = 
12f30 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  i1;.  }else{.   
12f40 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42   int res = fts5B
12f50 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31  ufferCompare(&p1
12f60 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72  ->term, &p2->ter
12f70 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d  m);.    if( res=
12f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
12f90 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20  rt( i2>i1 );.   
12fa0 20 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30     assert( i2!=0
12fb0 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e   );.      pRes->
12fc0 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20  bTermEq = 1;.   
12fd0 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69     if( p1->iRowi
12fe0 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b  d==p2->iRowid ){
12ff0 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65  .        p1->bDe
13000 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20  l = p2->bDel;.  
13010 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b        return i2;
13020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
13030 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69  es = ((p1->iRowi
13040 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d  d > p2->iRowid)=
13050 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20  =pIter->bRev) ? 
13060 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  -1 : +1;.    }. 
13070 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d     assert( res!=
13080 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  0 );.    if( res
13090 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73  <0 ){.      iRes
130a0 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = i1;.    }else
130b0 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
130c0 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
130d0 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 69  pRes->iFirst = i
130e0 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  Res;.  return 0;
130f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
13100 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74  he seg-iter so t
13110 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
13120 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
13130 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67   on page iLeafPg
13140 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  no..** It is an 
13150 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c  error if leaf iL
13160 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74  eafPgno does not
13170 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
13180 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f  ns no rowids..*/
13190 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
131a0 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65  5SegIterGotoPage
131b0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
131c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
131d0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
131e0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
131f0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
13200 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
13210 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
13220 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
13230 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61  iLeafPgno.){.  a
13240 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f  ssert( iLeafPgno
13250 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
13260 6f 20 29 3b 0a 20 20 69 66 28 20 69 4c 65 61 66  o );.  if( iLeaf
13270 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67  Pgno>pIter->pSeg
13280 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
13290 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
132a0 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  ORRUPT;.  }else{
132b0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
132c0 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
132d0 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  o-1;.    fts5Seg
132e0 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
132f0 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  pIter);.    asse
13300 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
13310 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69  E_OK || pIter->i
13320 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50  LeafPgno==iLeafP
13330 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  gno );..    if( 
13340 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13350 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f   ){.      int iO
13360 66 66 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 20  ff;.      u8 *a 
13370 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
13380 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  p;.      int n =
13390 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
133a0 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ;..      iOff = 
133b0 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d  fts5GetU16(&a[0]
133c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  );.      if( iOf
133d0 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29  f<4 || iOff>=n )
133e0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
133f0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
13400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13410 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74       iOff += get
13420 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
13430 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
13440 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
13450 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
13460 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
13470 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
13480 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
13490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
134a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76    }.}../*.** Adv
134b0 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
134c0 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
134d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
134e0 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f  until it is at o
134f0 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64  r .** past rowid
13500 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65   iFrom. Regardle
13510 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
13520 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74  of iFrom, the it
13530 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77  erator is.** alw
13540 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74 20  ays advanced at 
13550 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73  least once..*/.s
13560 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
13570 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a  egIterNextFrom(.
13580 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135a0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
135b0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
135c0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
135d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
135e0 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
135f0 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d  ance */.  i64 iM
13600 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  atch            
13610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76            /* Adv
13620 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61 74  ance iterator at
13630 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72 20   least this far 
13640 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76  */.){.  int bRev
13650 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73   = (pIter->flags
13660 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
13670 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35  REVERSE);.  Fts5
13680 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
13690 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  x = pIter->pDlid
136a0 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  x;.  int iLeafPg
136b0 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  no = pIter->iLea
136c0 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f  fPgno;.  int bMo
136d0 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72  ve = 1;..  asser
136e0 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
136f0 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
13700 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
13710 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
13720 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x );.  assert( p
13730 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a  Iter->pLeaf );..
13740 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b    if( bRev==0 ){
13750 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73  .    while( !fts
13760 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
13770 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74   pDlidx) && iMat
13780 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72  ch>fts5DlidxIter
13790 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b  Rowid(pDlidx) ){
137a0 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f  .      iLeafPgno
137b0 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
137c0 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
137d0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
137e0 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29  rNext(p, pDlidx)
137f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
13800 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f  rt_nc( iLeafPgno
13810 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  >=pIter->iLeafPg
13820 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20  no || p->rc );. 
13830 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f     if( iLeafPgno
13840 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
13850 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  o ){.      fts5S
13860 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70  egIterGotoPage(p
13870 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67  , pIter, iLeafPg
13880 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  no);.      bMove
13890 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
138a0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
138b0 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69   iMatch<pIter->i
138c0 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69  Rowid );.    whi
138d0 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74  le( !fts5DlidxIt
138e0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
138f0 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35 44   && iMatch<fts5D
13900 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
13910 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 66  lidx) ){.      f
13920 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
13930 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20  (p, pDlidx);.   
13940 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f   }.    iLeafPgno
13950 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
13960 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
13970 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44     assert( fts5D
13980 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
13990 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50  Dlidx) || iLeafP
139a0 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno<=pIter->iLea
139b0 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66  fPgno );..    if
139c0 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65  ( iLeafPgno<pIte
139d0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
139e0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
139f0 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
13a00 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35  no+1;.      fts5
13a10 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
13a20 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
13a30 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30  .      bMove = 0
13a40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
13a50 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
13a60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
13a70 28 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65  ( bMove ) fts5Se
13a80 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  gIterNext(p, pIt
13a90 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
13aa0 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
13ab0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
13ac0 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65   bRev==0 && pIte
13ad0 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  r->iRowid>=iMatc
13ae0 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
13af0 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49  f( bRev!=0 && pI
13b00 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61  ter->iRowid<=iMa
13b10 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
13b20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a   bMove = 1;.  }.
13b30 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  }.../*.** Free t
13b40 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
13b50 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
13b60 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13b80 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
13b90 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ee(Fts5Index *p,
13ba0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
13bb0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
13bc0 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e   pIter ){.    in
13bd0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
13be0 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
13bf0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
13c00 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70  5SegIterClear(&p
13c10 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a  Iter->aSeg[i]);.
13c20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13c30 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20  3_free(pIter);. 
13c40 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
13c50 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  d fts5MultiIterA
13c60 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49  dvanced(.  Fts5I
13c70 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
13c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
13c90 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
13ca0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
13cb0 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
13cc0 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
13cd0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
13ce0 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
13cf0 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
13d00 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20  int iChanged,   
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
13d30 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
13d40 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  vanced */.  int 
13d50 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20  iMinset         
13d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
13d70 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20  inimum entry in 
13d80 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20  aFirst[] to set 
13d90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
13da0 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
13db0 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
13dc0 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70   i>=iMinset && p
13dd0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  ->rc==SQLITE_OK;
13de0 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74   i=i/2){.    int
13df0 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69   iEq;.    if( (i
13e00 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
13e10 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65  erDoCompare(pIte
13e20 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20  r, i)) ){.      
13e30 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
13e40 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
13e50 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iEq], 0);.      
13e60 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20  i = pIter->nSeg 
13e70 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  + iEq;.    }.  }
13e80 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
13e90 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
13ea0 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35  nceRowid(.  Fts5
13eb0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
13ed0 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
13ee0 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
13ef0 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
13f00 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
13f10 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
13f20 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
13f30 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
13f40 20 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20   int iChanged   
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
13f70 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
13f80 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20  dvanced */.){.  
13f90 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 53 65 67  int i;.  Fts5Seg
13fa0 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49  Iter *pNew = &pI
13fb0 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
13fc0 65 64 5d 3b 0a 20 20 46 74 73 35 53 65 67 49 74  ed];.  Fts5SegIt
13fd0 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49  er *pOther = &pI
13fe0 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
13ff0 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 0a 20  ed ^ 0x0001];.. 
14000 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
14010 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
14020 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14030 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 46  K; i=i/2){.    F
14040 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
14050 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
14060 74 5b 69 5d 3b 0a 0a 20 20 20 20 61 73 73 65 72  t[i];..    asser
14070 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29  t( pNew->pLeaf )
14080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
14090 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c  es->bTermEq==0 |
140a0 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20  | pOther->pLeaf 
140b0 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
140c0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b  pRes->bTermEq ){
140d0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
140e0 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d  >iRowid==pOther-
140f0 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
14100 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14110 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
14120 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65  ther->iRowid>pNe
14130 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  w->iRowid)==pIte
14140 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  r->bRev ){.     
14150 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72     pNew = pOther
14160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14170 20 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74      pRes->iFirst
14180 20 3d 20 28 70 4e 65 77 20 2d 20 70 49 74 65 72   = (pNew - pIter
14190 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 69 66 28  ->aSeg);.    if(
141a0 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a   i==1 ) break;..
141b0 20 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49      pOther = &pI
141c0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
141d0 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30  ->aFirst[i ^ 0x0
141e0 30 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  001].iFirst ];. 
141f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
14200 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
14210 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
14220 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
14230 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
14240 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
14250 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
14260 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  n Fts5Index.rc. 
14270 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  It is not .** co
14280 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
14290 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
142a0 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f  r reaches EOF, o
142b0 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
142c0 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68  dy at .** EOF wh
142d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
142e0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
142f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
14300 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20  ultiIterNext(.  
14310 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
14320 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
14330 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
14340 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  bFrom,          
14350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14360 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20  rue if argument 
14370 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a  iFrom is valid *
14380 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20  /.  i64 iFrom   
14390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143a0 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61      /* Advance a
143b0 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61  t least as far a
143c0 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69  s this */.){.  i
143d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
143e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  _OK ){.    int b
143f0 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b  UseFrom = bFrom;
14400 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
14410 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
14420 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
14430 69 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  irst;.      int 
14440 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
14450 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
14460 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
14470 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
14480 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
14490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
144a0 20 20 20 20 20 20 69 66 28 20 62 55 73 65 46 72        if( bUseFr
144b0 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69  om && pSeg->pDli
144c0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  dx ){.        ft
144d0 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
144e0 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d  m(p, pSeg, iFrom
144f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14500 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
14510 74 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  terNext(p, pSeg,
14520 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
14530 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
14540 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c  pSeg->pLeaf==0 |
14550 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20  | bNewTerm .    
14560 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49     || fts5MultiI
14570 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
14580 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
14590 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
145a0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
145b0 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65  Advanced(p, pIte
145c0 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20  r, iFirst, 1);. 
145d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
145e0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
145f0 53 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b  Setup(p, pIter);
14600 0a 0a 20 20 20 20 20 20 62 55 73 65 46 72 6f 6d  ..      bUseFrom
14610 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
14620 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
14630 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69  pty && fts5Multi
14640 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
14650 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  Iter) );.  }.}..
14660 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
14670 20 6e 65 77 20 46 74 73 35 4d 75 6c 74 69 53 65   new Fts5MultiSe
14680 67 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  gIter object..**
14690 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
146a0 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ct will be used 
146b0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
146c0 67 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63  gh data in struc
146d0 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a  ture pStruct..**
146e0 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76   If iLevel is -v
146f0 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61  e, then all data
14700 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73   in all segments
14710 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20   is merged. Or, 
14720 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  if iLevel.** is 
14730 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c  zero or greater,
14740 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66   data from the f
14750 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65  irst nSegment se
14760 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20  gments on level 
14770 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72  iLevel.** is mer
14780 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ged..**.** The i
14790 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c  terator initiall
147a0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
147b0 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64  first term/rowid
147c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a   entry in the .*
147d0 2a 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e  * iterated data.
147e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
147f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
14800 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
14810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14820 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
14830 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
14840 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53  ithin */.  Fts5S
14850 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
14860 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  t,         /* St
14870 72 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69  ructure of speci
14880 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  fic index */.  i
14890 6e 74 20 62 53 6b 69 70 45 6d 70 74 79 2c 20 20  nt bSkipEmpty,  
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
148b0 2a 20 54 72 75 65 20 74 6f 20 69 67 6e 6f 72 65  * True to ignore
148c0 20 64 65 6c 65 74 65 2d 6b 65 79 73 20 2a 2f 0a   delete-keys */.
148d0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f 51    /* FTS5INDEX_Q
14900 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20 2a  UERY_XXX flags *
14910 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
14920 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
14930 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
14940 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f  eek to (or NULL/
14950 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  0) */.  int iLev
14960 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
14970 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
14980 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d 31 20   to iterate (-1 
14990 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e  for all) */.  in
149a0 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  t nSegment,     
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
149c0 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
149d0 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28 69 4c  nts to merge (iL
149e0 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46 74  evel>=0) */.  Ft
149f0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
14a00 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 2f 2a  *ppOut        /*
14a10 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29   New object */.)
14a20 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20  {.  int nSeg;   
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14a50 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 73 20 69   segment-iters i
14a60 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  n use */.  int n
14a70 53 6c 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Slot = 0;       
14a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14a90 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53  wer of two >= nS
14aa0 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65  eg */.  int iIte
14ab0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
14ac0 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20          /* */.  
14ad0 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20  int iSeg;       
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14af0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
14b00 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
14b10 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  nts */.  Fts5Str
14b20 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
14b30 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  l;.  Fts5MultiSe
14b40 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20  gIter *pNew;..  
14b50 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d  assert( (pTerm==
14b60 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c  0 && nTerm==0) |
14b70 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20  | iLevel<0 );.. 
14b80 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
14b90 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d  ce for the new m
14ba0 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f  ulti-seg-iterato
14bb0 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  r. */.  if( p->r
14bc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14bd0 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
14be0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14bf0 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
14c00 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
14c10 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
14c20 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
14c30 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74    nSeg = pStruct
14c40 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  ->nSegment;.    
14c50 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48    nSeg += (p->pH
14c60 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ash ? 1 : 0);.  
14c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
14c80 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63  Seg = MIN(pStruc
14c90 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
14ca0 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74  ].nSeg, nSegment
14cb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
14cc0 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c  (nSlot=2; nSlot<
14cd0 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f  nSeg; nSlot=nSlo
14ce0 74 2a 32 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  t*2);.  }..  *pp
14cf0 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
14d00 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20  5IdxMalloc(p, . 
14d10 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
14d20 4d 75 6c 74 69 53 65 67 49 74 65 72 29 20 2b 20  MultiSegIter) + 
14d30 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
14d40 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
14d50 28 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20  (Fts5SegIter) * 
14d60 6e 53 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a  nSlot +       /*
14d70 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f   pNew->aSeg[] */
14d80 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
14d90 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c  s5CResult) * nSl
14da0 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e  ot         /* pN
14db0 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a  ew->aFirst[] */.
14dc0 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d    );.  if( pNew=
14dd0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
14de0 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f  New->nSeg = nSlo
14df0 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67 20  t;.  pNew->aSeg 
14e00 3d 20 28 46 74 73 35 53 65 67 49 74 65 72 2a 29  = (Fts5SegIter*)
14e10 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77  &pNew[1];.  pNew
14e20 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35  ->aFirst = (Fts5
14e30 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e  CResult*)&pNew->
14e40 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 70  aSeg[nSlot];.  p
14e50 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d  New->bRev = (0!=
14e60 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
14e70 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b  EX_QUERY_DESC));
14e80 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  .  pNew->bSkipEm
14e90 70 74 79 20 3d 20 62 53 6b 69 70 45 6d 70 74 79  pty = bSkipEmpty
14ea0 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
14eb0 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  ze each of the c
14ec0 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74  omponent segment
14ed0 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20   iterators. */. 
14ee0 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
14ef0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
14f00 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20  reLevel *pEnd = 
14f10 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
14f20 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
14f30 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 48  ];.    if( p->pH
14f40 61 73 68 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ash ){.      /* 
14f50 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74  Add a segment it
14f60 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63  erator for the c
14f70 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
14f80 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  of the hash tabl
14f90 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  e. */.      Fts5
14fa0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
14fb0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
14fc0 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 66 74 73  er++];.      fts
14fd0 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69 74  5SegIterHashInit
14fe0 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  (p, pTerm, nTerm
14ff0 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72 29 3b  , flags, pIter);
15000 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
15010 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c  Lvl=&pStruct->aL
15020 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45  evel[0]; pLvl<pE
15030 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20  nd; pLvl++){.   
15040 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c     for(iSeg=pLvl
15050 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  ->nSeg-1; iSeg>=
15060 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
15070 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
15080 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
15090 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
150a0 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  g];.        Fts5
150b0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
150c0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
150d0 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 69  er++];.        i
150e0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
150f0 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
15100 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67  IterInit(p, pSeg
15110 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
15120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15130 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65     fts5SegIterSe
15140 65 6b 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c  ekInit(p, pTerm,
15150 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70   nTerm, flags, p
15160 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  Seg, pIter);.   
15170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15180 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
15190 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
151a0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
151b0 5d 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d  ];.    for(iSeg=
151c0 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b  nSeg-1; iSeg>=0;
151d0 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20   iSeg--){.      
151e0 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
151f0 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  p, &pLvl->aSeg[i
15200 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65  Seg], &pNew->aSe
15210 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20  g[iIter++]);.   
15220 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
15230 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a   iIter==nSeg );.
15240 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
15250 76 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ve was successfu
15260 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  l, each componen
15270 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20  t iterators now 
15280 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20  points .  ** to 
15290 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
152a0 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20  in its segment. 
152b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 69  In this case ini
152c0 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a  tialize the .  *
152d0 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  * aFirst[] array
152e0 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
152f0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
15300 66 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f  free the iterato
15310 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e  r.  ** object an
15320 64 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  d set the output
15330 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
15340 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  L.  */.  if( p->
15350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15360 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72 3d 6e  .    for(iIter=n
15370 53 6c 6f 74 2d 31 3b 20 69 49 74 65 72 3e 30 3b  Slot-1; iIter>0;
15380 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20   iIter--){.     
15390 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20 20   int iEq;.      
153a0 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d  if( (iEq = fts5M
153b0 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72  ultiIterDoCompar
153c0 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29 20  e(pNew, iIter)) 
153d0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
153e0 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70  egIterNext(p, &p
153f0 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d 2c 20  New->aSeg[iEq], 
15400 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  0);.        fts5
15410 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
15420 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20  d(p, pNew, iEq, 
15430 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  iIter);.      }.
15440 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 41 73      }.    fts5As
15450 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
15460 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  up(p, pNew);..  
15470 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
15480 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
15490 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
154a0 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20  , pNew) ){.     
154b0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
154c0 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
154d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
154e0 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  {.    fts5MultiI
154f0 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29  terFree(p, pNew)
15500 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30  ;.    *ppOut = 0
15510 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
15520 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
15530 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74  e iterator is at
15540 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72   EOF or if an er
15550 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
15560 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65  . .** False othe
15570 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
15580 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74   int fts5MultiIt
15590 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20  erEof(Fts5Index 
155a0 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
155b0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
155c0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c  return (p->rc ||
155d0 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
155e0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
155f0 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30  First ].pLeaf==0
15600 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
15610 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  rn the rowid of 
15620 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
15630 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
15640 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  ently points.** 
15650 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61  to. If the itera
15660 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
15670 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
15680 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
15690 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72  he.** results ar
156a0 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  e undefined..*/.
156b0 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d  static i64 fts5M
156c0 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74  ultiIterRowid(Ft
156d0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
156e0 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
156f0 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  ( pIter->aSeg[ p
15700 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15710 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 20 29  iFirst ].pLeaf )
15720 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ;.  return pIter
15730 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
15740 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
15750 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  ].iRowid;.}../*.
15760 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
15770 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
15780 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66 6f 6c   entry at or fol
15790 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a  lowing iMatch..*
157a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
157b0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46  s5MultiIterNextF
157c0 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
157d0 20 2a 70 2c 20 0a 20 20 46 74 73 35 4d 75 6c 74   *p, .  Fts5Mult
157e0 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
157f0 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29   .  i64 iMatch.)
15800 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  {.  while( 1 ){.
15810 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
15820 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
15830 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
15840 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20  1, iMatch);.    
15850 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
15860 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
15870 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77   break;.    iRow
15880 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
15890 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
158a0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
158b0 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev==0 && iRowid
158c0 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
158d0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
158e0 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77  >bRev!=0 && iRow
158f0 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
15900 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ak;.  }.}../*.**
15910 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
15920 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
15930 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
15940 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  m associated wit
15950 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20  h the .** entry 
15960 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
15970 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
15980 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ts to..*/.static
15990 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d   const u8 *fts5M
159a0 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73  ultiIterTerm(Fts
159b0 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
159c0 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a  Iter, int *pn){.
159d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
159e0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
159f0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15a00 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70  ].iFirst ];.  *p
15a10 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20  n = p->term.n;. 
15a20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e   return p->term.
15a30 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
15a40 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 63  rn true if the c
15a50 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20 70 61  hunk iterator pa
15a60 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
15a70 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a  nd argument is.*
15a80 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20  * at EOF. Or if 
15a90 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
15aa0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f  eady occurred. O
15ab0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
15ac0 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   false..*/.stati
15ad0 63 20 69 6e 74 20 66 74 73 35 43 68 75 6e 6b 49  c int fts5ChunkI
15ae0 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
15af0 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b 49 74   *p, Fts5ChunkIt
15b00 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
15b10 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
15b20 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 3b  Iter->pLeaf==0);
15b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
15b40 65 20 74 68 65 20 63 68 75 6e 6b 2d 69 74 65 72  e the chunk-iter
15b50 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
15b60 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61 20 74   chunk of data t
15b70 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69  o read..*/.stati
15b80 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
15b90 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
15ba0 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b  ex *p, Fts5Chunk
15bb0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
15bc0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 6e  assert( pIter->n
15bd0 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20 29 3b  Rem>=pIter->n );
15be0 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20 2d  .  pIter->nRem -
15bf0 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20 20 66 74  = pIter->n;.  ft
15c00 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
15c10 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
15c20 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
15c30 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 30 3b  .  pIter->p = 0;
15c40 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 52  .  if( pIter->nR
15c50 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  em>0 ){.    Fts5
15c60 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
15c70 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77   pIter->iLeafRow
15c80 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66 20  id++;.    pLeaf 
15c90 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d  = pIter->pLeaf =
15ca0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
15cb0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77   pIter->iLeafRow
15cc0 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  id);.    if( pLe
15cd0 61 66 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  af ){.      pIte
15ce0 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49 74 65 72  r->n = MIN(pIter
15cf0 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66 2d 3e 6e  ->nRem, pLeaf->n
15d00 2d 34 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  -4);.      pIter
15d10 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70 2b 34  ->p = pLeaf->p+4
15d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15d30 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a 65 20 74  *.** Intialize t
15d40 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f  he chunk iterato
15d50 72 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 6f  r to read the po
15d60 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61  sition list data
15d70 20 66 6f 72 20 77 68 69 63 68 20 0a 2a 2a 20 74   for which .** t
15d80 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 69 73  he size field is
15d90 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66 66 20   at offset iOff 
15da0 6f 66 20 6c 65 61 66 20 70 4c 65 61 66 2e 20 0a  of leaf pLeaf. .
15db0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15dc0 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74  ts5ChunkIterInit
15dd0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15df0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
15e00 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
15e10 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
15e20 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
15e30 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74 65 72 61  /* Segment itera
15e40 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73 6c  tor to read posl
15e50 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 74  ist from */.  Ft
15e60 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74  s5ChunkIter *pIt
15e70 65 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er            /*
15e80 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
15e90 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
15ea0 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
15eb0 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3b 0a 20  = pSeg->pLeaf;. 
15ec0 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67   int iOff = pSeg
15ed0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a  ->iLeafOffset;..
15ee0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
15ef0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
15f00 29 29 3b 0a 20 20 2f 2a 20 49 66 20 46 74 73 35  ));.  /* If Fts5
15f10 53 65 67 49 74 65 72 2e 70 53 65 67 20 69 73 20  SegIter.pSeg is 
15f20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
15f30 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65  iterator iterate
15f40 73 20 74 68 72 6f 75 67 68 20 64 61 74 61 0a 20  s through data. 
15f50 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 73 74   ** currently st
15f60 6f 72 65 64 20 69 6e 20 61 20 68 61 73 68 20 74  ored in a hash t
15f70 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  able. In this ca
15f80 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  se there is no l
15f90 65 61 66 2d 72 6f 77 69 64 0a 20 20 2a 2a 20 74  eaf-rowid.  ** t
15fa0 6f 20 63 61 6c 63 75 6c 61 74 65 2e 20 20 2a 2f  o calculate.  */
15fb0 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65  .  if( pSeg->pSe
15fc0 67 20 29 7b 0a 20 20 20 20 69 36 34 20 72 6f 77  g ){.    i64 row
15fd0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
15fe0 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 70 53  T_ROWID(pSeg->pS
15ff0 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  eg->iSegid, 0, p
16000 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b  Seg->iLeafPgno);
16010 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
16020 66 52 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a  fRowid = rowid;.
16030 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52    }..  fts5DataR
16040 65 66 65 72 65 6e 63 65 28 70 4c 65 61 66 29 3b  eference(pLeaf);
16050 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
16060 3d 20 70 4c 65 61 66 3b 0a 20 20 70 49 74 65 72  = pLeaf;.  pIter
16070 2d 3e 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e  ->nRem = pSeg->n
16080 50 6f 73 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20  Pos;.  pIter->n 
16090 3d 20 4d 49 4e 28 70 4c 65 61 66 2d 3e 6e 20 2d  = MIN(pLeaf->n -
160a0 20 69 4f 66 66 2c 20 70 49 74 65 72 2d 3e 6e 52   iOff, pIter->nR
160b0 65 6d 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20  em);.  pIter->p 
160c0 3d 20 70 4c 65 61 66 2d 3e 70 20 2b 20 69 4f 66  = pLeaf->p + iOf
160d0 66 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  f;.  if( pIter->
160e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
160f0 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c  ChunkIterNext(p,
16100 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a   pIter);.  }.}..
16110 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
16120 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65  ChunkIterRelease
16130 28 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a  (Fts5ChunkIter *
16140 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 44 61  pIter){.  fts5Da
16150 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
16160 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
16170 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a  ->pLeaf = 0;.}..
16180 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
16190 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
161a0 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
161b0 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 65 20  re pStruct. The 
161c0 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69  new segment.** i
161d0 64 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  d must be betwee
161e0 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e  n 1 and 65335 in
161f0 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73  clusive, and mus
16200 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79  t not be used by
16210 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74   .** any current
16220 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d  ly existing segm
16230 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65 20 73  ent. If a free s
16240 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74  egment id cannot
16250 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51   be found,.** SQ
16260 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74  LITE_FULL is ret
16270 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
16280 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
16290 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
162a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
162b0 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a  a no-op. 0 is .*
162c0 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  * returned in th
162d0 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
162e0 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63  ic int fts5Alloc
162f0 61 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64  ateSegid(Fts5Ind
16300 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
16310 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
16320 20 20 75 33 32 20 69 53 65 67 69 64 20 3d 20 30    u32 iSegid = 0
16330 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
16340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16350 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53   if( pStruct->nS
16360 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58  egment>=FTS5_MAX
16370 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20  _SEGMENT ){.    
16380 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16390 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _FULL;.    }else
163a0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
163b0 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
163c0 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
163d0 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
163e0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
163f0 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76 6f 69  izeof(u32), (voi
16400 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20 20 20  d*)&iSegid);.   
16410 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 28 69       iSegid = (i
16420 53 65 67 69 64 20 25 20 28 28 31 20 3c 3c 20 46  Segid % ((1 << F
16430 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d  TS5_DATA_ID_B) -
16440 20 32 29 29 20 2b 20 31 3b 0a 20 20 20 20 20 20   2)) + 1;.      
16450 20 20 61 73 73 65 72 74 28 20 69 53 65 67 69 64    assert( iSegid
16460 3e 30 20 26 26 20 69 53 65 67 69 64 3c 3d 36 35  >0 && iSegid<=65
16470 35 33 35 20 29 3b 0a 20 20 20 20 20 20 20 20 66  535 );.        f
16480 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
16490 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
164a0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
164b0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
164c0 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
164d0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
164e0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
164f0 20 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64        if( iSegid
16500 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ==pStruct->aLeve
16510 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
16520 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20  g].iSegid ){.   
16530 20 20 20 20 20 20 20 20 20 20 20 69 53 65 67 69             iSegi
16540 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
16550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
16560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16570 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16580 72 65 74 75 72 6e 20 28 69 6e 74 29 69 53 65 67  return (int)iSeg
16590 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  id;.}../*.** Dis
165a0 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75  card all data cu
165b0 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69  rrently cached i
165c0 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
165d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
165e0 64 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61  d fts5IndexDisca
165f0 72 64 44 61 74 61 28 46 74 73 35 49 6e 64 65 78  rdData(Fts5Index
16600 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
16610 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e  p->pHash || p->n
16620 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29  PendingData==0 )
16630 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68  ;.  if( p->pHash
16640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   ){.    sqlite3F
16650 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e  ts5HashClear(p->
16660 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e  pHash);.    p->n
16670 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b  PendingData = 0;
16680 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
16690 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
166a0 20 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20   the prefix, in 
166b0 62 79 74 65 73 2c 20 74 68 61 74 20 62 75 66 66  bytes, that buff
166c0 65 72 20 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73  er (nNew/pNew) s
166d0 68 61 72 65 73 0a 2a 2a 20 77 69 74 68 20 62 75  hares.** with bu
166e0 66 66 65 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29  ffer (nOld/pOld)
166f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16700 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
16710 73 73 28 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20  ss(.  int nOld, 
16720 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a  const u8 *pOld,.
16730 20 20 69 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73    int nNew, cons
16740 74 20 75 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20  t u8 *pNew.){.  
16750 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
16760 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65   fts5BlobCompare
16770 28 70 4f 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e 65  (pOld, nOld, pNe
16780 77 2c 20 6e 4e 65 77 29 3c 30 20 29 3b 0a 20 20  w, nNew)<0 );.  
16790 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
167a0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
167b0 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20  Old[i]!=pNew[i] 
167c0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
167d0 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74  eturn i;.}..stat
167e0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
167f0 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46  eDlidxClear(.  F
16800 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
16810 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
16820 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46  Writer,.  int bF
16830 6c 75 73 68 20 20 20 20 20 20 20 20 20 20 20 20  lush            
16840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16850 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64  true, write dlid
16860 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a  x to disk */.){.
16870 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
16880 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20  t( bFlush==0 || 
16890 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  (pWriter->nDlidx
168a0 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  >0 && pWriter->a
168b0 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
168c0 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
168d0 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
168e0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  x; i++){.    Fts
168f0 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
16900 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
16910 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20  >aDlidx[i];.    
16920 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  if( pDlidx->buf.
16930 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  n==0 ) break;.  
16940 20 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a    if( bFlush ){.
16950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
16960 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b  lidx->pgno!=0 );
16970 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
16980 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
16990 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
169a0 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
169b0 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e  gid, i, pDlidx->
169c0 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  pgno),.         
169d0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20   pDlidx->buf.p, 
169e0 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20  pDlidx->buf.n.  
169f0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
16a00 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
16a10 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e  erZero(&pDlidx->
16a20 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78  buf);.    pDlidx
16a30 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30  ->bPrevValid = 0
16a40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
16a50 72 6f 77 20 74 68 65 20 70 57 72 69 74 65 72 2d  row the pWriter-
16a60 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20  >aDlidx[] array 
16a70 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c  to at least nLvl
16a80 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a   elements in siz
16a90 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72  e..** Any new ar
16aa0 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  ray elements are
16ab0 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72   zeroed before r
16ac0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
16ad0 74 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74  tic int fts5Writ
16ae0 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74  eDlidxGrow(.  Ft
16af0 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
16b00 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
16b10 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c  iter,.  int nLvl
16b20 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
16b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c  =SQLITE_OK && nL
16b40 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c  vl>=pWriter->nDl
16b50 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
16b60 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69  lidxWriter *aDli
16b70 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57  dx = (Fts5DlidxW
16b80 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72  riter*)sqlite3_r
16b90 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
16ba0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c  pWriter->aDlidx,
16bb0 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
16bc0 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a  xWriter) * nLvl.
16bd0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61      );.    if( a
16be0 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Dlidx==0 ){.    
16bf0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16c00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
16c10 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  e{.      int nBy
16c20 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
16c30 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 28  DlidxWriter) * (
16c40 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e  nLvl - pWriter->
16c50 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d  nDlidx);.      m
16c60 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57  emset(&aDlidx[pW
16c70 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20  riter->nDlidx], 
16c80 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
16c90 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
16ca0 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20   = aDlidx;.     
16cb0 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
16cc0 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20   = nLvl;.    }. 
16cd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72   }.  return p->r
16ce0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  c;.}../*.** If a
16cf0 6e 20 22 6e 45 6d 70 74 79 22 20 72 65 63 6f 72  n "nEmpty" recor
16d00 64 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  d must be writte
16d10 6e 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  n to the b-tree 
16d20 62 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 0a  before the next.
16d30 2a 2a 20 74 65 72 6d 2c 20 77 72 69 74 65 20 69  ** term, write i
16d40 74 20 6e 6f 77 2e 20 0a 2a 2f 0a 73 74 61 74 69  t now. .*/.stati
16d50 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
16d60 42 74 72 65 65 4e 45 6d 70 74 79 28 46 74 73 35  BtreeNEmpty(Fts5
16d70 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
16d80 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
16d90 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ){.  if( pWriter
16da0 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20  ->nEmpty ){.    
16db0 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20  int bFlag = 0;. 
16dc0 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
16dd0 72 20 2a 70 50 67 3b 0a 20 20 20 20 70 50 67 20  r *pPg;.    pPg 
16de0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
16df0 74 65 72 5b 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20  ter[1];..    /* 
16e00 49 66 20 74 68 65 72 65 20 77 65 72 65 20 46 54  If there were FT
16e10 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
16e20 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20  E or more empty 
16e30 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74  leaf pages writt
16e40 65 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  en.    ** to the
16e50 20 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20   database, also 
16e60 77 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73  write the doclis
16e70 74 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e  t-index to disk.
16e80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72    */.    if( pWr
16e90 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
16ea0 62 75 66 2e 6e 3e 30 20 26 26 20 70 57 72 69 74  buf.n>0 && pWrit
16eb0 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35  er->nEmpty>=FTS5
16ec0 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
16ed0 29 7b 0a 20 20 20 20 20 20 62 46 6c 61 67 20 3d  ){.      bFlag =
16ee0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74   1;.    }.    ft
16ef0 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61  s5WriteDlidxClea
16f00 72 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46  r(p, pWriter, bF
16f10 6c 61 67 29 3b 0a 20 20 20 20 66 74 73 35 42 75  lag);.    fts5Bu
16f20 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
16f30 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62  (&p->rc, &pPg->b
16f40 75 66 2c 20 62 46 6c 61 67 29 3b 0a 20 20 20 20  uf, bFlag);.    
16f50 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
16f60 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
16f70 70 50 67 2d 3e 62 75 66 2c 20 70 57 72 69 74 65  pPg->buf, pWrite
16f80 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20  r->nEmpty);.    
16f90 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20  pWriter->nEmpty 
16fa0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
16fb0 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
16fc0 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65 72  Clear(p, pWriter
16fd0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  , 0);.  }..  ass
16fe0 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 6e 44  ert( pWriter->nD
16ff0 6c 69 64 78 3d 3d 30 20 7c 7c 20 70 57 72 69 74  lidx==0 || pWrit
17000 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
17010 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  f.n==0 );.  asse
17020 72 74 28 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c  rt( pWriter->nDl
17030 69 64 78 3d 3d 30 20 7c 7c 20 70 57 72 69 74 65  idx==0 || pWrite
17040 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 50 72  r->aDlidx[0].bPr
17050 65 76 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 7d 0a  evValid==0 );.}.
17060 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17070 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28  5WriteBtreeGrow(
17080 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
17090 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
170a0 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  iter){.  if( p->
170b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
170c0 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69  .    Fts5PageWri
170d0 74 65 72 20 2a 61 4e 65 77 3b 0a 20 20 20 20 46  ter *aNew;.    F
170e0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
170f0 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65  New;.    int nNe
17100 77 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 50  w = sizeof(Fts5P
17110 61 67 65 57 72 69 74 65 72 29 20 2a 20 28 70 57  ageWriter) * (pW
17120 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 2b 31  riter->nWriter+1
17130 29 3b 0a 0a 20 20 20 20 61 4e 65 77 20 3d 20 28  );..    aNew = (
17140 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29  Fts5PageWriter*)
17150 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
17160 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
17170 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , nNew);.    if(
17180 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
17190 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
171a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65  _NOMEM;.      re
171b0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
171c0 20 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 57   pNew = &aNew[pW
171d0 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 5d 3b  riter->nWriter];
171e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
171f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
17200 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20 20  PageWriter));.  
17210 20 20 70 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20 31    pNew->pgno = 1
17220 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
17230 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
17240 3e 72 63 2c 20 26 70 4e 65 77 2d 3e 62 75 66 2c  >rc, &pNew->buf,
17250 20 31 29 3b 0a 0a 20 20 20 20 70 57 72 69 74 65   1);..    pWrite
17260 72 2d 3e 6e 57 72 69 74 65 72 2b 2b 3b 0a 20 20  r->nWriter++;.  
17270 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74    pWriter->aWrit
17280 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d  er = aNew;.  }.}
17290 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
172a0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
172b0 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 65  each leaf page e
172c0 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74 20  xcept the first 
172d0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
172e0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65   at least one te
172f0 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e 54  rm. Argument (nT
17300 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74 68  erm/pTerm) is th
17310 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20  e split-key - a 
17320 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20  term that.** is 
17330 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
17340 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f  terms written to
17350 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73 2c   earlier leaves,
17360 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f 72   and equal to or
17370 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  .** smaller than
17380 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
17390 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66 2e  on the new leaf.
173a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
173b0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
173c0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
173d0 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
173e0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  . If an error.**
173f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
17400 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
17410 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17420 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
17430 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
17440 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
17450 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
17460 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
17470 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
17480 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
17490 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
174a0 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
174b0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
174c0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ject */.  int nT
174d0 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  erm, const u8 *p
174e0 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69 72  Term      /* Fir
174f0 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70  st term on new p
17500 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
17510 69 48 65 69 67 68 74 3b 0a 20 20 66 6f 72 28 69  iHeight;.  for(i
17520 48 65 69 67 68 74 3d 31 3b 20 31 3b 20 69 48 65  Height=1; 1; iHe
17530 69 67 68 74 2b 2b 29 7b 0a 20 20 20 20 46 74 73  ight++){.    Fts
17540 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
17550 67 65 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65  ge;..    if( iHe
17560 69 67 68 74 3e 3d 70 57 72 69 74 65 72 2d 3e 6e  ight>=pWriter->n
17570 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Writer ){.      
17580 66 74 73 35 57 72 69 74 65 42 74 72 65 65 47 72  fts5WriteBtreeGr
17590 6f 77 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ow(p, pWriter);.
175a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
175b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ) return;.    }.
175c0 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72      pPage = &pWr
175d0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 48  iter->aWriter[iH
175e0 65 69 67 68 74 5d 3b 0a 0a 20 20 20 20 66 74 73  eight];..    fts
175f0 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74  5WriteBtreeNEmpt
17600 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a  y(p, pWriter);..
17610 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62      if( pPage->b
17620 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  uf.n>=p->pConfig
17630 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  ->pgsz ){.      
17640 2f 2a 20 70 50 61 67 65 20 77 69 6c 6c 20 62 65  /* pPage will be
17650 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
17660 2e 20 54 68 65 20 74 65 72 6d 20 77 69 6c 6c 20  . The term will 
17670 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
17680 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  the.      ** par
17690 65 6e 74 20 6f 66 20 70 50 61 67 65 2e 20 20 2a  ent of pPage.  *
176a0 2f 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  /.      i64 iRow
176b0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
176c0 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  T_ROWID(pWriter-
176d0 3e 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74  >iSegid, iHeight
176e0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
176f0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
17700 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70  ite(p, iRowid, p
17710 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
17720 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20  ge->buf.n);.    
17730 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
17740 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20  (&pPage->buf);. 
17750 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
17760 65 72 6f 28 26 70 50 61 67 65 2d 3e 74 65 72 6d  ero(&pPage->term
17770 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
17780 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
17790 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
177a0 62 75 66 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70  buf, pPage[-1].p
177b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50 61 67  gno);.      pPag
177c0 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d  e->pgno++;.    }
177d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
177e0 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65 66 69  nPre = fts5Prefi
177f0 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
17800 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
17810 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
17820 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73  Term);.      fts
17830 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
17840 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
17850 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29  ge->buf, nPre+2)
17860 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
17870 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
17880 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
17890 75 66 2c 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b  uf, nTerm-nPre);
178a0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
178b0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
178c0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
178d0 20 6e 54 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65   nTerm-nPre, pTe
178e0 72 6d 2b 6e 50 72 65 29 3b 0a 20 20 20 20 20 20  rm+nPre);.      
178f0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
17900 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65  ->rc, &pPage->te
17910 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
17920 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17930 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
17940 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17950 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
17960 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20  flushing a leaf 
17970 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
17980 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61  ns no.** terms a
17990 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a  t all to disk..*
179a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
179b0 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
179c0 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rm(.  Fts5Index 
179d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
179e0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
179f0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
17a00 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
17a10 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20  *pWriter        
17a20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
17a30 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  ct */.){.  /* If
17a40 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72   there were no r
17a50 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61  owids on the lea
17a60 66 20 70 61 67 65 20 65 69 74 68 65 72 20 61 6e  f page either an
17a70 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  d the doclist-in
17a80 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72  dex.  ** has alr
17a90 65 61 64 79 20 62 65 65 6e 20 73 74 61 72 74 65  eady been starte
17aa0 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30  d, append an 0x0
17ab0 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a  0 byte to it.  *
17ac0 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
17ad0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
17ae0 67 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  ge && pWriter->a
17af0 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
17b00 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64   ){.    Fts5Dlid
17b10 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
17b20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
17b30 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  dx[0];.    asser
17b40 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76  t( pDlidx->bPrev
17b50 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c  Valid );.    sql
17b60 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
17b70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
17b80 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
17b90 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
17ba0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75  ncrement the "nu
17bb0 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69  mber of sequenti
17bc0 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75  al leaves withou
17bd0 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65  t a term" counte
17be0 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  r. */.  pWriter-
17bf0 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74  >nEmpty++;.}..st
17c00 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69  atic i64 fts5Dli
17c10 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
17c20 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a  wid(Fts5Buffer *
17c30 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f  pBuf){.  i64 iRo
17c40 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  wid;.  int iOff;
17c50 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 67  ..  iOff = 1 + g
17c60 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
17c70 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  p[1], (u64*)&iRo
17c80 77 69 64 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  wid);.  getVarin
17c90 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d  t(&pBuf->p[iOff]
17ca0 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29  , (u64*)&iRowid)
17cb0 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69  ;.  return iRowi
17cc0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69  d;.}../*.** Rowi
17cd0 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73  d iRowid has jus
17ce0 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20  t been appended 
17cf0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  to the current l
17d00 65 61 66 20 70 61 67 65 2e 20 49 74 20 69 73 20  eaf page. It is 
17d10 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20  the.** first on 
17d20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  the page. This f
17d30 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
17d40 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
17d50 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75 72 72  ntry to the curr
17d60 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69  ent.** doclist-i
17d70 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
17d80 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c  void fts5WriteDl
17d90 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73  idxAppend(.  Fts
17da0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
17db0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
17dc0 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f  iter, .  i64 iRo
17dd0 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  wid.){.  int i;.
17de0 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
17df0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e  ..  for(i=0; p->
17e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17e10 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b   bDone==0; i++){
17e20 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20  .    i64 iVal;. 
17e30 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
17e40 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57  er *pDlidx = &pW
17e50 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
17e60 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64  ;..    if( pDlid
17e70 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f  x->buf.n>=p->pCo
17e80 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
17e90 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
17ea0 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  nt doclist-index
17eb0 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57   page is full. W
17ec0 72 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20  rite it to disk 
17ed0 61 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a  and push.      *
17ee0 2a 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77  * a copy of iRow
17ef0 69 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  id (which will b
17f00 65 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20  ecome the first 
17f10 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78  rowid on the nex
17f20 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69  t.      ** docli
17f30 73 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st-index leaf pa
17f40 67 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20  ge) up into the 
17f50 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68  next level of th
17f60 65 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20  e b-tree .      
17f70 2a 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49 66  ** hierarchy. If
17f80 20 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20   the node being 
17f90 66 6c 75 73 68 65 64 20 69 73 20 63 75 72 72 65  flushed is curre
17fa0 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f  ntly the root no
17fb0 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73  de,.      ** als
17fc0 6f 20 70 75 73 68 20 69 74 73 20 66 69 72 73 74  o push its first
17fd0 20 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20   rowid upwards. 
17fe0 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  */.      pDlidx-
17ff0 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31  >buf.p[0] = 0x01
18000 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20  ;    /* Not the 
18010 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20  root node */.   
18020 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
18030 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
18040 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
18050 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
18060 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f   i, pDlidx->pgno
18070 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c  ),.          pDl
18080 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69  idx->buf.p, pDli
18090 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20  dx->buf.n.      
180a0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  );.      fts5Wri
180b0 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70  teDlidxGrow(p, p
180c0 57 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20  Writer, i+2);.  
180d0 20 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57      pDlidx = &pW
180e0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
180f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
18100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18110 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d  pDlidx[1].buf.n=
18120 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  =0 ){.        i6
18130 34 20 69 46 69 72 73 74 20 3d 20 66 74 73 35 44  4 iFirst = fts5D
18140 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74  lidxExtractFirst
18150 52 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62  Rowid(&pDlidx->b
18160 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  uf);..        /*
18170 20 54 68 69 73 20 77 61 73 20 74 68 65 20 72 6f   This was the ro
18180 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74  ot node. Push it
18190 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70  s first rowid up
181a0 20 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   to the new root
181b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c  . */.        pDl
181c0 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44  idx[1].pgno = pD
181d0 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  lidx->pgno;.    
181e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
181f0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
18200 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
18210 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20  x[1].buf, 0);.  
18220 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
18230 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
18240 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
18250 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69  idx[1].buf, pDli
18260 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  dx->pgno);.     
18270 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
18280 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
18290 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
182a0 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29  [1].buf, iFirst)
182b0 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  ;.        pDlidx
182c0 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d  [1].bPrevValid =
182d0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69   1;.        pDli
182e0 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46  dx[1].iPrev = iF
182f0 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  irst;.      }.. 
18300 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
18310 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69  BufferZero(&pDli
18320 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20  dx->buf);.      
18330 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
18340 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44  id = 0;.      pD
18350 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20  lidx->pgno++;.  
18360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
18370 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Done = 1;.    }.
18380 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
18390 3e 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20  >bPrevValid ){. 
183a0 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77       iVal = iRow
183b0 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72  id - pDlidx->iPr
183c0 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ev;.    }else{. 
183d0 20 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d       i64 iPgno =
183e0 20 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72   (i==0 ? pWriter
183f0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
18400 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70  o : pDlidx[-1].p
18410 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  gno);.      asse
18420 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  rt( pDlidx->buf.
18430 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  n==0 );.      sq
18440 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
18450 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
18460 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
18470 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20  , !bDone);.     
18480 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
18490 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
184a0 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
184b0 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20  buf, iPgno);.   
184c0 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
184d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
184e0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
184f0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
18500 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
18510 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69   iVal);.    pDli
18520 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
18530 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e   1;.    pDlidx->
18540 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a  iPrev = iRowid;.
18550 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
18560 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  id fts5WriteFlus
18570 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20  hLeaf(Fts5Index 
18580 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
18590 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73  r *pWriter){.  s
185a0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
185b0 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20  ero[] = { 0x00, 
185c0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
185d0 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72   };.  Fts5PageWr
185e0 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
185f0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
18600 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  0];.  i64 iRowid
18610 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ;..  if( pWriter
18620 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
18630 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  ge ){.    /* No 
18640 74 65 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e  term was written
18650 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a   to this page. *
18660 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d  /.    assert( 0=
18670 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61  =fts5GetU16(&pPa
18680 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b  ge->buf.p[2]) );
18690 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74  .    fts5WriteBt
186a0 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72  reeNoTerm(p, pWr
186b0 69 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iter);.  }..  /*
186c0 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
186d0 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  nt page to the d
186e0 62 2e 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d  b. */.  iRowid =
186f0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
18700 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
18710 67 69 64 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  gid, 0, pPage->p
18720 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61  gno);.  fts5Data
18730 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c  Write(p, iRowid,
18740 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70   pPage->buf.p, p
18750 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20  Page->buf.n);.. 
18760 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
18770 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f  he next page. */
18780 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
18790 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a  o(&pPage->buf);.
187a0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
187b0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
187c0 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a  pPage->buf, 4, z
187d0 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  ero);.  pPage->p
187e0 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63  gno++;..  /* Inc
187f0 72 65 61 73 65 20 74 68 65 20 6c 65 61 76 65 73  rease the leaves
18800 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72   written counter
18810 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e   */.  pWriter->n
18820 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a  LeafWritten++;..
18830 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61    /* The new lea
18840 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73  f holds no terms
18850 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20   or rowids */.  
18860 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
18870 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
18880 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
18890 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
188a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
188b0 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
188c0 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  m to the segment
188d0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62   being written b
188e0 79 20 74 68 65 20 77 72 69 74 65 72 20 70 61 73  y the writer pas
188f0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65  sed.** as the se
18900 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
18910 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
18920 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
18930 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
18940 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
18950 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
18960 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
18970 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
18980 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
18990 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
189a0 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20  teAppendTerm(.  
189b0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
189c0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
189d0 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e  pWriter,.  int n
189e0 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a  Term, const u8 *
189f0 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20  pTerm .){.  int 
18a00 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  nPrefix;        
18a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
18a20 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63  ytes of prefix c
18a30 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  ompression for t
18a40 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67  erm */.  Fts5Pag
18a50 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
18a60 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
18a70 65 72 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74  er[0];..  assert
18a80 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d  ( pPage->buf.n==
18a90 30 20 7c 7c 20 70 50 61 67 65 2d 3e 62 75 66 2e  0 || pPage->buf.
18aa0 6e 3e 34 20 29 3b 0a 20 20 69 66 28 20 70 50 61  n>4 );.  if( pPa
18ab0 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a  ge->buf.n==0 ){.
18ac0 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20      /* Zero the 
18ad0 66 69 72 73 74 20 74 65 72 6d 20 61 6e 64 20 66  first term and f
18ae0 69 72 73 74 20 64 6f 63 69 64 20 66 69 65 6c 64  irst docid field
18af0 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  s */.    static 
18b00 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20  const u8 zero[] 
18b10 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20  = { 0x00, 0x00, 
18b20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x00, 0x00 };.  
18b30 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
18b40 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
18b50 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a  pPage->buf, 4, z
18b60 65 72 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ero);.    assert
18b70 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
18b80 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 20  tTermInPage );. 
18b90 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29   }.  if( p->rc )
18ba0 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66   return;.  .  if
18bb0 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
18bc0 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
18bd0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
18be0 20 22 66 69 72 73 74 20 74 65 72 6d 22 20 66 69   "first term" fi
18bf0 65 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  eld of the page 
18c00 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 61  header. */.    a
18c10 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
18c20 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20 70 50 61  f.p[2]==0 && pPa
18c30 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d 3d 30 20  ge->buf.p[3]==0 
18c40 29 3b 0a 20 20 20 20 66 74 73 35 50 75 74 55 31  );.    fts5PutU1
18c50 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
18c60 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  2], pPage->buf.n
18c70 29 3b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  );.    nPrefix =
18c80 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
18c90 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20  e->pgno!=1 ){.  
18ca0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
18cb0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
18cc0 20 61 20 6c 65 61 66 20 74 68 61 74 20 69 73 20   a leaf that is 
18cd0 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74  not the leftmost
18ce0 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a   leaf in.      *
18cf0 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d  * the segment b-
18d00 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  tree. In this ca
18d10 73 65 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  se it is necessa
18d20 72 79 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d  ry to add a term
18d30 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
18d40 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
18d50 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6c 61  y that is (a) la
18d60 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
18d70 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20  rgest term .    
18d80 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69    ** already wri
18d90 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d  tten to the segm
18da0 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c  ent and (b) smal
18db0 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ler than or equa
18dc0 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  l to.      ** th
18dd0 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65  is term. In othe
18de0 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69  r words, a prefi
18df0 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  x of (pTerm/nTer
18e00 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20  m) that is one. 
18e10 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e       ** byte lon
18e20 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e  ger than the lon
18e30 67 65 73 74 20 70 72 65 66 69 78 20 28 70 54 65  gest prefix (pTe
18e40 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73  rm/nTerm) shares
18e50 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20   with the.      
18e60 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ** previous term
18e70 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
18e80 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68    ** Usually, th
18e90 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  e previous term 
18ea0 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
18eb0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65  pPage->term. The
18ec0 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
18ed0 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20 69   ** is if this i
18ee0 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
18ef0 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69   written in an i
18f00 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
18f10 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20   step..      ** 
18f20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
18f30 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69   previous term i
18f40 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
18f50 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61   so just write a
18f60 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
18f70 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  f (pTerm/nTerm) 
18f80 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
18f90 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c  node. This is sl
18fa0 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  ightly.      ** 
18fb0 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74  inefficient, but
18fc0 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20   still correct. 
18fd0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
18fe0 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  = nTerm;.      i
18ff0 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  f( pPage->term.n
19000 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   ){.        n = 
19010 31 20 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f  1 + fts5PrefixCo
19020 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
19030 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
19040 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
19050 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
19060 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
19070 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c  Term(p, pWriter,
19080 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20   n, pTerm);.    
19090 20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74    pPage = &pWrit
190a0 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a  er->aWriter[0];.
190b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
190c0 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73     nPrefix = fts
190d0 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
190e0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70  pPage->term.n, p
190f0 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54  Page->term.p, nT
19100 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
19110 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
19120 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
19130 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72  &pPage->buf, nPr
19140 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  efix);.  }..  /*
19150 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62   Append the numb
19160 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e  er of bytes of n
19170 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68  ew data, then th
19180 65 20 74 65 72 6d 20 64 61 74 61 20 69 74 73 65  e term data itse
19190 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70  lf.  ** to the p
191a0 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
191b0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
191c0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
191d0 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50  >buf, nTerm - nP
191e0 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75  refix);.  fts5Bu
191f0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
19200 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
19210 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65  uf, nTerm - nPre
19220 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65  fix, &pTerm[nPre
19230 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64  fix]);..  /* Upd
19240 61 74 65 20 74 68 65 20 46 74 73 35 50 61 67 65  ate the Fts5Page
19250 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c  Writer.term fiel
19260 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  d. */.  fts5Buff
19270 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
19280 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72  Page->term, nTer
19290 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72  m, pTerm);.  pWr
192a0 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
192b0 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70  InPage = 0;..  p
192c0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
192d0 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20  widInPage = 0;. 
192e0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
192f0 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d  RowidInDoclist =
19300 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   1;..  assert( p
19310 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72  ->rc || (pWriter
19320 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57  ->nDlidx>0 && pW
19330 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
19340 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20  .buf.n==0) );.  
19350 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
19360 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  0].pgno = pPage-
19370 3e 70 67 6e 6f 3b 0a 0a 20 20 2f 2a 20 49 66 20  >pgno;..  /* If 
19380 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
19390 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66   page is full, f
193a0 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e  lush it to disk.
193b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
193c0 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
193d0 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
193e0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
193f0 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
19400 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70    }.}../*.** App
19410 65 6e 64 20 61 20 64 6f 63 69 64 20 61 6e 64 20  end a docid and 
19420 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
19430 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  ze field to the 
19440 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
19450 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19460 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
19470 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
19480 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
19490 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
194a0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20  .  i64 iRowid,. 
194b0 20 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20 20 69   int nPos.){.  i
194c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
194d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50  _OK ){.    Fts5P
194e0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
194f0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
19500 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a  iter[0];..    /*
19510 20 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62   If this is to b
19520 65 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69  e the first doci
19530 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
19540 20 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a   page, set the .
19550 20 20 20 20 2a 2a 20 64 6f 63 69 64 2d 70 6f 69      ** docid-poi
19560 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
19570 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70  -header. Also ap
19580 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20  pend a value to 
19590 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a  the dlidx.    **
195a0 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65   buffer, in case
195b0 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
195c0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
195d0 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  /.    if( pWrite
195e0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
195f0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
19600 73 35 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e  s5PutU16(pPage->
19610 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75  buf.p, pPage->bu
19620 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35  f.n);.      fts5
19630 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
19640 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f  (p, pWriter, iRo
19650 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  wid);.    }..   
19660 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f   /* Write the do
19670 63 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  cid. */.    if( 
19680 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
19690 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c  owidInDoclist ||
196a0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
196b0 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
196c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
196d0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
196e0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
196f0 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65   iRowid);.    }e
19700 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
19710 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77  t( p->rc || iRow
19720 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72 65  id>pWriter->iPre
19730 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  vRowid );.      
19740 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
19750 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
19760 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77  pPage->buf, iRow
19770 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50  id - pWriter->iP
19780 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  revRowid);.    }
19790 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50  .    pWriter->iP
197a0 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  revRowid = iRowi
197b0 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  d;.    pWriter->
197c0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
197d0 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57  list = 0;.    pW
197e0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
197f0 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20  idInPage = 0;.. 
19800 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
19810 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
19820 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
19830 50 6f 73 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  Pos);..    if( p
19840 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e  Page->buf.n>=p->
19850 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
19860 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
19870 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
19880 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  iter);.    }.  }
19890 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63  .}..#if 0.static
198a0 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
198b0 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28  ppendPoslistInt(
198c0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
198d0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
198e0 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
198f0 74 20 69 56 61 6c 0a 29 7b 0a 20 20 69 66 28 20  t iVal.){.  if( 
19900 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19910 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65   ){.    Fts5Page
19920 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
19930 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
19940 72 5b 30 5d 3b 0a 20 20 20 20 66 74 73 35 42 75  r[0];.    fts5Bu
19950 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
19960 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
19970 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20  >buf, iVal);.   
19980 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
19990 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
199a0 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gsz ){.      fts
199b0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
199c0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
199d0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
199e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
199f0 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
19a00 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35 49  istData(.  Fts5I
19a10 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
19a20 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
19a30 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  er, .  const u8 
19a40 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e  *aData, .  int n
19a50 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50 61  Data.){.  Fts5Pa
19a60 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
19a70 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
19a80 74 65 72 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74 20  ter[0];.  const 
19a90 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20  u8 *a = aData;. 
19aa0 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a   int n = nData;.
19ab0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e    .  assert( p->
19ac0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20  pConfig->pgsz>0 
19ad0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
19ae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19af0 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20  (pPage->buf.n + 
19b00 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  n)>=p->pConfig->
19b10 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 6e 74 20  pgsz ){.    int 
19b20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nReq = p->pConfi
19b30 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d  g->pgsz - pPage-
19b40 3e 62 75 66 2e 6e 3b 0a 20 20 20 20 69 6e 74 20  >buf.n;.    int 
19b50 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77  nCopy = 0;.    w
19b60 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71  hile( nCopy<nReq
19b70 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75   ){.      i64 du
19b80 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79  mmy;.      nCopy
19b90 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61   += getVarint(&a
19ba0 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26  [nCopy], (u64*)&
19bb0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20  dummy);.    }.  
19bc0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
19bd0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
19be0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70  pPage->buf, nCop
19bf0 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20  y, a);.    a += 
19c00 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20  nCopy;.    n -= 
19c10 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57  nCopy;.    fts5W
19c20 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
19c30 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20   pWriter);.  }. 
19c40 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
19c50 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
19c60 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
19c70 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b  age->buf, n, a);
19c80 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
19c90 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
19ca0 65 6e 64 5a 65 72 6f 62 79 74 65 28 46 74 73 35  endZerobyte(Fts5
19cb0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
19cc0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
19cd0 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  ){.  fts5BufferA
19ce0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
19cf0 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 61 57  rc, &pWriter->aW
19d00 72 69 74 65 72 5b 30 5d 2e 62 75 66 2c 20 30 29  riter[0].buf, 0)
19d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
19d20 20 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64   any data cached
19d30 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f   by the writer o
19d40 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74  bject to the dat
19d50 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a  abase. Free any.
19d60 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ** allocations a
19d70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
19d80 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74  he writer..*/.st
19d90 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
19da0 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73  iteFinish(.  Fts
19db0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
19dc0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
19dd0 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  iter,         /*
19de0 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
19df0 2f 0a 20 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  /.  int *pnHeigh
19e00 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
19e10 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67      /* OUT: Heig
19e20 68 74 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ht of the b-tree
19e30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61   */.  int *pnLea
19e40 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
19e50 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
19e60 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
19e70 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a  es in b-tree */.
19e80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
19e90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19ea0 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61  OK ){.    Fts5Pa
19eb0 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20  geWriter *pLeaf 
19ec0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
19ed0 74 65 72 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ter[0];.    if( 
19ee0 70 4c 65 61 66 2d 3e 70 67 6e 6f 3d 3d 31 20 26  pLeaf->pgno==1 &
19ef0 26 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3d 3d  & pLeaf->buf.n==
19f00 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 4c 65  0 ){.      *pnLe
19f10 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70  af = 0;.      *p
19f20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  nHeight = 0;.   
19f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
19f40 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e 34  ( pLeaf->buf.n>4
19f50 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
19f60 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
19f70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
19f80 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 4c 65 61    }.      *pnLea
19f90 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d  f = pLeaf->pgno-
19fa0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 72  1;.      if( pWr
19fb0 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3d 3d 31  iter->nWriter==1
19fc0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d   && pWriter->nEm
19fd0 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c  pty>=FTS5_MIN_DL
19fe0 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  IDX_SIZE ){.    
19ff0 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
1a000 65 65 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  eeGrow(p, pWrite
1a010 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1a020 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
1a030 57 72 69 74 65 72 3e 31 20 29 7b 0a 20 20 20 20  Writer>1 ){.    
1a040 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
1a050 65 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72 69  eeNEmpty(p, pWri
1a060 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
1a070 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
1a080 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
1a090 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  ;..      for(i=1
1a0a0 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72  ; i<pWriter->nWr
1a0b0 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iter; i++){.    
1a0c0 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
1a0d0 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74  er *pPg = &pWrit
1a0e0 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a  er->aWriter[i];.
1a0f0 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
1a100 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20  Write(p, .      
1a110 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45        FTS5_SEGME
1a120 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
1a130 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 50 67  ->iSegid, i, pPg
1a140 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20 20 20 20 20  ->pgno), .      
1a150 20 20 20 20 20 20 70 50 67 2d 3e 62 75 66 2e 70        pPg->buf.p
1a160 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 0a 20 20 20  , pPg->buf.n.   
1a170 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
1a180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
1a190 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
1a1a0 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nWriter; i++){. 
1a1b0 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
1a1c0 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65  r *pPg = &pWrite
1a1d0 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20  r->aWriter[i];. 
1a1e0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
1a1f0 65 28 26 70 50 67 2d 3e 74 65 72 6d 29 3b 0a 20  e(&pPg->term);. 
1a200 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
1a210 65 28 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20 20  e(&pPg->buf);.  
1a220 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1a230 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  (pWriter->aWrite
1a240 72 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  r);..  for(i=0; 
1a250 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
1a260 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  x; i++){.    sql
1a270 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
1a280 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c  ee(&pWriter->aDl
1a290 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d  idx[i].buf);.  }
1a2a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1a2b0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29  pWriter->aDlidx)
1a2c0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1a2d0 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a   fts5WriteInit(.
1a2e0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1a2f0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1a300 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e   *pWriter, .  in
1a310 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 6d 65  t iSegid.){.  me
1a320 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c  mset(pWriter, 0,
1a330 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
1a340 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74  riter));.  pWrit
1a350 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  er->iSegid = iSe
1a360 67 69 64 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d  gid;..  pWriter-
1a370 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74 73 35  >aWriter = (Fts5
1a380 50 61 67 65 57 72 69 74 65 72 2a 29 66 74 73 35  PageWriter*)fts5
1a390 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
1a3a0 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
1a3b0 65 72 29 29 3b 0a 20 20 69 66 28 20 66 74 73 35  er));.  if( fts5
1a3c0 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70  WriteDlidxGrow(p
1a3d0 2c 20 70 57 72 69 74 65 72 2c 20 31 29 20 29 20  , pWriter, 1) ) 
1a3e0 72 65 74 75 72 6e 3b 0a 20 20 70 57 72 69 74 65  return;.  pWrite
1a3f0 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20 31 3b 0a  r->nWriter = 1;.
1a400 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64    pWriter->nDlid
1a410 78 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  x = 1;.  pWriter
1a420 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
1a430 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  o = 1;.  pWriter
1a440 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1a450 67 65 20 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69  ge = 1;.}..stati
1a460 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1a470 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28 0a 20  InitForAppend(. 
1a480 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1a4b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1a4c0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1a4d0 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
1a4e0 57 72 69 74 65 72 20 74 6f 20 69 6e 69 74 69 61  Writer to initia
1a4f0 6c 69 7a 65 20 2a 2f 0a 20 20 46 74 73 35 53 74  lize */.  Fts5St
1a500 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1a510 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
1a520 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f 20 61  ment object to a
1a530 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  ppend to */.){. 
1a540 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70 53 65   int nByte = pSe
1a550 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73 69 7a  g->nHeight * siz
1a560 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
1a570 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 57  er);.  memset(pW
1a580 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
1a590 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
1a5a0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65  ;.  pWriter->iSe
1a5b0 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67  gid = pSeg->iSeg
1a5c0 69 64 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61  id;.  pWriter->a
1a5d0 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 50 61  Writer = (Fts5Pa
1a5e0 67 65 57 72 69 74 65 72 2a 29 66 74 73 35 49 64  geWriter*)fts5Id
1a5f0 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65  xMalloc(p, nByte
1a600 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44  );.  pWriter->aD
1a610 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64  lidx = (Fts5Dlid
1a620 78 57 72 69 74 65 72 2a 29 66 74 73 35 49 64 78  xWriter*)fts5Idx
1a630 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
1a640 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
1a650 29 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  ));..  if( p->rc
1a660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a670 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 31 3b     int pgno = 1;
1a680 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1a690 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20  pWriter->nDlidx 
1a6a0 3d 20 31 3b 0a 20 20 20 20 70 57 72 69 74 65 72  = 1;.    pWriter
1a6b0 2d 3e 6e 57 72 69 74 65 72 20 3d 20 70 53 65 67  ->nWriter = pSeg
1a6c0 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 70  ->nHeight;.    p
1a6d0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
1a6e0 30 5d 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  0].pgno = pSeg->
1a6f0 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20  pgnoLast+1;.    
1a700 66 6f 72 28 69 3d 70 53 65 67 2d 3e 6e 48 65 69  for(i=pSeg->nHei
1a710 67 68 74 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  ght-1; i>0; i--)
1a720 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
1a730 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1a740 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  T_ROWID(pWriter-
1a750 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 67 6e 6f  >iSegid, i, pgno
1a760 29 3b 0a 20 20 20 20 20 20 46 74 73 35 50 61 67  );.      Fts5Pag
1a770 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26  eWriter *pPg = &
1a780 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
1a790 5b 69 5d 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  [i];.      pPg->
1a7a0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
1a7b0 20 20 20 66 74 73 35 44 61 74 61 42 75 66 66 65     fts5DataBuffe
1a7c0 72 28 70 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20  r(p, &pPg->buf, 
1a7d0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
1a7e0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a7f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 46  _OK ){.        F
1a800 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a  ts5NodeIter ss;.
1a810 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65          fts5Node
1a820 49 74 65 72 49 6e 69 74 28 70 50 67 2d 3e 62 75  IterInit(pPg->bu
1a830 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 2c  f.p, pPg->buf.n,
1a840 20 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20 77   &ss);.        w
1a850 68 69 6c 65 28 20 73 73 2e 61 44 61 74 61 20 29  hile( ss.aData )
1a860 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
1a870 74 28 26 70 2d 3e 72 63 2c 20 26 73 73 29 3b 0a  t(&p->rc, &ss);.
1a880 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a890 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1a8a0 50 67 2d 3e 74 65 72 6d 2c 20 73 73 2e 74 65 72  Pg->term, ss.ter
1a8b0 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 29 3b  m.n, ss.term.p);
1a8c0 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  .        pgno = 
1a8d0 73 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 20  ss.iChild;.     
1a8e0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46     fts5NodeIterF
1a8f0 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 20 20  ree(&ss);.      
1a900 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1a910 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3d 3d 31  pSeg->nHeight==1
1a920 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74 65   ){.      pWrite
1a930 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 53 65 67  r->nEmpty = pSeg
1a940 2d 3e 70 67 6e 6f 4c 61 73 74 2d 31 3b 0a 20 20  ->pgnoLast-1;.  
1a950 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1a960 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1a970 20 7c 7c 20 28 70 67 6e 6f 2b 70 57 72 69 74 65   || (pgno+pWrite
1a980 72 2d 3e 6e 45 6d 70 74 79 29 3d 3d 70 53 65 67  r->nEmpty)==pSeg
1a990 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20  ->pgnoLast );.  
1a9a0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1a9b0 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b  tTermInPage = 1;
1a9c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 72  .    assert( pWr
1a9d0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
1a9e0 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20  .term.n==0 );.  
1a9f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  }.}../*.** Itera
1aa00 74 6f 72 20 70 49 74 65 72 20 77 61 73 20 75 73  tor pIter was us
1aa10 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
1aa20 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74 20  rough the input 
1aa30 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61  segments of on a
1aa40 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n.** incremental
1aa50 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
1aa60 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1aa70 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  is called if the
1aa80 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20   incremental.** 
1aa90 6d 65 72 67 65 20 73 74 65 70 20 68 61 73 20 66  merge step has f
1aaa0 69 6e 69 73 68 65 64 20 62 75 74 20 74 68 65 20  inished but the 
1aab0 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62 65  input has not be
1aac0 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78  en completely ex
1aad0 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  hausted..*/.stat
1aae0 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69 6d  ic void fts5Trim
1aaf0 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e 64  Segments(Fts5Ind
1ab00 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69  ex *p, Fts5Multi
1ab10 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
1ab20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35  .  int i;.  Fts5
1ab30 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65  Buffer buf;.  me
1ab40 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
1ab50 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
1ab60 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1ab70 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b  pIter->nSeg; i++
1ab80 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
1ab90 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
1aba0 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20  r->aSeg[i];.    
1abb0 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d  if( pSeg->pSeg==
1abc0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  0 ){.      /* no
1abd0 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  -op */.    }else
1abe0 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
1abf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1ac00 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  All keys from th
1ac10 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  is input segment
1ac20 20 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e 73   have been trans
1ac30 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75 74  fered to the out
1ac40 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65  put..      ** Se
1ac50 74 20 62 6f 74 68 20 74 68 65 20 66 69 72 73 74  t both the first
1ac60 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d 6e   and last page-n
1ac70 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20 69  umbers to 0 to i
1ac80 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1ac90 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
1aca0 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20  t is now empty. 
1acb0 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  */.      pSeg->p
1acc0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20  Seg->pgnoLast = 
1acd0 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  0;.      pSeg->p
1ace0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
1acf0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ad00 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
1ad10 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  pSeg->iTermLeafO
1ad20 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66  ffset;     /* Of
1ad30 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72 73  fset on new firs
1ad40 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  t leaf page */. 
1ad50 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52 6f       i64 iLeafRo
1ad60 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35 44  wid;.      Fts5D
1ad70 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
1ad80 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67    int iId = pSeg
1ad90 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
1ada0 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34 5d        u8 aHdr[4]
1adb0 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20   = {0x00, 0x00, 
1adc0 30 78 30 30 2c 20 30 78 30 34 7d 3b 0a 0a 20 20  0x00, 0x04};..  
1add0 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20 3d      iLeafRowid =
1ade0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1adf0 57 49 44 28 69 49 64 2c 20 30 2c 20 70 53 65 67  WID(iId, 0, pSeg
1ae00 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
1ae10 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
1ae20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1ae30 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
1ae40 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
1ae50 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1ae60 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20  erZero(&buf);.  
1ae70 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ae80 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1ae90 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28  c, &buf, sizeof(
1aea0 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20  aHdr), aHdr);.  
1aeb0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1aec0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1aed0 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
1aee0 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
1aef0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1af00 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1af10 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  buf, pSeg->term.
1af20 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29  n, pSeg->term.p)
1af30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1af40 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1af50 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61  p->rc, &buf, pDa
1af60 74 61 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20 26 70  ta->n - iOff, &p
1af70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Data->p[iOff]);.
1af80 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
1af90 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
1afa0 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53          pSeg->pS
1afb0 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
1afc0 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50  pSeg->iTermLeafP
1afd0 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66 74 73  gno;.        fts
1afe0 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20 46  5DataDelete(p, F
1aff0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1b000 44 28 69 49 64 2c 20 30 2c 20 31 29 2c 69 4c 65  D(iId, 0, 1),iLe
1b010 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  afRowid);.      
1b020 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
1b030 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62  p, iLeafRowid, b
1b040 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20  uf.p, buf.n);.  
1b050 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b060 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1b070 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&buf);.}../*.**
1b080 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b090 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
1b0a0 76 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78  vel(.  Fts5Index
1b0b0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1b0c0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1b0d0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1b0e0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1b0f0 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20   **ppStruct,    
1b100 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74     /* IN/OUT: St
1b110 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
1b120 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20  */.  int iLvl,  
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b140 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
1b150 20 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   read input from
1b160 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d   */.  int *pnRem
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b180 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 75        /* Write u
1b190 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f  p to this many o
1b1a0 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a  utput leaves */.
1b1b0 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
1b1c0 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
1b1d0 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53  pStruct;.  Fts5S
1b1e0 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
1b1f0 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
1b200 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
1b210 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
1b220 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46  el *pLvlOut;.  F
1b230 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
1b240 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20 2f  *pIter = 0;    /
1b250 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65  * Iterator to re
1b260 61 64 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f  ad input data */
1b270 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e  .  int nRem = pn
1b280 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30  Rem ? *pnRem : 0
1b290 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61  ;  /* Output lea
1b2a0 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20  f pages left to 
1b2b0 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
1b2c0 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20 20  Input;          
1b2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b2e0 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65  mber of input se
1b2f0 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35  gments */.  Fts5
1b300 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
1b310 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;           /* W
1b320 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1b330 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
1b340 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
1b350 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d    /* Output segm
1b360 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ent */.  Fts5Buf
1b370 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20  fer term;.  int 
1b380 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54  bRequireDoclistT
1b390 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44  erm = 0;    /* D
1b3a0 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  oclist terminato
1b3b0 72 20 28 30 78 30 30 29 20 72 65 71 75 69 72 65  r (0x00) require
1b3c0 64 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65  d */.  int bOlde
1b3d0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1b3e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1b3f0 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  f the output seg
1b400 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65  ment is the olde
1b410 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
1b420 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1b430 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72  Level );.  asser
1b440 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c  t( pLvl->nMerge<
1b450 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a  =pLvl->nSeg );..
1b460 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72    memset(&writer
1b470 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1b480 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d  SegWriter));.  m
1b490 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
1b4a0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1b4b0 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d  r));.  if( pLvl-
1b4c0 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70  >nMerge ){.    p
1b4d0 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63  LvlOut = &pStruc
1b4e0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31  t->aLevel[iLvl+1
1b4f0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1b500 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29  LvlOut->nSeg>0 )
1b510 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70  ;.    nInput = p
1b520 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
1b530 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 46 6f   fts5WriteInitFo
1b540 72 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74  rAppend(p, &writ
1b550 65 72 2c 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  er, &pLvlOut->aS
1b560 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
1b570 2d 31 5d 29 3b 0a 20 20 20 20 70 53 65 67 20 3d  -1]);.    pSeg =
1b580 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
1b590 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d  pLvlOut->nSeg-1]
1b5a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1b5b0 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74 73 35  nt iSegid = fts5
1b5c0 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c  AllocateSegid(p,
1b5d0 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 20 20   pStruct);..    
1b5e0 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20 46 74  /* Extend the Ft
1b5f0 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
1b600 63 74 20 61 73 20 72 65 71 75 69 72 65 64 20 74  ct as required t
1b610 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f 75 74  o ensure the out
1b620 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  put.    ** segme
1b630 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  nt exists. */.  
1b640 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72    if( iLvl==pStr
1b650 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b  uct->nLevel-1 ){
1b660 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
1b670 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d  tureAddLevel(&p-
1b680 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29 3b 0a  >rc, ppStruct);.
1b690 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20        pStruct = 
1b6a0 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d  *ppStruct;.    }
1b6b0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1b6c0 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
1b6d0 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69  ->rc, pStruct, i
1b6e0 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20  Lvl+1, 1, 0);.  
1b6f0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
1b700 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d  turn;.    pLvl =
1b710 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1b720 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76  l[iLvl];.    pLv
1b730 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d  lOut = &pStruct-
1b740 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b  >aLevel[iLvl+1];
1b750 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ..    fts5WriteI
1b760 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
1b770 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a  iSegid);..    /*
1b780 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65 67   Add the new seg
1b790 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 70  ment to the outp
1b7a0 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
1b7b0 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d  pSeg = &pLvlOut-
1b7c0 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
1b7d0 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75  Seg];.    pLvlOu
1b7e0 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70  t->nSeg++;.    p
1b7f0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
1b800 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69 53   1;.    pSeg->iS
1b810 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
1b820 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1b830 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  ment++;..    /* 
1b840 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  Read input from 
1b850 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
1b860 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20  the input level 
1b870 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20  */.    nInput = 
1b880 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a  pLvl->nSeg;.  }.
1b890 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76    bOldest = (pLv
1b8a0 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26  lOut->nSeg==1 &&
1b8b0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1b8c0 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 23 69 66 20  ==iLvl+2);..#if 
1b8d0 30 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74  0.fprintf(stdout
1b8e0 2c 20 22 6d 65 72 67 69 6e 67 20 25 64 20 73 65  , "merging %d se
1b8f0 67 6d 65 6e 74 73 20 66 72 6f 6d 20 6c 65 76 65  gments from leve
1b900 6c 20 25 64 21 22 2c 20 6e 49 6e 70 75 74 2c 20  l %d!", nInput, 
1b910 69 4c 76 6c 29 3b 0a 66 66 6c 75 73 68 28 73 74  iLvl);.fflush(st
1b920 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  dout);.#endif.. 
1b930 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30   assert( iLvl>=0
1b940 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   );.  for(fts5Mu
1b950 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
1b960 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c 20  truct, 0, 0, 0, 
1b970 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c  0, iLvl, nInput,
1b980 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20   &pIter);.      
1b990 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1b9a0 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20  (p, pIter)==0;. 
1b9b0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1b9c0 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
1b9d0 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20   0, 0).  ){.    
1b9e0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
1b9f0 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
1ba00 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
1ba10 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
1ba20 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 73   Fts5ChunkIter s
1ba30 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Pos;           /
1ba40 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
1ba50 65 20 74 68 72 6f 75 67 68 20 70 6f 73 69 74 69  e through positi
1ba60 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  on list */.    i
1ba70 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba90 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
1baa0 7a 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20 2a  ze field value *
1bab0 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b  /.    int nTerm;
1bac0 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
1bad0 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  Term;..    /* Ch
1bae0 65 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69  eck for key anni
1baf0 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  hilation. */.   
1bb00 20 69 66 28 20 70 53 65 67 2d 3e 6e 50 6f 73 3d   if( pSeg->nPos=
1bb10 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c  =0 && (bOldest |
1bb20 7c 20 70 53 65 67 2d 3e 62 44 65 6c 3d 3d 30 29  | pSeg->bDel==0)
1bb30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
1bb40 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49    fts5ChunkIterI
1bb50 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26 73 50  nit(p, pSeg, &sP
1bb60 6f 73 29 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20  os);..    pTerm 
1bb70 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
1bb80 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72  erm(pIter, &nTer
1bb90 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72  m);.    if( nTer
1bba0 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d  m!=term.n || mem
1bbb0 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e  cmp(pTerm, term.
1bbc0 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20  p, nTerm) ){.   
1bbd0 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26 26 20     if( pnRem && 
1bbe0 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74  writer.nLeafWrit
1bbf0 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20  ten>nRem ){.    
1bc00 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
1bc10 72 52 65 6c 65 61 73 65 28 26 73 50 6f 73 29 3b  rRelease(&sPos);
1bc20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1bc30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1bc40 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65 77 20  * This is a new 
1bc50 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61 20 74  term. Append a t
1bc60 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74 70 75  erm to the outpu
1bc70 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  t segment. */.  
1bc80 20 20 20 20 69 66 28 20 62 52 65 71 75 69 72 65      if( bRequire
1bc90 44 6f 63 6c 69 73 74 54 65 72 6d 20 29 7b 0a 20  DoclistTerm ){. 
1bca0 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1bcb0 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 70  AppendZerobyte(p
1bcc0 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20  , &writer);.    
1bcd0 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72    }.      fts5Wr
1bce0 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
1bcf0 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c   &writer, nTerm,
1bd00 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66   pTerm);.      f
1bd10 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
1bd20 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72  >rc, &term, nTer
1bd30 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
1bd40 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74   bRequireDoclist
1bd50 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Term = 1;.    }.
1bd60 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
1bd70 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20  he rowid to the 
1bd80 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a  output */.    /*
1bd90 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a   WRITEPOSLISTSIZ
1bda0 45 20 2a 2f 0a 20 20 20 20 6e 50 6f 73 20 3d 20  E */.    nPos = 
1bdb0 70 53 65 67 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70  pSeg->nPos*2 + p
1bdc0 53 65 67 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 66  Seg->bDel;.    f
1bdd0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f  ts5WriteAppendRo
1bde0 77 69 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  wid(p, &writer, 
1bdf0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1be00 69 64 28 70 49 74 65 72 29 2c 20 6e 50 6f 73 29  id(pIter), nPos)
1be10 3b 0a 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f  ;..    for(/* no
1be20 6f 70 20 2a 2f 3b 20 21 66 74 73 35 43 68 75 6e  op */; !fts5Chun
1be30 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f  kIterEof(p, &sPo
1be40 73 29 3b 20 66 74 73 35 43 68 75 6e 6b 49 74 65  s); fts5ChunkIte
1be50 72 4e 65 78 74 28 70 2c 20 26 73 50 6f 73 29 29  rNext(p, &sPos))
1be60 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  {.      fts5Writ
1be70 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
1be80 74 61 28 70 2c 20 26 77 72 69 74 65 72 2c 20 73  ta(p, &writer, s
1be90 50 6f 73 2e 70 2c 20 73 50 6f 73 2e 6e 29 3b 0a  Pos.p, sPos.n);.
1bea0 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 43      }..    fts5C
1beb0 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28  hunkIterRelease(
1bec0 26 73 50 6f 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  &sPos);.  }..  /
1bed0 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74  * Flush the last
1bee0 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64 69   leaf page to di
1bef0 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70  sk. Set the outp
1bf00 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ut segment b-tre
1bf10 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e  e height.  ** an
1bf20 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65  d last leaf page
1bf30 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20 73   number at the s
1bf40 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20  ame time.  */.  
1bf50 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
1bf60 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53 65  p, &writer, &pSe
1bf70 67 2d 3e 6e 48 65 69 67 68 74 2c 20 26 70 53 65  g->nHeight, &pSe
1bf80 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20  g->pgnoLast);.. 
1bf90 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74   if( fts5MultiIt
1bfa0 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20  erEof(p, pIter) 
1bfb0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ){.    int i;.. 
1bfc0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
1bfd0 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65   redundant segme
1bfe0 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  nts from the %_d
1bff0 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ata table */.   
1c000 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70   for(i=0; i<nInp
1c010 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ut; i++){.      
1c020 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
1c030 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e 61  gment(p, pLvl->a
1c040 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a  Seg[i].iSegid);.
1c050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1c060 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
1c070 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nt segments from
1c080 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
1c090 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c   */.    if( pLvl
1c0a0 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29  ->nSeg!=nInput )
1c0b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76  {.      int nMov
1c0c0 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20  e = (pLvl->nSeg 
1c0d0 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65  - nInput) * size
1c0e0 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
1c0f0 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Segment);.      
1c100 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53  memmove(pLvl->aS
1c110 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  eg, &pLvl->aSeg[
1c120 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b  nInput], nMove);
1c130 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 75  .    }.    pStru
1c140 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20  ct->nSegment -= 
1c150 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c  nInput;.    pLvl
1c160 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74  ->nSeg -= nInput
1c170 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72  ;.    pLvl->nMer
1c180 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ge = 0;.    if( 
1c190 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d  pSeg->pgnoLast==
1c1a0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f  0 ){.      pLvlO
1c1b0 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20  ut->nSeg--;.    
1c1c0 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d    pStruct->nSegm
1c1d0 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ent--;.    }.  }
1c1e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1c1f0 28 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3e  ( pSeg->nHeight>
1c200 30 20 26 26 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  0 && pSeg->pgnoL
1c210 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73  ast>0 );.    fts
1c220 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c  5TrimSegments(p,
1c230 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76   pIter);.    pLv
1c240 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70  l->nMerge = nInp
1c250 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d  ut;.  }..  fts5M
1c260 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
1c270 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75  pIter);.  fts5Bu
1c280 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
1c290 0a 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a  .  if( pnRem ) *
1c2a0 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e  pnRem -= writer.
1c2b0 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a  nLeafWritten;.}.
1c2c0 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20  ./*.** Do up to 
1c2d0 6e 50 67 20 70 61 67 65 73 20 6f 66 20 61 75 74  nPg pages of aut
1c2e0 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74  omerge work on t
1c2f0 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  he index..*/.sta
1c300 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
1c310 65 78 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49  exMerge(.  Fts5I
1c320 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1c330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1c340 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1c350 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
1c360 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c  ture **ppStruct,
1c370 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
1c380 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74  : Current struct
1c390 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
1c3a0 20 20 69 6e 74 20 6e 50 67 20 20 20 20 20 20 20    int nPg       
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 20 20 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f    /* Pages of wo
1c3d0 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20  rk to do */.){. 
1c3e0 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b   int nRem = nPg;
1c3f0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1c400 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
1c410 74 72 75 63 74 3b 0a 20 20 77 68 69 6c 65 28 20  truct;.  while( 
1c420 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d  nRem>0 && p->rc=
1c430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c440 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20    int iLvl;     
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c460 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   To iterate thro
1c470 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
1c480 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d    int iBestLvl =
1c490 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1c4a0 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20   Level offering 
1c4b0 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73  the most input s
1c4c0 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69  egments */.    i
1c4d0 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20  nt nBest = 0;   
1c4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c4f0 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65  mber of input se
1c500 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c  gments on best l
1c510 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  evel */..    /* 
1c520 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20  Set iBestLvl to 
1c530 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61  the level to rea
1c540 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  d input segments
1c550 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73   from. */.    as
1c560 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
1c570 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66  Level>0 );.    f
1c580 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
1c590 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
1c5a0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
1c5b0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
1c5c0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
1c5d0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1c5e0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  ];.      if( pLv
1c5f0 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20  l->nMerge ){.   
1c600 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
1c610 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20  Merge>nBest ){. 
1c620 20 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76           iBestLv
1c630 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20  l = iLvl;.      
1c640 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c      nBest = pLvl
1c650 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20  ->nMerge;.      
1c660 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
1c670 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c680 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e   if( pLvl->nSeg>
1c690 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  nBest ){.       
1c6a0 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e   nBest = pLvl->n
1c6b0 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65  Seg;.        iBe
1c6c0 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20  stLvl = iLvl;.  
1c6d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1c6e0 20 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20   /* If nBest is 
1c6f0 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68  still 0, then th
1c700 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
1c710 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66  empty. */.#ifdef
1c720 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c730 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42    for(iLvl=0; nB
1c740 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70  est==0 && iLvl<p
1c750 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1c760 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61  iLvl++){.      a
1c770 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
1c780 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
1c790 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65  g==0 );.    }.#e
1c7a0 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42  ndif..    if( nB
1c7b0 65 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  est<p->pConfig->
1c7c0 6e 41 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20  nAutomerge .    
1c7d0 20 20 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e      && pStruct->
1c7e0 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d  aLevel[iBestLvl]
1c7f0 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20 20  .nMerge==0 .    
1c800 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
1c810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
1c820 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1c830 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42 65  p, &pStruct, iBe
1c840 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20  stLvl, &nRem);. 
1c850 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1c860 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75  LITE_OK && pStru
1c870 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74  ct->aLevel[iBest
1c880 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29  Lvl].nMerge==0 )
1c890 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
1c8a0 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20  cturePromote(p, 
1c8b0 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72  iBestLvl+1, pStr
1c8c0 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  uct);.    }.  }.
1c8d0 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
1c8e0 74 72 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  truct;.}../*.** 
1c8f0 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66  A total of nLeaf
1c900 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 64   leaf pages of d
1c910 61 74 61 20 68 61 73 20 6a 75 73 74 20 62 65 65  ata has just bee
1c920 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c  n flushed to a l
1c930 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e  evel-0.** segmen
1c940 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
1c950 20 75 70 64 61 74 65 73 20 74 68 65 20 77 72 69   updates the wri
1c960 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72  te-counter accor
1c970 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a  dingly and, if.*
1c980 2a 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72  * necessary, per
1c990 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61  forms incrementa
1c9a0 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a  l merge work..**
1c9b0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1c9c0 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
1c9d0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
1c9e0 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
1c9f0 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
1ca00 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
1ca10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ca20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1ca30 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1ca40 78 41 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74  xAutomerge(.  Ft
1ca50 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca70 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
1ca80 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1ca90 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
1caa0 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct,       /* IN/
1cab0 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
1cac0 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
1cad0 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20  */.  int nLeaf  
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1cb00 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20  f output leaves 
1cb10 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
1cb20 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
1cb30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1cb40 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65  pConfig->nAutome
1cb50 72 67 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73  rge>0 ){.    Fts
1cb60 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1cb70 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
1cb80 0a 20 20 20 20 69 36 34 20 6e 57 72 69 74 65 3b  .    i64 nWrite;
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
1cbb0 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75  lue of write-cou
1cbc0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
1cbd0 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20  nWork;          
1cbe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1cbf0 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e  ber of work-quan
1cc00 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f  ta to perform */
1cc10 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20  .    int nRem;  
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1cc40 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20  leaf pages left 
1cc50 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20  to write */..   
1cc60 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 77   /* Update the w
1cc70 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68  rite-counter. Wh
1cc80 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65  ile doing so, se
1cc90 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20  t nWork. */.    
1cca0 6e 57 72 69 74 65 20 3d 20 70 53 74 72 75 63 74  nWrite = pStruct
1ccb0 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  ->nWriteCounter;
1ccc0 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28 28 6e  .    nWork = ((n
1ccd0 57 72 69 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f  Write + nLeaf) /
1cce0 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d   p->nWorkUnit) -
1ccf0 20 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57   (nWrite / p->nW
1cd00 6f 72 6b 55 6e 69 74 29 3b 0a 20 20 20 20 70 53  orkUnit);.    pS
1cd10 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75  truct->nWriteCou
1cd20 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20  nter += nLeaf;. 
1cd30 20 20 20 6e 52 65 6d 20 3d 20 70 2d 3e 6e 57 6f     nRem = p->nWo
1cd40 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a  rkUnit * nWork *
1cd50 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1cd60 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ;..    fts5Index
1cd70 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75 63  Merge(p, ppStruc
1cd80 74 2c 20 6e 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a  t, nRem);.  }.}.
1cd90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1cda0 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67  5IndexCrisismerg
1cdb0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
1cdc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1cdd0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1cde0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1cdf0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1ce00 2a 70 70 53 74 72 75 63 74 20 20 20 20 20 20 20  *ppStruct       
1ce10 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
1ce20 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66  ent structure of
1ce30 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63   index */.){.  c
1ce40 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73 69 73  onst int nCrisis
1ce50 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   = p->pConfig->n
1ce60 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20 20 46  CrisisMerge;.  F
1ce70 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1ce80 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1ce90 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20  t;.  int iLvl = 
1cea0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
1ceb0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
1cec0 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  | pStruct->nLeve
1ced0 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
1cee0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1cef0 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
1cf00 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d  vel[iLvl].nSeg>=
1cf10 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20 20 66  nCrisis ){.    f
1cf20 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
1cf30 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  el(p, &pStruct, 
1cf40 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20 66 74  iLvl, 0);.    ft
1cf50 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
1cf60 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53  te(p, iLvl+1, pS
1cf70 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c  truct);.    iLvl
1cf80 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72  ++;.  }.  *ppStr
1cf90 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d  uct = pStruct;.}
1cfa0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
1cfb0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73  5IndexReturn(Fts
1cfc0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
1cfd0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
1cfe0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
1cff0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  K;.  return rc;.
1d000 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
1d010 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 46  t Fts5FlushCtx F
1d020 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72  ts5FlushCtx;.str
1d030 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
1d040 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a   {.  Fts5Index *
1d050 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57  pIdx;.  Fts5SegW
1d060 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d  riter writer; .}
1d070 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20  ;../*.** Buffer 
1d080 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  aBuf[] contains 
1d090 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74  a list of varint
1d0a0 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f  s, all small eno
1d0b0 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e  ugh to fit.** in
1d0c0 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
1d0d0 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  r. Return the si
1d0e0 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ze of the larges
1d0f0 74 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73  t prefix of this
1d100 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62   .** list nMax b
1d110 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20  ytes or less in 
1d120 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
1d130 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50  int fts5PoslistP
1d140 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a  refix(const u8 *
1d150 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b  aBuf, int nMax){
1d160 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33  .  int ret;.  u3
1d170 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d  2 dummy;.  ret =
1d180 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
1d190 28 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20  (aBuf, dummy);. 
1d1a0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1d1b0 20 69 6e 74 20 69 20 3d 20 66 74 73 35 47 65 74   int i = fts5Get
1d1c0 56 61 72 69 6e 74 33 32 28 26 61 42 75 66 5b 72  Varint32(&aBuf[r
1d1d0 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  et], dummy);.   
1d1e0 20 69 66 28 20 28 72 65 74 20 2b 20 69 29 20 3e   if( (ret + i) >
1d1f0 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a 20   nMax ) break;. 
1d200 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20 7d     ret += i;.  }
1d210 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
1d220 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ..#define fts5Bu
1d230 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1d240 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20  ob(pBuf, pBlob, 
1d250 6e 42 6c 6f 62 29 20 7b 20 5c 0a 20 20 61 73 73  nBlob) { \.  ass
1d260 65 72 74 28 20 70 42 75 66 2d 3e 6e 53 70 61 63  ert( pBuf->nSpac
1d270 65 3e 3d 28 70 42 75 66 2d 3e 6e 2b 6e 42 6c 6f  e>=(pBuf->n+nBlo
1d280 62 29 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  b) );           
1d290 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26 70 42    \.  memcpy(&pB
1d2a0 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
1d2b0 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20 20  pBlob, nBlob);  
1d2c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 70             \.  p
1d2d0 42 75 66 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b  Buf->n += nBlob;
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d300 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46      \.}../*.** F
1d310 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  lush the content
1d320 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68  s of in-memory h
1d330 61 73 68 20 74 61 62 6c 65 20 69 48 61 73 68 20  ash table iHash 
1d340 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30  to a new level-0
1d350 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20   .** segment on 
1d360 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74  disk. Also updat
1d370 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  e the correspond
1d380 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65  ing structure re
1d390 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
1d3a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1d3b0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
1d3c0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
1d3d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
1d3e0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
1d3f0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
1d400 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1d410 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d420 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
1d430 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1d440 20 20 46 74 73 35 48 61 73 68 20 2a 70 48 61 73    Fts5Hash *pHas
1d450 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20  h = p->pHash;.  
1d460 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1d470 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53  Struct;.  int iS
1d480 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f  egid;.  int pgno
1d490 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Last = 0;       
1d4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
1d4b0 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
1d4c0 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f  er in segment */
1d4d0 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20  ..  /* Obtain a 
1d4e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1d4f0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
1d500 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
1d510 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20  new segment-id. 
1d520 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
1d530 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e  level-0 segment.
1d540 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d    */.  pStruct =
1d550 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1d560 61 64 28 70 29 3b 0a 20 20 69 53 65 67 69 64 20  ad(p);.  iSegid 
1d570 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  = fts5AllocateSe
1d580 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b  gid(p, pStruct);
1d590 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 20 29  ..  if( iSegid )
1d5a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
1d5b0 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  pgsz = p->pConfi
1d5c0 67 2d 3e 70 67 73 7a 3b 0a 0a 20 20 20 20 46 74  g->pgsz;..    Ft
1d5d0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1d5e0 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e  nt *pSeg;   /* N
1d5f0 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69  ew segment withi
1d600 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20  n pStruct */.   
1d610 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20   int nHeight;   
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d630 2a 20 48 65 69 67 68 74 20 6f 66 20 6e 65 77 20  * Height of new 
1d640 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a  segment b-tree *
1d650 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
1d660 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20   *pBuf;         
1d670 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
1d680 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
1d690 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  le leaf page */.
1d6a0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50      const u8 *zP
1d6b0 72 65 76 20 3d 20 30 3b 0a 0a 20 20 20 20 46 74  rev = 0;..    Ft
1d6c0 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
1d6d0 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  er;.    fts5Writ
1d6e0 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
1d6f0 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
1d700 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 20  /* Pre-allocate 
1d710 74 68 65 20 62 75 66 66 65 72 20 75 73 65 64 20  the buffer used 
1d720 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66  to assemble leaf
1d730 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 74 61   pages to the ta
1d740 72 67 65 74 0a 20 20 20 20 2a 2a 20 70 61 67 65  rget.    ** page
1d750 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61   size.  */.    a
1d760 73 73 65 72 74 28 20 70 67 73 7a 3e 30 20 29 3b  ssert( pgsz>0 );
1d770 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69  .    pBuf = &wri
1d780 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e 62  ter.aWriter[0].b
1d790 75 66 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  uf;.    fts5Buff
1d7a0 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70  erGrow(&p->rc, p
1d7b0 42 75 66 2c 20 70 67 73 7a 20 2b 20 32 30 29 3b  Buf, pgsz + 20);
1d7c0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 73  ..    /* Begin s
1d7d0 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
1d7e0 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69  hash table entri
1d7f0 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72 75  es. This loop ru
1d800 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
1d810 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64 6f 63  .    ** term/doc
1d820 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20 73  list currently s
1d830 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  tored within the
1d840 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   hash table. */.
1d850 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1d860 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d870 20 20 6d 65 6d 73 65 74 28 70 42 75 66 2d 3e 70    memset(pBuf->p
1d880 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 20 20 70  , 0, 4);.      p
1d890 42 75 66 2d 3e 6e 20 3d 20 34 3b 0a 20 20 20 20  Buf->n = 4;.    
1d8a0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1d8b0 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
1d8c0 74 28 70 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a  t(pHash, 0, 0);.
1d8d0 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
1d8e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d8f0 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46  K && 0==sqlite3F
1d900 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70  ts5HashScanEof(p
1d910 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63  Hash) ){.      c
1d920 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
1d930 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75  ;          /* Bu
1d940 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1d950 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  term */.      in
1d960 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
1d970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1d980 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79  e of zTerm in by
1d990 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  tes */.      con
1d9a0 73 74 20 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b  st u8 *pDoclist;
1d9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1d9c0 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 66  ter to doclist f
1d9d0 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  or this term */.
1d9e0 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69        int nDocli
1d9f0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1da00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63    /* Size of doc
1da10 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
1da20 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 75 66 66  .      int nSuff
1da30 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
1da40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
1da50 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20  rm suffix */..  
1da60 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
1da70 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61  ashScanEntry(pHa
1da80 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f  sh, &zTerm, &pDo
1da90 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74  clist, &nDoclist
1daa0 29 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 3d  );.      nTerm =
1dab0 20 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 3b 0a   strlen(zTerm);.
1dac0 0a 20 20 20 20 20 20 2f 2a 20 44 65 63 69 64 65  .      /* Decide
1dad0 20 69 66 20 74 68 65 20 74 65 72 6d 20 77 69 6c   if the term wil
1dae0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72  l fit on the cur
1daf0 72 65 6e 74 20 6c 65 61 66 2e 20 49 66 20 69 74  rent leaf. If it
1db00 20 77 69 6c 6c 20 6e 6f 74 2c 20 0a 20 20 20 20   will not, .    
1db10 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 6c    ** flush the l
1db20 65 61 66 20 74 6f 20 64 69 73 6b 20 68 65 72 65  eaf to disk here
1db30 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
1db40 28 70 42 75 66 2d 3e 6e 20 2b 20 6e 54 65 72 6d  (pBuf->n + nTerm
1db50 20 2b 20 32 29 20 3e 20 70 67 73 7a 20 29 7b 0a   + 2) > pgsz ){.
1db60 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
1db70 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77  eFlushLeaf(p, &w
1db80 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
1db90 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61  pBuf = &writer.a
1dba0 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20  Writer[0].buf;. 
1dbb0 20 20 20 20 20 20 20 69 66 28 20 28 6e 54 65 72         if( (nTer
1dbc0 6d 20 2b 20 33 32 29 20 3e 20 70 42 75 66 2d 3e  m + 32) > pBuf->
1dbd0 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  nSpace ){.      
1dbe0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1dbf0 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ow(&p->rc, pBuf,
1dc00 20 6e 54 65 72 6d 20 2b 20 33 32 20 2d 20 70 42   nTerm + 32 - pB
1dc10 75 66 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  uf->n);.        
1dc20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
1dc30 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1dc40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1dc50 20 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20   Write the term 
1dc60 74 6f 20 74 68 65 20 6c 65 61 66 2e 20 41 6e 64  to the leaf. And
1dc70 20 69 66 20 69 74 20 69 73 20 74 68 65 20 66 69   if it is the fi
1dc80 72 73 74 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  rst on the leaf,
1dc90 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
1dca0 65 20 6c 65 61 66 20 69 73 20 6e 6f 74 20 70 61  e leaf is not pa
1dcb0 67 65 20 6e 75 6d 62 65 72 20 31 2c 20 70 75 73  ge number 1, pus
1dcc0 68 20 69 74 20 75 70 20 69 6e 74 6f 20 74 68 65  h it up into the
1dcd0 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
1dce0 79 20 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 77  y .      ** as w
1dcf0 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ell.  */.      i
1dd00 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
1dd10 54 65 72 6d 49 6e 50 61 67 65 3d 3d 30 20 29 7b  TermInPage==0 ){
1dd20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 72  .        int nPr
1dd30 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  e = fts5PrefixCo
1dd40 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c 20 7a 50  mpress(nTerm, zP
1dd50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e  rev, nTerm, (con
1dd60 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20  st u8*)zTerm);. 
1dd70 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
1dd80 3d 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69  = sqlite3PutVari
1dd90 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
1dda0 2d 3e 6e 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20  ->n], nPre);.   
1ddb0 20 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e       nSuffix = n
1ddc0 54 65 72 6d 20 2d 20 6e 50 72 65 3b 0a 20 20 20  Term - nPre;.   
1ddd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dde0 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42    fts5PutU16(&pB
1ddf0 75 66 2d 3e 70 5b 32 5d 2c 20 70 42 75 66 2d 3e  uf->p[2], pBuf->
1de00 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74  n);.        writ
1de10 65 72 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  er.bFirstTermInP
1de20 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
1de30 20 69 66 28 20 77 72 69 74 65 72 2e 61 57 72 69   if( writer.aWri
1de40 74 65 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29  ter[0].pgno!=1 )
1de50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1de60 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65 66 69  nPre = fts5Prefi
1de70 78 43 6f 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c  xCompress(nTerm,
1de80 20 7a 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28   zPrev, nTerm, (
1de90 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29  const u8*)zTerm)
1dea0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1deb0 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 70  WriteBtreeTerm(p
1dec0 2c 20 26 77 72 69 74 65 72 2c 20 6e 50 72 65 2b  , &writer, nPre+
1ded0 31 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54  1, (const u8*)zT
1dee0 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  erm);.          
1def0 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61  pBuf = &writer.a
1df00 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20  Writer[0].buf;. 
1df10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1df20 20 6e 50 72 65 3c 6e 54 65 72 6d 20 29 3b 0a 20   nPre<nTerm );. 
1df30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1df40 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
1df50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1df60 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1df70 65 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  e3PutVarint(&pBu
1df80 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e  f->p[pBuf->n], n
1df90 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 66  Suffix);.      f
1dfa0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1dfb0 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 28 63  endBlob(pBuf, (c
1dfc0 6f 6e 73 74 20 75 38 2a 29 26 7a 54 65 72 6d 5b  onst u8*)&zTerm[
1dfd0 6e 54 65 72 6d 2d 6e 53 75 66 66 69 78 5d 2c 20  nTerm-nSuffix], 
1dfe0 6e 53 75 66 66 69 78 29 3b 0a 0a 20 20 20 20 20  nSuffix);..     
1dff0 20 2f 2a 20 57 65 20 6a 75 73 74 20 77 72 6f 74   /* We just wrot
1e000 65 20 61 20 74 65 72 6d 20 69 6e 74 6f 20 70 61  e a term into pa
1e010 67 65 20 77 72 69 74 65 72 2e 61 57 72 69 74 65  ge writer.aWrite
1e020 72 5b 30 5d 2e 70 67 6e 6f 2e 20 49 66 20 61 20  r[0].pgno. If a 
1e030 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73  .      ** doclis
1e040 74 2d 69 6e 64 65 78 20 69 73 20 74 6f 20 62 65  t-index is to be
1e050 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1e060 68 69 73 20 64 6f 63 6c 69 73 74 2c 20 69 74 20  his doclist, it 
1e070 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
1e080 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e090 20 74 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20   this page. */. 
1e0a0 20 20 20 20 20 61 73 73 65 72 74 28 20 77 72 69       assert( wri
1e0b0 74 65 72 2e 6e 44 6c 69 64 78 3e 30 20 26 26 20  ter.nDlidx>0 && 
1e0c0 77 72 69 74 65 72 2e 61 44 6c 69 64 78 5b 30 5d  writer.aDlidx[0]
1e0d0 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  .buf.n==0 );.   
1e0e0 20 20 20 77 72 69 74 65 72 2e 61 44 6c 69 64 78     writer.aDlidx
1e0f0 5b 30 5d 2e 70 67 6e 6f 20 3d 20 77 72 69 74 65  [0].pgno = write
1e100 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  r.aWriter[0].pgn
1e110 6f 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 67  o;..      if( pg
1e120 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 6e  sz>=(pBuf->n + n
1e130 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a  Doclist + 1) ){.
1e140 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1e150 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69  ntire doclist wi
1e160 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75  ll fit on the cu
1e170 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20  rrent leaf. */. 
1e180 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1e190 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
1e1a0 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20  pBuf, pDoclist, 
1e1b0 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
1e1c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e1d0 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a  i64 iRowid = 0;.
1e1e0 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c          i64 iDel
1e1f0 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ta = 0;.        
1e200 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
1e210 20 20 20 20 20 20 20 77 72 69 74 65 72 2e 62 46         writer.bF
1e220 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1e230 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  = 0;..        /*
1e240 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c   The entire docl
1e250 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  ist will not fit
1e260 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 54   on this leaf. T
1e270 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20  he following .  
1e280 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74        ** loop it
1e290 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 74  erates through t
1e2a0 68 65 20 70 6f 73 6c 69 73 74 73 20 74 68 61 74  he poslists that
1e2b0 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 75 72   make up the cur
1e2c0 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  rent .        **
1e2d0 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20   doclist.  */.  
1e2e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
1e2f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e300 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29   iOff<nDoclist )
1e310 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1e320 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nPos;.          
1e330 69 6e 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20  int nCopy;.     
1e340 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b       int bDummy;
1e350 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
1e360 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 44  += getVarint(&pD
1e370 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75  oclist[iOff], (u
1e380 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
1e390 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20          nCopy = 
1e3a0 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
1e3b0 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  ze(&pDoclist[iOf
1e3c0 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  f], &nPos, &bDum
1e3d0 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  my);.          n
1e3e0 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20  Copy += nPos;.  
1e3f0 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b          iRowid +
1e400 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
1e410 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69      .          i
1e420 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
1e430 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
1e440 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50             fts5P
1e450 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30  utU16(&pBuf->p[0
1e460 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f  ], pBuf->n);   /
1e470 2a 20 66 69 72 73 74 20 64 6f 63 69 64 20 6f 6e  * first docid on
1e480 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
1e490 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20       pBuf->n += 
1e4a0 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74  sqlite3PutVarint
1e4b0 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
1e4c0 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  n], iRowid);.   
1e4d0 20 20 20 20 20 20 20 20 20 77 72 69 74 65 72 2e           writer.
1e4e0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1e4f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1e500 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64     fts5WriteDlid
1e510 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74  xAppend(p, &writ
1e520 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  er, iRowid);.   
1e530 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e540 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
1e550 6e 20 2b 3d 20 73 71 6c 69 74 65 33 50 75 74 56  n += sqlite3PutV
1e560 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
1e570 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29  Buf->n], iDelta)
1e580 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e590 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e5a0 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e  pBuf->n<=pBuf->n
1e5b0 53 70 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20  Space );..      
1e5c0 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
1e5d0 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73   + nCopy) <= pgs
1e5e0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
1e5f0 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
1e600 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oslist will fit 
1e610 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
1e620 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20  eaf. So copy.   
1e630 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69           ** it i
1e640 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20  n one go. */.   
1e650 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1e660 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1e670 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c 69 73  b(pBuf, &pDoclis
1e680 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b  t[iOff], nCopy);
1e690 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1e6a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e6b0 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c   The entire posl
1e6c0 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  ist will not fit
1e6d0 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53   on this leaf. S
1e6e0 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20  o it needs.     
1e6f0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
1e700 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74  broken into sect
1e710 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71  ions. The only q
1e720 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69  ualification bei
1e730 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ng.            *
1e740 2a 20 74 68 61 74 20 65 61 63 68 20 76 61 72 69  * that each vari
1e750 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65  nt must be store
1e760 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20  d contiguously. 
1e770 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1e780 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69  const u8 *pPosli
1e790 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69  st = &pDoclist[i
1e7a0 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Off];.          
1e7b0 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a    int iPos = 0;.
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
1e7d0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1e7e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e7f0 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20       int nSpace 
1e800 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e  = pgsz - pBuf->n
1e810 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e820 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
1e830 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 43           if( (nC
1e840 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70  opy - iPos)<=nSp
1e850 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ace ){.         
1e860 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79         n = nCopy
1e870 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20   - iPos;.       
1e880 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
1e8a0 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65  = fts5PoslistPre
1e8b0 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50  fix(&pPoslist[iP
1e8c0 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20  os], nSpace);.  
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1e8f0 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20  rt( n>0 );.     
1e900 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1e910 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1e920 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73  b(pBuf, &pPoslis
1e930 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20  t[iPos], n);.   
1e940 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20             iPos 
1e950 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  += n;.          
1e960 20 20 20 20 69 66 28 20 70 42 75 66 2d 3e 6e 3e      if( pBuf->n>
1e970 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
1e980 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
1e990 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26  teFlushLeaf(p, &
1e9a0 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20  writer);.       
1e9b0 20 20 20 20 20 20 20 20 20 70 42 75 66 20 3d 20           pBuf = 
1e9c0 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b  &writer.aWriter[
1e9d0 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20  0].buf;.        
1e9e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e9f0 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d        if( iPos>=
1ea00 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20  nCopy ) break;. 
1ea10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ea20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ea30 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79     iOff += nCopy
1ea40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ea50 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 66 2d    }..      pBuf-
1ea60 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20  >p[pBuf->n++] = 
1ea70 27 5c 30 27 3b 0a 20 20 20 20 20 20 61 73 73 65  '\0';.      asse
1ea80 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
1ea90 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20  f->nSpace );.   
1eaa0 20 20 20 7a 50 72 65 76 20 3d 20 28 63 6f 6e 73     zPrev = (cons
1eab0 74 20 75 38 2a 29 7a 54 65 72 6d 3b 0a 20 20 20  t u8*)zTerm;.   
1eac0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
1ead0 73 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68  shScanNext(pHash
1eae0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1eaf0 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
1eb00 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74  r(pHash);.    ft
1eb10 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
1eb20 20 26 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67   &writer, &nHeig
1eb30 68 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a  ht, &pgnoLast);.
1eb40 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
1eb50 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1eb60 2e 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20  . It is written 
1eb70 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
1eb80 62 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20  base by the.    
1eb90 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65  ** fts5Structure
1eba0 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62  Release() call b
1ebb0 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66  elow.  */.    if
1ebc0 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
1ebd0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  l==0 ){.      ft
1ebe0 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
1ebf0 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74  vel(&p->rc, &pSt
1ec00 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ruct);.    }.   
1ec10 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
1ec20 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
1ec30 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c  , pStruct, 0, 1,
1ec40 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
1ec50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ec60 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70  .      pSeg = &p
1ec70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
1ec80 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d  ].aSeg[ pStruct-
1ec90 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b  >aLevel[0].nSeg+
1eca0 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  + ];.      pSeg-
1ecb0 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1ecc0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 6e 48  ;.      pSeg->nH
1ecd0 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b  eight = nHeight;
1ece0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
1ecf0 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
1ed00 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74    pSeg->pgnoLast
1ed10 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
1ed20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1ed30 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ment++;.    }.  
1ed40 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
1ed50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74  romote(p, 0, pSt
1ed60 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 0a 20 20 66  ruct);.  }...  f
1ed70 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67  ts5IndexAutomerg
1ed80 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70  e(p, &pStruct, p
1ed90 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35  gnoLast);.  fts5
1eda0 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65  IndexCrisismerge
1edb0 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20  (p, &pStruct);. 
1edc0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1edd0 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b  ite(p, pStruct);
1ede0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
1edf0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
1ee00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
1ee10 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
1ee20 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1ee30 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f  y hash tables to
1ee40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1ee50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1ee60 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73  s5IndexFlush(Fts
1ee70 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a  5Index *p){.  /*
1ee80 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d   Unless it is em
1ee90 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68  pty, flush the h
1eea0 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
1eeb0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50  k */.  if( p->nP
1eec0 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20  endingData ){.  
1eed0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
1eee0 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  sh );.    p->nPe
1eef0 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
1ef00 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48     fts5FlushOneH
1ef10 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ash(p);.  }.}...
1ef20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1ef30 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73  ndexOptimize(Fts
1ef40 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
1ef50 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1ef60 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
1ef70 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
1ef80 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b  .  int nSeg = 0;
1ef90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1efa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1efb0 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
1efc0 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  (p);.  pStruct =
1efd0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1efe0 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53  ad(p);..  if( pS
1eff0 74 72 75 63 74 20 29 7b 0a 20 20 20 20 61 73 73  truct ){.    ass
1f000 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53  ert( pStruct->nS
1f010 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75  egment==fts5Stru
1f020 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
1f030 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20  ts(pStruct) );. 
1f040 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63     nSeg = pStruc
1f050 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20  t->nSegment;.   
1f060 20 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20   if( nSeg>1 ){. 
1f070 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
1f080 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1f090 63 74 75 72 65 29 3b 0a 20 20 20 20 20 20 6e 42  cture);.      nB
1f0a0 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d  yte += (pStruct-
1f0b0 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a  >nLevel+1) * siz
1f0c0 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1f0d0 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 70  eLevel);.      p
1f0e0 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63  New = (Fts5Struc
1f0f0 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73  ture*)sqlite3Fts
1f100 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1f110 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1f120 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77  }.  }.  if( pNew
1f130 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
1f140 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1f150 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ;.    int nByte 
1f160 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28  = nSeg * sizeof(
1f170 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1f180 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ment);.    pNew-
1f190 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63  >nLevel = pStruc
1f1a0 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20  t->nLevel+1;.   
1f1b0 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75   pNew->nWriteCou
1f1c0 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d 3e  nter = pStruct->
1f1d0 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
1f1e0 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d     pLvl = &pNew-
1f1f0 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d  >aLevel[pStruct-
1f200 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70 4c  >nLevel];.    pL
1f210 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  vl->aSeg = (Fts5
1f220 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
1f230 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
1f240 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20  locZero(&p->rc, 
1f250 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
1f260 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20 20  pLvl->aSeg ){.  
1f270 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
1f280 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  eg;.      int iS
1f290 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20  egOut = 0;.     
1f2a0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1f2b0 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1f2c0 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1f2d0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
1f2e0 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
1f2f0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
1f300 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
1f310 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69      pLvl->aSeg[i
1f320 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63  SegOut] = pStruc
1f330 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1f340 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
1f350 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b        iSegOut++;
1f360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f370 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
1f380 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e  Segment = pLvl->
1f390 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20  nSeg = nSeg;.   
1f3a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1f3b0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1f3c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30  ;.      pNew = 0
1f3d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1f3e0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 69  f( pNew ){.    i
1f3f0 6e 74 20 69 4c 76 6c 20 3d 20 70 4e 65 77 2d 3e  nt iLvl = pNew->
1f400 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20 20 20 77 68  nLevel-1;.    wh
1f410 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1f420 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61  TE_OK && pNew->a
1f430 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1f440 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
1f450 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f  nRem = FTS5_OPT_
1f460 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20  WORK_UNIT;.     
1f470 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
1f480 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69  evel(p, &pNew, i
1f490 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
1f4a0 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75   }..    fts5Stru
1f4b0 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e  ctureWrite(p, pN
1f4c0 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72  ew);.    fts5Str
1f4d0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e  uctureRelease(pN
1f4e0 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ew);.  }..  fts5
1f4f0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
1f500 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  (pStruct);.  ret
1f510 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
1f520 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e 74 20  urn(p); .}..int 
1f530 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
1f540 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65 78 20  Merge(Fts5Index 
1f550 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b  *p, int nMerge){
1f560 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1f570 20 2a 70 53 74 72 75 63 74 3b 0a 0a 20 20 70 53   *pStruct;..  pS
1f580 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
1f590 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
1f5a0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70  fts5IndexMerge(p
1f5b0 2c 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72  , &pStruct, nMer
1f5c0 67 65 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ge);.  fts5Struc
1f5d0 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74  tureWrite(p, pSt
1f5e0 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72  ruct);.  fts5Str
1f5f0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
1f600 74 72 75 63 74 29 3b 0a 0a 20 20 72 65 74 75 72  truct);..  retur
1f610 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
1f620 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n(p);.}.../*.** 
1f630 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20  Iterator pMulti 
1f640 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1f650 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1f660 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69  y (not EOF). Thi
1f670 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
1f680 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66 20  pends a copy of 
1f690 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
1f6a0 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 70  t of the entry p
1f6b0 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65 6e  Multi .** curren
1f6c0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f  tly points to to
1f6d0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
1f6e0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1f6f0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1f700 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
1f710 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61 73   p->rc. It is as
1f720 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f  sumed.** no erro
1f730 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
1f740 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
1f750 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f760 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
1f770 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
1f780 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
1f790 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
1f7a0 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d  MultiSegIter *pM
1f7b0 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a 2c  ulti,.  int bSz,
1f7c0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1f7d0 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Buf.){.  if( p->
1f7e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f7f0 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49 74  .    Fts5ChunkIt
1f800 65 72 20 69 74 65 72 3b 0a 20 20 20 20 46 74 73  er iter;.    Fts
1f810 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
1f820 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20   &pMulti->aSeg[ 
1f830 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31  pMulti->aFirst[1
1f840 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
1f850 61 73 73 65 72 74 28 20 66 74 73 35 4d 75 6c 74  assert( fts5Mult
1f860 69 49 74 65 72 45 6f 66 28 70 2c 20 70 4d 75 6c  iIterEof(p, pMul
1f870 74 69 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 66  ti)==0 );..    f
1f880 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74  ts5ChunkIterInit
1f890 28 70 2c 20 70 53 65 67 2c 20 26 69 74 65 72 29  (p, pSeg, &iter)
1f8a0 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35 43  ;..    if( fts5C
1f8b0 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
1f8c0 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iter)==0 ){.    
1f8d0 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20 20    if( bSz ){.   
1f8e0 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53       /* WRITEPOS
1f8f0 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20  LISTSIZE */.    
1f900 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f910 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1f920 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e 52  c, pBuf, iter.nR
1f930 65 6d 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 7d  em * 2);.      }
1f940 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74  .      while( ft
1f950 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70  s5ChunkIterEof(p
1f960 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20  , &iter)==0 ){. 
1f970 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f980 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1f990 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e  rc, pBuf, iter.n
1f9a0 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20 20 20 20  , iter.p);.     
1f9b0 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1f9c0 4e 65 78 74 28 70 2c 20 26 69 74 65 72 29 3b 0a  Next(p, &iter);.
1f9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f9e0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52    fts5ChunkIterR
1f9f0 65 6c 65 61 73 65 28 26 69 74 65 72 29 3b 0a 20  elease(&iter);. 
1fa00 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1fa10 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65  d fts5DoclistIte
1fa20 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73  rNext(Fts5Doclis
1fa30 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  tIter *pIter){. 
1fa40 20 69 66 28 20 70 49 74 65 72 2d 3e 69 3c 70 49   if( pIter->i<pI
1fa50 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 6e  ter->n ){.    in
1fa60 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69 66  t bDummy;.    if
1fa70 28 20 70 49 74 65 72 2d 3e 69 20 29 7b 0a 20 20  ( pIter->i ){.  
1fa80 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
1fa90 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b        pIter->i +
1faa0 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 49 74  = getVarint(&pIt
1fab0 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c  er->a[pIter->i],
1fac0 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
1fad0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
1fae0 2d 3e 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20  ->bDesc ){.     
1faf0 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
1fb00 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   -= iDelta;.    
1fb10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fb20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
1fb30 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
1fb40 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1fb50 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67     pIter->i += g
1fb60 65 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d  etVarint(&pIter-
1fb70 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75  >a[pIter->i], (u
1fb80 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
1fb90 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  id);.    }.    p
1fba0 49 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73 35 47  Iter->i += fts5G
1fbb0 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 0a 20  etPoslistSize(. 
1fbc0 20 20 20 20 20 20 20 26 70 49 74 65 72 2d 3e 61         &pIter->a
1fbd0 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 26 70 49 74  [pIter->i], &pIt
1fbe0 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 2c 20 26 62  er->nPoslist, &b
1fbf0 44 75 6d 6d 79 0a 20 20 20 20 29 3b 0a 20 20 20  Dummy.    );.   
1fc00 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
1fc10 20 3d 20 26 70 49 74 65 72 2d 3e 61 5b 70 49 74   = &pIter->a[pIt
1fc20 65 72 2d 3e 69 5d 3b 0a 20 20 20 20 70 49 74 65  er->i];.    pIte
1fc30 72 2d 3e 69 20 2b 3d 20 70 49 74 65 72 2d 3e 6e  r->i += pIter->n
1fc40 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65  Poslist;.  }else
1fc50 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f  {.    pIter->aPo
1fc60 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  slist = 0;.  }.}
1fc70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1fc80 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
1fc90 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t(.  Fts5Buffer 
1fca0 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 62 44  *pBuf, .  int bD
1fcb0 65 73 63 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c  esc, .  Fts5Docl
1fcc0 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a 29  istIter *pIter.)
1fcd0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  {.  memset(pIter
1fce0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
1fcf0 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61  er));.  pIter->a
1fd00 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49   = pBuf->p;.  pI
1fd10 74 65 72 2d 3e 6e 20 3d 20 70 42 75 66 2d 3e 6e  ter->n = pBuf->n
1fd20 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 65 73 63  ;.  pIter->bDesc
1fd30 20 3d 20 62 44 65 73 63 3b 0a 20 20 66 74 73 35   = bDesc;.  fts5
1fd40 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
1fd50 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
1fd60 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73   Append a doclis
1fd70 74 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  t to buffer pBuf
1fd80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1fd90 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
1fda0 44 6f 63 69 64 28 0a 20 20 69 6e 74 20 2a 70 52  Docid(.  int *pR
1fdb0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1fdc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
1fdd0 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
1fde0 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 0a 20  /.  int bDesc,. 
1fdf0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
1fe00 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1fe10 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72   /* Buffer to wr
1fe20 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
1fe30 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20  *piLastRowid,   
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1fe50 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20  N/OUT: Previous 
1fe60 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69  rowid written (i
1fe70 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20  f any) */.  i64 
1fe80 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  iRowid          
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1fea0 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a  owid to append *
1feb0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 42 75 66 2d  /.){.  if( pBuf-
1fec0 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  >n==0 ){.    fts
1fed0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1fee0 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69  int(pRc, pBuf, i
1fef0 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20  Rowid);.  }else 
1ff00 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20  if( bDesc ){.   
1ff10 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ff20 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75  dVarint(pRc, pBu
1ff30 66 2c 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20  f, *piLastRowid 
1ff40 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  - iRowid);.  }el
1ff50 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66  se{.    fts5Buff
1ff60 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  erAppendVarint(p
1ff70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69 64  Rc, pBuf, iRowid
1ff80 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29   - *piLastRowid)
1ff90 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61 73 74 52  ;.  }.  *piLastR
1ffa0 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d  owid = iRowid;.}
1ffb0 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20  ../*.** Buffers 
1ffc0 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69  p1 and p2 contai
1ffd0 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73  n doclists. This
1ffe0 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73   function merges
1fff0 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
20000 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69  of the two docli
20010 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64  sts together and
20020 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20   sets buffer p1 
20030 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65  to the result be
20040 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
20050 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
20060 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
20070 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
20080 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20  ft in p->rc. If 
20090 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20  an error has.** 
200a0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
200b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
200c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
200d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
200e0 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28  ergePrefixLists(
200f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20110 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
20120 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
20130 6e 74 20 62 44 65 73 63 2c 0a 20 20 46 74 73 35  nt bDesc,.  Fts5
20140 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20  Buffer *p1,     
20150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20160 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72  irst list to mer
20170 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ge */.  Fts5Buff
20180 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20  er *p2          
20190 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
201a0 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  d list to merge 
201b0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e  */.){.  if( p2->
201c0 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 61  n ){.    i64 iLa
201d0 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
201e0 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
201f0 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f 63   i1;.    Fts5Doc
20200 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20 20  listIter i2;.   
20210 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b   Fts5Buffer out;
20220 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
20230 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  tmp;.    memset(
20240 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &out, 0, sizeof(
20250 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  out));.    memse
20260 74 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f  t(&tmp, 0, sizeo
20270 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20 66 74  f(tmp));..    ft
20280 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
20290 74 28 70 31 2c 20 62 44 65 73 63 2c 20 26 69 31  t(p1, bDesc, &i1
202a0 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  );.    fts5Docli
202b0 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20 62  stIterInit(p2, b
202c0 44 65 73 63 2c 20 26 69 32 29 3b 0a 20 20 20 20  Desc, &i2);.    
202d0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
202e0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 31 2e 61  LITE_OK && (i1.a
202f0 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32  Poslist!=0 || i2
20300 2e 61 50 6f 73 6c 69 73 74 21 3d 30 29 20 29 7b  .aPoslist!=0) ){
20310 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50  .      if( i2.aP
20320 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31  oslist==0 || (i1
20330 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20 20  .aPoslist && .  
20340 20 20 20 20 20 20 20 20 20 28 20 28 62 44 65 73           ( (bDes
20350 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e 69  c && i1.iRowid>i
20360 32 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 21 62  2.iRowid) || (!b
20370 44 65 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69  Desc && i1.iRowi
20380 64 3c 69 32 2e 69 52 6f 77 69 64 29 20 29 0a 20  d<i2.iRowid) ). 
20390 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20       )){.       
203a0 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
203b0 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20  rom i1 */.      
203c0 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
203d0 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62  dDocid(&p->rc, b
203e0 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61  Desc, &out, &iLa
203f0 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77  stRowid, i1.iRow
20400 69 64 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  id);.        /* 
20410 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
20420 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
20430 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20440 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  nt(&p->rc, &out,
20450 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2a 20 32   i1.nPoslist * 2
20460 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
20470 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
20480 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31  &p->rc, &out, i1
20490 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 50  .nPoslist, i1.aP
204a0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oslist);.       
204b0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
204c0 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20  Next(&i1);.     
204d0 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
204e0 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  ( i1.aPoslist==0
204f0 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d 69   || i2.iRowid!=i
20500 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  1.iRowid ){.    
20510 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72      /* Copy entr
20520 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20  y from i2 */.   
20530 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
20540 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63  pendDocid(&p->rc
20550 2c 20 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26  , bDesc, &out, &
20560 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69  iLastRowid, i2.i
20570 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
20580 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
20590 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  IZE */.        f
205a0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
205b0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f  arint(&p->rc, &o
205c0 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 20  ut, i2.nPoslist 
205d0 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74  * 2);.        ft
205e0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
205f0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ob(&p->rc, &out,
20600 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 32   i2.nPoslist, i2
20610 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
20620 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
20630 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20  terNext(&i2);.  
20640 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
20650 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  {.        Fts5Po
20660 73 6c 69 73 74 52 65 61 64 65 72 20 72 31 3b 0a  slistReader r1;.
20670 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
20680 69 73 74 52 65 61 64 65 72 20 72 32 3b 0a 20 20  istReader r2;.  
20690 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
206a0 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  tWriter writer;.
206b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
206c0 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  &writer, 0, size
206d0 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20  of(writer));..  
206e0 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74        /* Merge t
206f0 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20  he two position 
20700 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20  lists. */ .     
20710 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
20720 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20  ndDocid(&p->rc, 
20730 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c  bDesc, &out, &iL
20740 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
20750 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
20760 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d  s5BufferZero(&tm
20770 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
20780 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
20790 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e  aderInit(-1, i1.
207a0 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
207b0 73 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20  slist, &r1);.   
207c0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
207d0 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
207e0 74 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73  t(-1, i2.aPoslis
207f0 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  t, i2.nPoslist, 
20800 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68  &r2);.        wh
20810 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
20820 54 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f  TE_OK && (r1.bEo
20830 66 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d  f==0 || r2.bEof=
20840 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
20850 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20   i64 iNew;.     
20860 20 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66       if( r2.bEof
20870 20 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20   || (r1.bEof==0 
20880 26 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50  && r1.iPos<r2.iP
20890 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os) ){.         
208a0 20 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f     iNew = r1.iPo
208b0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  s;.            s
208c0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
208d0 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29  tReaderNext(&r1)
208e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
208f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
20900 4e 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20  New = r2.iPos;. 
20910 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20920 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
20930 64 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20  derNext(&r2);.  
20940 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
20950 2e 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29  .iPos==r2.iPos )
20960 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
20970 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72  istReaderNext(&r
20980 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  1);.          }.
20990 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
209a0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  = sqlite3Fts5Pos
209b0 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64  listWriterAppend
209c0 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20  (&tmp, &writer, 
209d0 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  iNew);.        }
209e0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ..        /* WRI
209f0 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
20a00 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
20a10 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
20a20 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d  &p->rc, &out, tm
20a30 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20  p.n * 2);.      
20a40 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
20a50 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
20a60 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e  out, tmp.n, tmp.
20a70 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  p);.        fts5
20a80 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
20a90 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &i1);.        ft
20aa0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
20ab0 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i2);.      }.
20ac0 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42      }..    fts5B
20ad0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
20ae0 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e   p1, out.n, out.
20af0 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
20b00 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20  erFree(&tmp);.  
20b10 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
20b20 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  (&out);.  }.}..s
20b30 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
20b40 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75  ufferSwap(Fts5Bu
20b50 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75  ffer *p1, Fts5Bu
20b60 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73  ffer *p2){.  Fts
20b70 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70  5Buffer tmp = *p
20b80 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a  1;.  *p1 = *p2;.
20b90 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a    *p2 = tmp;.}..
20ba0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
20bb0 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
20bc0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20be0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72     /* Index to r
20bf0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
20c00 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20c20 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52   True for "ORDER
20c30 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
20c40 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
20c50 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
20c60 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
20c70 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
20c80 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69   to match */.  i
20c90 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20cb0 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
20cc0 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73   pToken in bytes
20cd0 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
20ce0 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
20cf0 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
20d00 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
20d10 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
20d20 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
20d30 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66  Fts5Buffer *aBuf
20d40 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42  ;.  const int nB
20d50 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66  uf = 32;..  aBuf
20d60 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29   = (Fts5Buffer*)
20d70 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
20d80 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
20d90 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74  er)*nBuf);.  pSt
20da0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
20db0 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20  tureRead(p);..  
20dc0 69 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72  if( aBuf && pStr
20dd0 75 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  uct ){.    const
20de0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
20df0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
20e00 4e 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69  N;.    Fts5Docli
20e10 73 74 49 74 65 72 20 2a 70 44 6f 63 6c 69 73 74  stIter *pDoclist
20e20 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
20e30 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
20e40 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 4d 75 6c  = 0;.    Fts5Mul
20e50 74 69 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  tiSegIter *p1 = 
20e60 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74  0;     /* Iterat
20e70 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65  or used to gathe
20e80 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65  r data from inde
20e90 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66  x */.    Fts5Buf
20ea0 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20  fer doclist;..  
20eb0 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73    memset(&doclis
20ec0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63  t, 0, sizeof(doc
20ed0 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 6f 72 28  list));.    for(
20ee0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
20ef0 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31 2c 20  (p, pStruct, 1, 
20f00 66 6c 61 67 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e  flags, pToken, n
20f10 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70  Token, -1, 0, &p
20f20 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  1);.        fts5
20f30 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
20f40 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  p1)==0;.        
20f50 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
20f60 74 28 70 2c 20 70 31 2c 20 30 2c 20 30 29 0a 20  t(p, p1, 0, 0). 
20f70 20 20 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20     ){.      i64 
20f80 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c  iRowid = fts5Mul
20f90 74 69 49 74 65 72 52 6f 77 69 64 28 70 31 29 3b  tiIterRowid(p1);
20fa0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
20fb0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  ;.      const u8
20fc0 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75   *pTerm = fts5Mu
20fd0 6c 74 69 49 74 65 72 54 65 72 6d 28 70 31 2c 20  ltiIterTerm(p1, 
20fe0 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 61  &nTerm);.      a
20ff0 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 70 54  ssert( memcmp(pT
21000 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e  oken, pTerm, MIN
21010 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29  (nToken, nTerm))
21020 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  <=0 );.      if(
21030 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c   nTerm<nToken ||
21040 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20   memcmp(pToken, 
21050 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29  pTerm, nToken) )
21060 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69   break;..      i
21070 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 0a  f( doclist.n>0 .
21080 20 20 20 20 20 20 20 26 26 20 28 28 21 62 44 65         && ((!bDe
21090 73 63 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c  sc && iRowid<=iL
210a0 61 73 74 52 6f 77 69 64 29 20 7c 7c 20 28 62 44  astRowid) || (bD
210b0 65 73 63 20 26 26 20 69 52 6f 77 69 64 3e 3d 69  esc && iRowid>=i
210c0 4c 61 73 74 52 6f 77 69 64 29 29 0a 20 20 20 20  LastRowid)).    
210d0 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 66 6f    ){..        fo
210e0 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
210f0 4c 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69  LITE_OK && docli
21100 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  st.n; i++){.    
21110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
21120 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20  nBuf );.        
21130 20 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d    if( aBuf[i].n=
21140 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21150 20 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70    fts5BufferSwap
21160 28 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66  (&doclist, &aBuf
21170 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
21180 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
21190 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  (&doclist);.    
211a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
211b0 20 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72           fts5Mer
211c0 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c  gePrefixLists(p,
211d0 20 62 44 65 73 63 2c 20 26 64 6f 63 6c 69 73 74   bDesc, &doclist
211e0 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
211f0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
21200 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d  ferZero(&aBuf[i]
21210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
21220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21230 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69  .      if( docli
21240 73 74 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  st.n==0 ){.     
21250 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
21260 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
21270 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77  , &doclist, iRow
21280 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id);.      }else
21290 20 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20   if( bDesc ){.  
212a0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
212b0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
212c0 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69  >rc, &doclist, i
212d0 4c 61 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77  LastRowid - iRow
212e0 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id);.      }else
212f0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
21300 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
21310 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73  (&p->rc, &doclis
21320 74 2c 20 69 52 6f 77 69 64 20 2d 20 69 4c 61 73  t, iRowid - iLas
21330 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d  tRowid);.      }
21340 0a 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69  .      iLastRowi
21350 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  d = iRowid;.    
21360 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50    fts5MultiIterP
21370 6f 73 6c 69 73 74 28 70 2c 20 70 31 2c 20 31 2c  oslist(p, p1, 1,
21380 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20   &doclist);.    
21390 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
213a0 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20  i<nBuf; i++){.  
213b0 20 20 20 20 66 74 73 35 4d 65 72 67 65 50 72 65      fts5MergePre
213c0 66 69 78 4c 69 73 74 73 28 70 2c 20 62 44 65 73  fixLists(p, bDes
213d0 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42  c, &doclist, &aB
213e0 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 66 74  uf[i]);.      ft
213f0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61 42  s5BufferFree(&aB
21400 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  uf[i]);.    }.  
21410 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
21420 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20  ree(p, p1);..   
21430 20 70 44 6f 63 6c 69 73 74 20 3d 20 28 46 74 73   pDoclist = (Fts
21440 35 44 6f 63 6c 69 73 74 49 74 65 72 2a 29 66 74  5DoclistIter*)ft
21450 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73  s5IdxMalloc(p, s
21460 69 7a 65 6f 66 28 46 74 73 35 44 6f 63 6c 69 73  izeof(Fts5Doclis
21470 74 49 74 65 72 29 29 3b 0a 20 20 20 20 69 66 28  tIter));.    if(
21480 20 21 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20   !pDoclist ){.  
21490 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
214a0 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  ee(&doclist);.  
214b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
214c0 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 3d  Iter->pDoclist =
214d0 20 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20   pDoclist;.     
214e0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
214f0 49 6e 69 74 28 26 64 6f 63 6c 69 73 74 2c 20 62  Init(&doclist, b
21500 44 65 73 63 2c 20 70 49 74 65 72 2d 3e 70 44 6f  Desc, pIter->pDo
21510 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  clist);.    }.  
21520 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
21530 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
21540 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
21550 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a  ee(aBuf);.}.../*
21560 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
21570 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
21580 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
21590 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
215a0 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20  ) pertain.** to 
215b0 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
215c0 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a  h rowid iRowid..
215d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
215e0 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74  s5IndexBeginWrit
215f0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
21600 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61  i64 iRowid){.  a
21610 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
21620 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a  LITE_OK );..  /*
21630 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 68 61   Allocate the ha
21640 73 68 20 74 61 62 6c 65 20 69 66 20 69 74 20 68  sh table if it h
21650 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
21660 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
21670 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 3d  .  if( p->pHash=
21680 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  =0 ){.    p->rc 
21690 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
216a0 68 4e 65 77 28 26 70 2d 3e 70 48 61 73 68 2c 20  hNew(&p->pHash, 
216b0 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  &p->nPendingData
216c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75  );.  }..  /* Flu
216d0 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  sh the hash tabl
216e0 65 20 74 6f 20 64 69 73 6b 20 69 66 20 72 65 71  e to disk if req
216f0 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 69  uired */.  if( i
21700 52 6f 77 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65  Rowid<=p->iWrite
21710 52 6f 77 69 64 20 7c 7c 20 28 70 2d 3e 6e 50 65  Rowid || (p->nPe
21720 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e  ndingData > p->n
21730 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 29 20  MaxPendingData) 
21740 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
21750 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20  Flush(p);.  }.  
21760 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d  p->iWriteRowid =
21770 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72   iRowid;.  retur
21780 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
21790 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n(p);.}../*.** C
217a0 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64 69  ommit data to di
217b0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
217c0 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28  e3Fts5IndexSync(
217d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
217e0 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 61 73  t bCommit){.  as
217f0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
21800 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
21810 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20  IndexFlush(p);. 
21820 20 69 66 28 20 62 43 6f 6d 6d 69 74 20 29 20 66   if( bCommit ) f
21830 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
21840 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
21850 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
21860 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
21870 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
21880 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
21890 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44  y hash tables. D
218a0 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a  o not write it.*
218b0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
218c0 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
218d0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
218e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
218f0 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65   %_data.** table
21900 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
21910 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e  d on disk. So an
21920 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  y in-memory cach
21930 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a  es of %_data .**
21940 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65   records must be
21950 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
21960 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
21970 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74  IndexRollback(Ft
21980 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66  s5Index *p){.  f
21990 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
219a0 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44 69  );.  fts5IndexDi
219b0 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20 20  scardData(p);.  
219c0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
219d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
219e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
219f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  }../*.** The %_d
21a00 61 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  ata table is com
21a10 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68  pletely empty wh
21a20 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
21a30 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73   is called. This
21a40 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  .** function pop
21a50 75 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74  ulates it with t
21a60 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63  he initial struc
21a70 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72  ture objects for
21a80 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20   each index,.** 
21a90 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  and the initial 
21aa0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22  version of the "
21ab0 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
21ac0 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c   (a zero-byte bl
21ad0 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ob)..*/.int sqli
21ae0 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e  te3Fts5IndexRein
21af0 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  it(Fts5Index *p)
21b00 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
21b10 65 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  e s;..  assert( 
21b20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
21b30 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71   );.  p->rc = sq
21b40 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
21b50 74 41 76 65 72 61 67 65 73 28 70 2c 20 28 63 6f  tAverages(p, (co
21b60 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a  nst u8*)"", 0);.
21b70 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c  .  memset(&s, 0,
21b80 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
21b90 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35 53  cture));.  fts5S
21ba0 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
21bb0 20 26 73 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20   &s);..  return 
21bc0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
21bd0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  p);.}../*.** Ope
21be0 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65  n a new Fts5Inde
21bf0 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65  x handle. If the
21c00 20 62 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e   bCreate argumen
21c10 74 20 69 73 20 74 72 75 65 2c 20 63 72 65 61 74  t is true, creat
21c20 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
21c30 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
21c40 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  ng %_data table.
21c50 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
21c60 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f  sful, set *pp to
21c70 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
21c80 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  w object and ret
21c90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
21ca0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
21cb0 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   *pp to NULL and
21cc0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
21cd0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
21ce0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
21cf0 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73  IndexOpen(.  Fts
21d00 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
21d10 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65  , .  int bCreate
21d20 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  , .  Fts5Index *
21d30 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  *pp,.  char **pz
21d40 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Err.){.  int rc 
21d50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
21d60 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20  ts5Index *p;    
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21d80 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
21d90 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74  .  *pp = p = (Ft
21da0 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33  s5Index*)sqlite3
21db0 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
21dc0 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49  rc, sizeof(Fts5I
21dd0 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 72 63  ndex));.  if( rc
21de0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21df0 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20     p->pConfig = 
21e00 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e  pConfig;.    p->
21e10 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53 35  nWorkUnit = FTS5
21e20 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20  _WORK_UNIT;.    
21e30 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
21e40 74 61 20 3d 20 31 30 32 34 2a 31 30 32 34 3b 0a  ta = 1024*1024;.
21e50 20 20 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20      p->zDataTbl 
21e60 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
21e70 66 28 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f  f("%s_data", pCo
21e80 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  nfig->zName);.  
21e90 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62    if( p->zDataTb
21ea0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
21eb0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
21ec0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62  .    }else if( b
21ed0 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 20 20  Create ){.      
21ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
21ef0 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20 20 20  CreateTable(.   
21f00 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2c 20         pConfig, 
21f10 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e 54 45  "data", "id INTE
21f20 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
21f30 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20 30 2c   block BLOB", 0,
21f40 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29 3b 0a   pzErr.      );.
21f50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21f70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
21f80 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70  ts5IndexReinit(p
21f90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21fa0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
21fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
21fc0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
21fd0 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  K );.  if( rc ){
21fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
21ff0 49 6e 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20  IndexClose(p);. 
22000 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
22010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22020 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61  /*.** Close a ha
22030 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61  ndle opened by a
22040 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
22050 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
22060 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  exOpen()..*/.int
22070 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22080 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78  xClose(Fts5Index
22090 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
220a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
220b0 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
220c0 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  t( p->pReader==0
220d0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
220e0 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69  finalize(p->pWri
220f0 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
22100 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44  3_finalize(p->pD
22110 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  eleter);.    sql
22120 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65  ite3Fts5HashFree
22130 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
22140 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
22150 72 46 72 65 65 28 26 70 2d 3e 73 63 72 61 74 63  rFree(&p->scratc
22160 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
22170 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c  free(p->zDataTbl
22180 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
22190 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ree(p);.  }.  re
221a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
221b0 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69  * Argument p poi
221c0 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
221d0 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38  containing utf-8
221e0 20 74 65 78 74 20 74 68 61 74 20 69 73 20 6e 20   text that is n 
221f0 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a  bytes in .** siz
22200 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  e. Return the nu
22210 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
22220 20 74 68 65 20 6e 43 68 61 72 20 63 68 61 72 61   the nChar chara
22230 63 74 65 72 20 70 72 65 66 69 78 20 6f 66 20 74  cter prefix of t
22240 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72  he.** buffer, or
22250 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
22260 6c 65 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20  less than nChar 
22270 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f  characters in to
22280 74 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tal..*/.static i
22290 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61 72  nt fts5IndexChar
222a0 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 63 6f 6e  lenToBytelen(con
222b0 73 74 20 63 68 61 72 20 2a 70 2c 20 69 6e 74 20  st char *p, int 
222c0 6e 42 79 74 65 2c 20 69 6e 74 20 6e 43 68 61 72  nByte, int nChar
222d0 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
222e0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
222f0 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
22300 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42  ){.    if( n>=nB
22310 79 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  yte ) return 0; 
22320 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f       /* Input co
22330 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61  ntains fewer tha
22340 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f  n nChar chars */
22350 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e  .    if( (unsign
22360 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d  ed char)p[n++]>=
22370 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
22380 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63  ile( (p[n] & 0xc
22390 30 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a  0)==0x80 ) n++;.
223a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
223b0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn n;.}../*.** p
223c0 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e  In is a UTF-8 en
223d0 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49  coded string, nI
223e0 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  n bytes in size.
223f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
22400 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65  er of.** unicode
22410 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
22420 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 69 6e  he string..*/.in
22430 74 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c  t fts5IndexCharl
22440 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  en(const char *p
22450 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20  In, int nIn){.  
22460 69 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20  int nChar = 0;  
22470 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
22480 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   i = 0;.  while(
22490 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66   i<nIn ){.    if
224a0 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ( (unsigned char
224b0 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20  )pIn[i++]>=0xc0 
224c0 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
224d0 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d  i<nIn && (pIn[i]
224e0 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29   & 0xc0)==0x80 )
224f0 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   i++;.    }.    
22500 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nChar++;.  }.  r
22510 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a  eturn nChar;.}..
22520 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
22530 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f  remove data to o
22540 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  r from the index
22550 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f  . Each time a do
22560 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64  cument is .** ad
22570 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65  ded to or remove
22580 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  d from the index
22590 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
225a0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72  is called one or
225b0 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a   more.** times..
225c0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73  **.** For an ins
225d0 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ert, it must be 
225e0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
225f0 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68  each token in th
22600 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a  e new document..
22610 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  ** If the operat
22620 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c  ion is a delete,
22630 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c   it must be call
22640 65 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e  ed (at least) on
22650 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75  ce for each.** u
22660 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74  nique token in t
22670 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
22680 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c   an iCol value l
22690 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54  ess than zero. T
226a0 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d  he iPos.** argum
226b0 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66  ent is ignored f
226c0 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a  or a delete..*/.
226d0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
226e0 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73  ndexWrite(.  Fts
226f0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22710 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74  Index to write t
22720 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  o */.  int iCol,
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
22750 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69   token appears i
22760 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65  n (-ve -> delete
22770 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c  ) */.  int iPos,
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
227a0 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68  on of token with
227b0 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  in column */.  c
227c0 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
227d0 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f  n, int nToken  /
227e0 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f  * Token to add o
227f0 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66  r remove to or f
22800 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  rom index */.){.
22810 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
22840 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64  rate through ind
22850 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  exes */.  int rc
22860 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
22870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22880 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
22890 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
228a0 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
228b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
228c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
228d0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74    /* Add the ent
228e0 72 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74  ry to the main t
228f0 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  erms index. */. 
22900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
22910 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 20 20  5HashWrite(.    
22920 20 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69    p->pHash, p->i
22930 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c  WriteRowid, iCol
22940 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49  , iPos, FTS5_MAI
22950 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e  N_PREFIX, pToken
22960 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20  , nToken.  );.. 
22970 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e   for(i=0; i<pCon
22980 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26 20  fig->nPrefix && 
22990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
229a0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  ++){.    int nBy
229b0 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68  te = fts5IndexCh
229c0 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70  arlenToBytelen(p
229d0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70  Token, nToken, p
229e0 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
229f0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  i]);.    if( nBy
22a00 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  te ){.      rc =
22a10 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
22a20 57 72 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20  Write(p->pHash, 
22a30 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57  .          p->iW
22a40 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  riteRowid, iCol,
22a50 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e   iPos, FTS5_MAIN
22a60 5f 50 52 45 46 49 58 2b 69 2b 31 2c 20 70 54 6f  _PREFIX+i+1, pTo
22a70 6b 65 6e 2c 20 6e 42 79 74 65 0a 20 20 20 20 20  ken, nByte.     
22a80 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
22a90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22aa0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
22ab0 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72  iterator to iter
22ac0 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 64  ate though all d
22ad0 6f 63 69 64 73 20 74 68 61 74 20 6d 61 74 63 68  ocids that match
22ae0 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69   the .** specifi
22af0 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  ed token or toke
22b00 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74  n prefix..*/.int
22b10 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22b20 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e  xQuery(.  Fts5In
22b30 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
22b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
22b50 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20   index to query 
22b60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
22b70 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
22b80 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f  ken, /* Token (o
22b90 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65  r prefix) to que
22ba0 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
22bb0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
22bd0 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
22be0 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a  _QUERY_X flags *
22bf0 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
22c00 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20  r **ppIter      
22c10 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
22c20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
22c30 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  */.){.  Fts5Conf
22c40 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
22c50 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35  >pConfig;.  Fts5
22c60 49 6e 64 65 78 49 74 65 72 20 2a 70 52 65 74 3b  IndexIter *pRet;
22c70 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
22c80 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
22c90 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a  f = {0, 0, 0};..
22ca0 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52    /* If the QUER
22cb0 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73  Y_SCAN flag is s
22cc0 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  et, all other fl
22cd0 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61  ags must be clea
22ce0 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  r. */.  assert( 
22cf0 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
22d00 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d  EX_QUERY_SCAN)==
22d10 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  0.       || (fla
22d20 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
22d30 55 45 52 59 5f 53 43 41 4e 29 3d 3d 46 54 53 35  UERY_SCAN)==FTS5
22d40 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
22d50 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  .  );..  if( sql
22d60 69 74 65 33 46 74 73 35 42 75 66 66 65 72 47 72  ite3Fts5BufferGr
22d70 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ow(&p->rc, &buf,
22d80 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b   nToken+1)==0 ){
22d90 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 62 75 66  .    memcpy(&buf
22da0 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e  .p[1], pToken, n
22db0 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 0a 20 20 69  Token);.  }..  i
22dc0 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
22dd0 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
22de0 58 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6c 61  X ){.    if( fla
22df0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
22e00 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20  UERY_TEST_NOIDX 
22e10 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
22e20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  1+pConfig->nPref
22e30 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ix;.    }else{. 
22e40 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d       int nChar =
22e50 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
22e60 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  n(pToken, nToken
22e70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64  );.      for(iId
22e80 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66  x=1; iIdx<=pConf
22e90 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64  ig->nPrefix; iId
22ea0 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  x++){.        if
22eb0 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  ( pConfig->aPref
22ec0 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61  ix[iIdx-1]==nCha
22ed0 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
22ee0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22ef0 70 52 65 74 20 3d 20 28 46 74 73 35 49 6e 64 65  pRet = (Fts5Inde
22f00 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 46 74  xIter*)sqlite3Ft
22f10 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
22f20 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  >rc, sizeof(Fts5
22f30 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 20 20 69  IndexIter));.  i
22f40 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 6d  f( pRet ){.    m
22f50 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 73  emset(pRet, 0, s
22f60 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49  izeof(Fts5IndexI
22f70 74 65 72 29 29 3b 0a 0a 20 20 20 20 70 52 65 74  ter));..    pRet
22f80 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20  ->pIndex = p;.  
22f90 20 20 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e    if( iIdx<=pCon
22fa0 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a  fig->nPrefix ){.
22fb0 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d        buf.p[0] =
22fc0 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
22fd0 58 20 2b 20 69 49 64 78 3b 0a 20 20 20 20 20 20  X + iIdx;.      
22fe0 70 52 65 74 2d 3e 70 53 74 72 75 63 74 20 3d 20  pRet->pStruct = 
22ff0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
23000 64 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  d(p);.      if( 
23010 70 52 65 74 2d 3e 70 53 74 72 75 63 74 20 29 7b  pRet->pStruct ){
23020 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
23030 74 69 49 74 65 72 4e 65 77 28 0a 20 20 20 20 20  tiIterNew(.     
23040 20 20 20 20 20 20 20 70 2c 20 70 52 65 74 2d 3e         p, pRet->
23050 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67  pStruct, 1, flag
23060 73 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e  s, buf.p, nToken
23070 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74  +1, -1, 0, &pRet
23080 2d 3e 70 4d 75 6c 74 69 0a 20 20 20 20 20 20 20  ->pMulti.       
23090 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
230a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
230b0 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20   bDesc = (flags 
230c0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
230d0 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20  Y_DESC)!=0;.    
230e0 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53    buf.p[0] = FTS
230f0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20  5_MAIN_PREFIX;. 
23100 20 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72       fts5SetupPr
23110 65 66 69 78 49 74 65 72 28 70 2c 20 62 44 65 73  efixIter(p, bDes
23120 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e  c, buf.p, nToken
23130 2b 31 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 7d  +1, pRet);.    }
23140 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
23150 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
23160 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 52  Fts5IterClose(pR
23170 65 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  et);.    pRet = 
23180 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 74 65 72  0;.  }.  *ppIter
23190 20 3d 20 70 52 65 74 3b 0a 20 20 73 71 6c 69 74   = pRet;.  sqlit
231a0 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65  e3Fts5BufferFree
231b0 28 26 62 75 66 29 3b 0a 20 20 72 65 74 75 72 6e  (&buf);.  return
231c0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
231d0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
231e0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
231f0 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
23200 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
23210 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e  ument is at EOF.
23220 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
23230 74 73 35 49 74 65 72 45 6f 66 28 46 74 73 35 49  ts5IterEof(Fts5I
23240 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
23250 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
23260 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
23270 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
23280 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  ( pIter->pDoclis
23290 74 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  t ){ .    return
232a0 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
232b0 2d 3e 61 50 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a  ->aPoslist==0; .
232c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
232d0 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65  urn fts5MultiIte
232e0 72 45 6f 66 28 70 49 74 65 72 2d 3e 70 49 6e 64  rEof(pIter->pInd
232f0 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74  ex, pIter->pMult
23300 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  i);.  }.}../*.**
23310 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
23320 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
23330 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
23340 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 46 74  3Fts5IterNext(Ft
23350 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
23360 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
23370 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
23380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
23390 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63   if( pIter->pDoc
233a0 6c 69 73 74 20 29 7b 0a 20 20 20 20 66 74 73 35  list ){.    fts5
233b0 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
233c0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29  pIter->pDoclist)
233d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
233e0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
233f0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
23400 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
23410 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e  rNext(pIter->pIn
23420 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c  dex, pIter->pMul
23430 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  ti, 0, 0);.  }. 
23440 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
23450 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
23460 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
23470 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
23480 74 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f  t matching term/
23490 72 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20 74  rowid. Used by t
234a0 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64  he fts5vocab mod
234b0 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ule..*/.int sqli
234c0 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53  te3Fts5IterNextS
234d0 63 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65  can(Fts5IndexIte
234e0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
234f0 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65  5Index *p = pIte
23500 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 46 74 73  r->pIndex;.  Fts
23510 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
23520 4d 75 6c 74 69 20 3d 20 70 49 74 65 72 2d 3e 70  Multi = pIter->p
23530 4d 75 6c 74 69 3b 0a 0a 20 20 61 73 73 65 72 74  Multi;..  assert
23540 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
23550 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
23560 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 75 6c  ;.  assert( pMul
23570 74 69 20 29 3b 0a 0a 20 20 66 74 73 35 42 75 66  ti );..  fts5Buf
23580 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
23590 70 6f 73 6c 69 73 74 29 3b 0a 20 20 66 74 73 35  poslist);.  fts5
235a0 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
235b0 20 70 4d 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a   pMulti, 0, 0);.
235c0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
235d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
235e0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
235f0 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b  = &pMulti->aSeg[
23600 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b   pMulti->aFirst[
23610 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
23620 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
23630 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70   && pSeg->term.p
23640 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50  [0]!=FTS5_MAIN_P
23650 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66  REFIX ){.      f
23660 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
23670 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  Seg->pLeaf);.   
23680 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d     pSeg->pLeaf =
23690 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
236a0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
236b0 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
236c0 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
236d0 20 4d 6f 76 65 20 74 68 65 20 64 6f 63 6c 69 73   Move the doclis
236e0 74 2d 69 74 65 72 20 70 61 73 73 65 64 20 61 73  t-iter passed as
236f0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
23700 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ent to the next 
23710 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  .** matching row
23720 69 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  id that occurs a
23730 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63  t or after iMatc
23740 68 2e 20 54 68 65 20 64 65 66 69 6e 69 74 69 6f  h. The definitio
23750 6e 20 6f 66 20 22 61 74 20 0a 2a 2a 20 6f 72 20  n of "at .** or 
23760 61 66 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f  after" depends o
23770 6e 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69  n whether this i
23780 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73  terator iterates
23790 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
237a0 20 0a 2a 2a 20 64 65 73 63 65 6e 64 69 6e 67 20   .** descending 
237b0 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a  rowid order..*/.
237c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
237d0 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 46  DoclistIterNextF
237e0 72 6f 6d 28 46 74 73 35 44 6f 63 6c 69 73 74 49  rom(Fts5DoclistI
237f0 74 65 72 20 2a 70 2c 20 69 36 34 20 69 4d 61 74  ter *p, i64 iMat
23800 63 68 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  ch){.  do{.    i
23810 36 34 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e 69  64 iRowid = p->i
23820 52 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 70  Rowid;.    if( p
23830 2d 3e 62 44 65 73 63 3d 3d 30 20 26 26 20 69 52  ->bDesc==0 && iR
23840 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62  owid>=iMatch ) b
23850 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 2d  reak;.    if( p-
23860 3e 62 44 65 73 63 21 3d 30 20 26 26 20 69 52 6f  >bDesc!=0 && iRo
23870 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72  wid<=iMatch ) br
23880 65 61 6b 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  eak;.    fts5Doc
23890 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 29 3b  listIterNext(p);
238a0 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e 61 50  .  }while( p->aP
238b0 6f 73 6c 69 73 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a  oslist );.}../*.
238c0 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e  ** Move to the n
238d0 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  ext matching row
238e0 69 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  id that occurs a
238f0 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63  t or after iMatc
23900 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69  h. The.** defini
23910 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61  tion of "at or a
23920 66 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e  fter" depends on
23930 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74   whether this it
23940 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a  erator iterates.
23950 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
23960 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  or descending ro
23970 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e  wid order..*/.in
23980 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
23990 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e  rNextFrom(Fts5In
239a0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
239b0 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 69  i64 iMatch){.  i
239c0 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  f( pIter->pDocli
239d0 73 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f  st ){.    fts5Do
239e0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f  clistIterNextFro
239f0 6d 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  m(pIter->pDoclis
23a00 74 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 7d 65  t, iMatch);.  }e
23a10 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c  lse{.    fts5Mul
23a20 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  tiIterNextFrom(p
23a30 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
23a40 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61  ter->pMulti, iMa
23a50 74 63 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  tch);.  }.  retu
23a60 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
23a70 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
23a80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
23a90 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
23aa0 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  owid..*/.i64 sql
23ab0 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69  ite3Fts5IterRowi
23ac0 64 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  d(Fts5IndexIter 
23ad0 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
23ae0 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29  Iter->pDoclist )
23af0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74  {.    return pIt
23b00 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 69 52  er->pDoclist->iR
23b10 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  owid;.  }else{. 
23b20 20 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75     return fts5Mu
23b30 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
23b40 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 7d  er->pMulti);.  }
23b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23b60 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
23b70 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  m..*/.const char
23b80 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65   *sqlite3Fts5Ite
23b90 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49  rTerm(Fts5IndexI
23ba0 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
23bb0 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  *pn){.  int n;. 
23bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
23bd0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74   (const char*)ft
23be0 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
23bf0 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 26  pIter->pMulti, &
23c00 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b  n);.  *pn = n-1;
23c10 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d 3b  .  return &z[1];
23c20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
23c30 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
23c40 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
23c50 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ng a copy of the
23c60 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66   position list f
23c70 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  or.** the curren
23c80 74 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74 20  t entry. Output 
23c90 76 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73 20  variable *pn is 
23ca0 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
23cb0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a  of the buffer .*
23cc0 2a 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72  * in bytes befor
23cd0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
23ce0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
23cf0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f  position list do
23d00 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
23d10 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 62 79  he "number of by
23d20 74 65 73 22 20 76 61 72 69 6e 74 0a 2a 2a 20 66  tes" varint.** f
23d30 69 65 6c 64 20 74 68 61 74 20 73 74 61 72 74 73  ield that starts
23d40 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
23d50 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69  st on disk..*/.i
23d60 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
23d70 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49 6e  erPoslist(Fts5In
23d80 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
23d90 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 69  const u8 **pp, i
23da0 6e 74 20 2a 70 6e 29 7b 0a 20 20 61 73 73 65 72  nt *pn){.  asser
23db0 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
23dc0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
23dd0 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  );.  if( pIter->
23de0 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  pDoclist ){.    
23df0 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 44 6f  *pn = pIter->pDo
23e00 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c 69 73 74 3b  clist->nPoslist;
23e10 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72  .    *pp = pIter
23e20 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50 6f 73  ->pDoclist->aPos
23e30 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  list;.  }else{. 
23e40 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20     Fts5Index *p 
23e50 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b  = pIter->pIndex;
23e60 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a  .    fts5BufferZ
23e70 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ero(&pIter->posl
23e80 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 4d 75  ist);.    fts5Mu
23e90 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70  ltiIterPoslist(p
23ea0 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c  , pIter->pMulti,
23eb0 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c   0, &pIter->posl
23ec0 69 73 74 29 3b 0a 20 20 20 20 2a 70 6e 20 3d 20  ist);.    *pn = 
23ed0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e  pIter->poslist.n
23ee0 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65  ;.    *pp = pIte
23ef0 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
23f00 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  }.  return fts5I
23f10 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
23f20 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
23f30 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65  .** Close an ite
23f40 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  rator opened by 
23f50 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
23f60 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  to sqlite3Fts5In
23f70 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76  dexQuery()..*/.v
23f80 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49  oid sqlite3Fts5I
23f90 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64  terClose(Fts5Ind
23fa0 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
23fb0 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20    if( pIter ){. 
23fc0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44     if( pIter->pD
23fd0 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oclist ){.      
23fe0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
23ff0 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 29  er->pDoclist->a)
24000 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24010 66 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f 63  free(pIter->pDoc
24020 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  list);.    }else
24030 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  {.      fts5Mult
24040 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d  iIterFree(pIter-
24050 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e  >pIndex, pIter->
24060 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66  pMulti);.      f
24070 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
24080 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75  ase(pIter->pStru
24090 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  ct);.      fts5B
240a0 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
240b0 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
240c0 7d 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52  }.    fts5CloseR
240d0 65 61 64 65 72 28 70 49 74 65 72 2d 3e 70 49 6e  eader(pIter->pIn
240e0 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
240f0 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20  3_free(pIter);. 
24100 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
24110 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20   the "averages" 
24120 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
24130 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20  buffer supplied 
24140 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
24150 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  * argument. Retu
24160 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
24170 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
24180 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
24190 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72  ode.** if an err
241a0 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  or occurs..*/.in
241b0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
241c0 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74  exGetAverages(Ft
241d0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
241e0 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20  Buffer *pBuf){. 
241f0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
24200 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
24210 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66  ts5DataReadOrBuf
24220 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46 54 53  fer(p, pBuf, FTS
24230 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
24240 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
24250 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
24260 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  }../*.** Replace
24270 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61 76   the current "av
24280 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 77  erages" record w
24290 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
242a0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a   of the buffer .
242b0 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20 74  ** supplied as t
242c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
242d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
242e0 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76  e3Fts5IndexSetAv
242f0 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
24300 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70   *p, const u8 *p
24310 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
24320 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
24330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
24340 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
24350 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  p, FTS5_AVERAGES
24360 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e  _ROWID, pData, n
24370 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
24380 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
24390 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
243a0 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
243b0 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74  mber of blocks t
243c0 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 72  his module has r
243d0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
243e0 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e  ata.** table sin
243f0 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65  ce it was create
24400 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
24410 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28  3Fts5IndexReads(
24420 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
24430 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64   return p->nRead
24440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
24450 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65  he 32-bit cookie
24460 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61 74   value stored at
24470 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 6c   the start of al
24480 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  l structure .** 
24490 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 76  records to the v
244a0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
244b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
244c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  nt..**.** Return
244d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
244e0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
244f0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
24500 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  e if an error.**
24510 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20   occurs..*/.int 
24520 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
24530 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e  SetCookie(Fts5In
24540 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77  dex *p, int iNew
24550 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
24580 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
24590 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
245a0 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 20  g = p->pConfig; 
245b0 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
245c0 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
245d0 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20  u8 aCookie[4];  
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 72       /* Binary r
24600 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
24610 20 69 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65   iNew */..  asse
24620 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
24630 45 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71 6c 69 74  E_OK );..  sqlit
24640 65 33 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f  e3Fts5Put32(aCoo
24650 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 20 20 73 71  kie, iNew);.  sq
24660 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
24670 62 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  b = 0;.  rc = sq
24680 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
24690 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f  pConfig->db, pCo
246a0 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44  nfig->zDb, p->zD
246b0 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 22  ataTbl, .      "
246c0 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54 52  block", FTS5_STR
246d0 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31 2c  UCTURE_ROWID, 1,
246e0 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69   &pBlob.  );.  i
246f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
24710 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62  blob_write(pBlob
24720 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29  , aCookie, 4, 0)
24730 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
24740 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42  e3_blob_close(pB
24750 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  lob);.  }..  ret
24760 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73  urn rc;.}..int s
24770 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c  qlite3Fts5IndexL
24780 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49 6e  oadConfig(Fts5In
24790 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53  dex *p){.  Fts5S
247a0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
247b0 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  t;.  pStruct = f
247c0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
247d0 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  (p);.  fts5Struc
247e0 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
247f0 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  uct);.  return f
24800 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
24810 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  );.}.../********
24820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24860 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
24870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
248a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
248b0 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74  Below this point
248c0 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   is the implemen
248d0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e  tation of the in
248e0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a 2a  tegrity-check .*
248f0 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e  * functionality.
24900 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
24910 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63 6b  n a simple check
24920 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64 20  sum value based 
24930 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  on the arguments
24940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20  ..*/.static u64 
24950 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  fts5IndexEntryCk
24960 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77 69  sum(.  i64 iRowi
24970 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20  d, .  int iCol, 
24980 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20  .  int iPos, .  
24990 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73  int iIdx,.  cons
249a0 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a 20  t char *pTerm,. 
249b0 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20   int nTerm.){.  
249c0 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74  int i;.  u64 ret
249d0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74   = iRowid;.  ret
249e0 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69   += (ret<<3) + i
249f0 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  Col;.  ret += (r
24a00 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20  et<<3) + iPos;. 
24a10 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20 72   if( iIdx>=0 ) r
24a20 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
24a30 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46   (FTS5_MAIN_PREF
24a40 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66 6f  IX + iIdx);.  fo
24a50 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
24a60 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74  i++) ret += (ret
24a70 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b  <<3) + pTerm[i];
24a80 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
24a90 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
24aa0 73 35 42 74 72 65 65 49 74 65 72 49 6e 69 74 28  s5BtreeIterInit(
24ab0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
24ac0 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72   .  Fts5Structur
24ad0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
24ae0 0a 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72  .  Fts5BtreeIter
24af0 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69 6e 74   *pIter.){.  int
24b00 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
24b10 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
24b20 66 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  f(pIter->aLvl[0]
24b30 29 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65 69 67  ) * (pSeg->nHeig
24b40 68 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ht-1);.  memset(
24b50 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
24b60 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 69 66 28  (*pIter));.  if(
24b70 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 70 49   nByte ){.    pI
24b80 74 65 72 2d 3e 61 4c 76 6c 20 3d 20 28 46 74 73  ter->aLvl = (Fts
24b90 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 2a  5BtreeIterLevel*
24ba0 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
24bb0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
24bc0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
24bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65  E_OK ){.    pIte
24be0 72 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65 67 2d 3e  r->nLvl = pSeg->
24bf0 6e 48 65 69 67 68 74 2d 31 3b 0a 20 20 20 20 70  nHeight-1;.    p
24c00 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a 20 20 20  Iter->p = p;.   
24c10 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
24c20 53 65 67 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Seg;.  }.  for(i
24c30 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
24c40 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d  E_OK && i<pIter-
24c50 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
24c60 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54   i64 iRowid = FT
24c70 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
24c80 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69  (pSeg->iSegid, i
24c90 2b 31 2c 20 31 29 3b 0a 20 20 20 20 46 74 73 35  +1, 1);.    Fts5
24ca0 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
24cb0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e   pIter->aLvl[i].
24cc0 70 44 61 74 61 20 3d 20 70 44 61 74 61 20 3d 20  pData = pData = 
24cd0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
24ce0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  iRowid);.    if(
24cf0 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
24d00 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
24d10 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61  (pData->p, pData
24d20 2d 3e 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c 76  ->n, &pIter->aLv
24d30 6c 5b 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a 20  l[i].s);.    }. 
24d40 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d   }..  if( pIter-
24d50 3e 6e 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72  >nLvl==0 || p->r
24d60 63 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  c ){.    pIter->
24d70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 49  bEof = 1;.    pI
24d80 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53 65  ter->iLeaf = pSe
24d90 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d  g->pgnoLast;.  }
24da0 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
24db0 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d  >nEmpty = pIter-
24dc0 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74  >aLvl[0].s.nEmpt
24dd0 79 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  y;.    pIter->iL
24de0 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  eaf = pIter->aLv
24df0 6c 5b 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20  l[0].s.iChild;. 
24e00 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78     pIter->bDlidx
24e10 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30   = pIter->aLvl[0
24e20 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a  ].s.bDlidx;.  }.
24e30 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
24e40 74 73 35 42 74 72 65 65 49 74 65 72 4e 65 78 74  ts5BtreeIterNext
24e50 28 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a  (Fts5BtreeIter *
24e60 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e  pIter){.  Fts5In
24e70 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e  dex *p = pIter->
24e80 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  p;.  int i;..  a
24e90 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45  ssert( pIter->bE
24ea0 6f 66 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  of==0 && pIter->
24eb0 61 4c 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61 20  aLvl[0].s.aData 
24ec0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
24ed0 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20 70  pIter->nLvl && p
24ee0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  ->rc==SQLITE_OK;
24ef0 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42   i++){.    Fts5B
24f00 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70  treeIterLevel *p
24f10 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
24f20 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e  vl[i];.    fts5N
24f30 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e  odeIterNext(&p->
24f40 72 63 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20  rc, &pLvl->s);. 
24f50 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e 61     if( pLvl->s.a
24f60 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74  Data ){.      ft
24f70 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
24f80 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
24f90 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e  , pLvl->s.term.n
24fa0 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70  , pLvl->s.term.p
24fb0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
24fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24fd0 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65   fts5NodeIterFre
24fe0 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20  e(&pLvl->s);.   
24ff0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
25000 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b  se(pLvl->pData);
25010 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61  .      pLvl->pDa
25020 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ta = 0;.    }.  
25030 7d 0a 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72  }.  if( i==pIter
25040 2d 3e 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63 20  ->nLvl || p->rc 
25050 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45  ){.    pIter->bE
25060 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
25070 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20  .    int iSegid 
25080 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69  = pIter->pSeg->i
25090 53 65 67 69 64 3b 0a 20 20 20 20 66 6f 72 28 69  Segid;.    for(i
250a0 2d 2d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  --; i>=0; i--){.
250b0 20 20 20 20 20 20 46 74 73 35 42 74 72 65 65 49        Fts5BtreeI
250c0 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  terLevel *pLvl =
250d0 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d   &pIter->aLvl[i]
250e0 3b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  ;.      i64 iRow
250f0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
25100 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
25110 69 2b 31 2c 20 70 4c 76 6c 5b 31 5d 2e 73 2e 69  i+1, pLvl[1].s.i
25120 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 70 4c  Child);.      pL
25130 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
25140 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
25150 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
25160 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20  Lvl->pData ){.  
25170 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74        fts5NodeIt
25180 65 72 49 6e 69 74 28 70 4c 76 6c 2d 3e 70 44 61  erInit(pLvl->pDa
25190 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e 70 44 61  ta->p, pLvl->pDa
251a0 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d 3e 73 29  ta->n, &pLvl->s)
251b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
251c0 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 6e 45    }..  pIter->nE
251d0 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c  mpty = pIter->aL
251e0 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a  vl[0].s.nEmpty;.
251f0 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20    pIter->bDlidx 
25200 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  = pIter->aLvl[0]
25210 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 70 49 74  .s.bDlidx;.  pIt
25220 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74 65  er->iLeaf = pIte
25230 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68  r->aLvl[0].s.iCh
25240 69 6c 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ild;.}..static v
25250 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65  oid fts5BtreeIte
25260 72 46 72 65 65 28 46 74 73 35 42 74 72 65 65 49  rFree(Fts5BtreeI
25270 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
25280 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
25290 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
252a0 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74  i++){.    Fts5Bt
252b0 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c  reeIterLevel *pL
252c0 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
252d0 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f  l[i];.    fts5No
252e0 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c  deIterFree(&pLvl
252f0 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ->s);.    if( pL
25300 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20  vl->pData ){.   
25310 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
25320 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b  se(pLvl->pData);
25330 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61  .      pLvl->pDa
25340 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ta = 0;.    }.  
25350 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
25360 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a 20  (pIter->aLvl);. 
25370 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
25380 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d  &pIter->term);.}
25390 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
253a0 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20  ction is purely 
253b0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
253c0 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
253d0 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
253e0 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
253f0 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
25400 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
25410 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
25420 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65  * Instead, it te
25430 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d  sts that the sam
25440 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f  e set of pgno/ro
25450 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  wid combinations
25460 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64   are .** visited
25470 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
25480 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69  hether the docli
25490 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66  st-index identif
254a0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
254b0 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61  s.** iSegid/iLea
254c0 66 20 69 73 20 69 74 65 72 61 74 65 64 20 69 6e  f is iterated in
254d0 20 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76   forwards or rev
254e0 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  erse order..*/.#
254f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
25500 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  UG.static void f
25510 74 73 35 44 6c 69 64 78 49 74 65 72 54 65 73 74  ts5DlidxIterTest
25520 52 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49  Reverse(.  Fts5I
25530 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20  ndex *p, .  int 
25540 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
25550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25560 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61  egment id to loa
25570 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
25580 69 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  iLeaf           
25590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
255a0 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  oad doclist-inde
255b0 78 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20  x for this leaf 
255c0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  */.){.  Fts5Dlid
255d0 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
255e0 30 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20  0;.  u64 cksum1 
255f0 3d 20 31 33 3b 0a 20 20 75 36 34 20 63 6b 73 75  = 13;.  u64 cksu
25600 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28  m2 = 13;..  for(
25610 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
25620 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69  IterInit(p, 0, i
25630 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20  Segid, iLeaf);. 
25640 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
25650 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
25660 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44  ==0;.      fts5D
25670 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20  lidxIterNext(p, 
25680 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20  pDlidx).  ){.   
25690 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
256a0 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
256b0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e  (pDlidx);.    in
256c0 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  t pgno = fts5Dli
256d0 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
256e0 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  x);.    assert( 
256f0 70 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20  pgno>iLeaf );.  
25700 20 20 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77    cksum1 += iRow
25710 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c  id + ((i64)pgno<
25720 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  <32);.  }.  fts5
25730 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44  DlidxIterFree(pD
25740 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20  lidx);.  pDlidx 
25750 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69  = 0;..  for(pDli
25760 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
25770 49 6e 69 74 28 70 2c 20 31 2c 20 69 53 65 67 69  Init(p, 1, iSegi
25780 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20  d, iLeaf);.     
25790 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
257a0 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b  f(p, pDlidx)==0;
257b0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
257c0 49 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69  IterPrev(p, pDli
257d0 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  dx).  ){.    i64
257e0 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c   iRowid = fts5Dl
257f0 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
25800 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67  idx);.    int pg
25810 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  no = fts5DlidxIt
25820 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
25830 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
25840 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
25850 6c 69 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20  lidx)>iLeaf );. 
25860 20 20 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f     cksum2 += iRo
25870 77 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f  wid + ((i64)pgno
25880 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73  <<32);.  }.  fts
25890 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
258a0 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78  Dlidx);.  pDlidx
258b0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
258c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
258d0 20 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20   cksum1!=cksum2 
258e0 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
258f0 4f 52 52 55 50 54 3b 0a 7d 0a 23 65 6c 73 65 0a  ORRUPT;.}.#else.
25900 23 20 64 65 66 69 6e 65 20 66 74 73 35 44 6c 69  # define fts5Dli
25910 64 78 49 74 65 72 54 65 73 74 52 65 76 65 72 73  dxIterTestRevers
25920 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  e(x,y,z).#endif.
25930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
25940 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
25950 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46  heckSegment(.  F
25960 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25980 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
25990 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
259a0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
259b0 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65  *pSeg      /* Se
259c0 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
259d0 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
259e0 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ncy */.){.  Fts5
259f0 42 74 72 65 65 49 74 65 72 20 69 74 65 72 3b 20  BtreeIter iter; 
25a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
25a10 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
25a20 68 72 6f 75 67 68 20 62 2d 74 72 65 65 20 68 69  hrough b-tree hi
25a30 65 72 61 72 63 68 79 20 2a 2f 0a 0a 20 20 69 66  erarchy */..  if
25a40 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ( pSeg->pgnoFirs
25a50 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  t==0 ) return;..
25a60 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
25a70 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65 20  ough the b-tree 
25a80 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20  hierarchy.  */. 
25a90 20 66 6f 72 28 66 74 73 35 42 74 72 65 65 49 74   for(fts5BtreeIt
25aa0 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20  erInit(p, pSeg, 
25ab0 26 69 74 65 72 29 3b 0a 20 20 20 20 20 20 70 2d  &iter);.      p-
25ac0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
25ad0 26 20 69 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a  & iter.bEof==0;.
25ae0 20 20 20 20 20 20 66 74 73 35 42 74 72 65 65 49        fts5BtreeI
25af0 74 65 72 4e 65 78 74 28 26 69 74 65 72 29 0a 20  terNext(&iter). 
25b00 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
25b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25b20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
25b30 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
25b40 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
25b50 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
25b60 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68    /* Data for th
25b70 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69  is leaf */.    i
25b80 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20  nt iOff;        
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ba0 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
25bb0 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a  term on leaf */.
25bc0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
25bf0 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6d 70  rate through emp
25c00 74 79 20 6c 65 61 76 65 73 20 2a 2f 0a 0a 20 20  ty leaves */..  
25c10 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66    /* If the leaf
25c20 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73   in question has
25c30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72   already been tr
25c40 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73  immed from the s
25c50 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20  egment, .    ** 
25c60 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72  ignore this b-tr
25c70 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77  ee entry. Otherw
25c80 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74  ise, load it int
25c90 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20  o memory. */.   
25ca0 20 69 66 28 20 69 74 65 72 2e 69 4c 65 61 66 3c   if( iter.iLeaf<
25cb0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
25cc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25cd0 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d  iRow = FTS5_SEGM
25ce0 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
25cf0 69 53 65 67 69 64 2c 20 30 2c 20 69 74 65 72 2e  iSegid, 0, iter.
25d00 69 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61  iLeaf);.    pLea
25d10 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
25d20 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69  (p, iRow);.    i
25d30 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72  f( pLeaf==0 ) br
25d40 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  eak;..    /* Che
25d50 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66  ck that the leaf
25d60 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
25d70 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64  st one term, and
25d80 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75 61   that it is equa
25d90 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c  l.    ** to or l
25da0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
25db0 70 6c 69 74 2d 6b 65 79 20 69 6e 20 69 74 65 72  plit-key in iter
25dc0 2e 74 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65  .term.  Also che
25dd0 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ck that if there
25de0 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20  .    ** is also 
25df0 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20  a rowid pointer 
25e00 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20  within the leaf 
25e10 70 61 67 65 20 68 65 61 64 65 72 2c 20 69 74 20  page header, it 
25e20 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20  points to a.    
25e30 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ** location befo
25e40 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f  re the term.  */
25e50 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35  .    iOff = fts5
25e60 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
25e70 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4f  [2]);.    if( iO
25e80 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ff==0 ){.      p
25e90 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
25ea0 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UPT;.    }else{.
25eb0 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
25ec0 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Off;.      int n
25ed0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
25ee0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
25ef0 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69  f term on leaf i
25f00 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
25f10 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
25f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f30 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65  Comparison of te
25f40 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79  rm and split-key
25f50 20 2a 2f 0a 0a 20 20 20 20 20 20 69 52 6f 77 69   */..      iRowi
25f60 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  dOff = fts5GetU1
25f70 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b  6(&pLeaf->p[0]);
25f80 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69  .      if( iRowi
25f90 64 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20  dOff>=iOff ){.  
25fa0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
25fb0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
25fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25fd0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
25fe0 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
25ff0 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29  >p[iOff], nTerm)
26000 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
26010 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70  memcmp(&pLeaf->p
26020 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72  [iOff], iter.ter
26030 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20  m.p, MIN(nTerm, 
26040 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20  iter.term.n));. 
26050 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d         if( res==
26060 30 20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20  0 ) res = nTerm 
26070 2d 20 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20  - iter.term.n;. 
26080 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30         if( res<0
26090 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
260a0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
260b0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
260c0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
260d0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
260e0 20 29 20 62 72 65 61 6b 3b 0a 0a 0a 20 20 20 20   ) break;...    
260f0 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  /* Now check tha
26100 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74  t the iter.nEmpt
26110 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  y leaves followi
26120 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ng the current l
26130 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65  eaf.    ** (a) e
26140 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  xist and (b) con
26150 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a  tain no terms. *
26160 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 70  /.    for(i=1; p
26170 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
26180 26 26 20 69 3c 3d 69 74 65 72 2e 6e 45 6d 70 74  && i<=iter.nEmpt
26190 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  y; i++){.      p
261a0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
261b0 65 61 64 28 70 2c 20 69 52 6f 77 2b 69 29 3b 0a  ead(p, iRow+i);.
261c0 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
261d0 26 26 20 30 21 3d 66 74 73 35 47 65 74 55 31 36  && 0!=fts5GetU16
261e0 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 20 29  (&pLeaf->p[2]) )
261f0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
26200 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
26210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
26220 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
26230 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  eaf);.    }..   
26240 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
26250 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c  a doclist-index,
26260 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c   check that it l
26270 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20  ooks right. */. 
26280 20 20 20 69 66 28 20 69 74 65 72 2e 62 44 6c 69     if( iter.bDli
26290 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  dx ){.      Fts5
262a0 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
262b0 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69  x = 0;  /* For i
262c0 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
262d0 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a   doclist index *
262e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72 65  /.      int iPre
262f0 76 4c 65 61 66 20 3d 20 69 74 65 72 2e 69 4c 65  vLeaf = iter.iLe
26300 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  af;.      int iS
26310 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65  egid = pSeg->iSe
26320 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  gid;.      int i
26330 50 67 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b  Pg;.      i64 iK
26340 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70  ey;..      for(p
26350 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
26360 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53  terInit(p, 0, iS
26370 65 67 69 64 2c 20 69 74 65 72 2e 69 4c 65 61 66  egid, iter.iLeaf
26380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
26390 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
263a0 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20   pDlidx)==0;.   
263b0 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78         fts5Dlidx
263c0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
263d0 64 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20  dx).      ){..  
263e0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61        /* Check a
263f0 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61  ny rowid-less pa
26400 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62  ges that occur b
26410 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
26420 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20  t leaf. */.     
26430 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76     for(iPg=iPrev
26440 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66 74 73 35  Leaf+1; iPg<fts5
26450 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
26460 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20  lidx); iPg++){. 
26470 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20           iKey = 
26480 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
26490 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20 69 50  ID(iSegid, 0, iP
264a0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  g);.          pL
264b0 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
264c0 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
264d0 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
264e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
264f0 69 66 28 20 66 74 73 35 47 65 74 55 31 36 28 26  if( fts5GetU16(&
26500 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20  pLeaf->p[0])!=0 
26510 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
26520 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
26530 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
26540 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
26550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26560 7d 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4c  }.        iPrevL
26570 65 61 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49  eaf = fts5DlidxI
26580 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
26590 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
265a0 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66  ck that the leaf
265b0 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
265c0 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  by the iterator 
265d0 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20  really does.    
265e0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74      ** contain t
265f0 68 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74  he rowid suggest
26600 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20  ed by the same. 
26610 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  */.        iKey 
26620 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
26630 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20  OWID(iSegid, 0, 
26640 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20 20 20  iPrevLeaf);.    
26650 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
26660 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79  DataRead(p, iKey
26670 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
26680 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
26690 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
266a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
266b0 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  idOff = fts5GetU
266c0 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29  16(&pLeaf->p[0])
266d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 56  ;.          getV
266e0 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b  arint(&pLeaf->p[
266f0 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34  iRowidOff], (u64
26700 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  *)&iRowid);.    
26710 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
26720 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  !=fts5DlidxIterR
26730 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 20 70  owid(pDlidx) ) p
26740 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
26750 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66  UPT;.          f
26760 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
26770 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  Leaf);.        }
26780 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
26790 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61  for(iPg=iPrevLea
267a0 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65 72 2e  f+1; iPg<=(iter.
267b0 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e 45 6d  iLeaf + iter.nEm
267c0 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  pty); iPg++){.  
267d0 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
267e0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
267f0 69 53 65 67 69 64 2c 20 30 2c 20 69 50 67 29 3b  iSegid, 0, iPg);
26800 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d  .        pLeaf =
26810 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
26820 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   iKey);.        
26830 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
26840 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 47         if( fts5G
26850 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
26860 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  0])!=0 ) p->rc =
26870 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
26880 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
26890 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
268a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
268b0 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 44 6c   }..      fts5Dl
268c0 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
268d0 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  dx);.      fts5D
268e0 6c 69 64 78 49 74 65 72 54 65 73 74 52 65 76 65  lidxIterTestReve
268f0 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69  rse(p, iSegid, i
26900 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20  ter.iLeaf);.    
26910 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  }.  }..  /* Eith
26920 65 72 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75  er iter.iLeaf mu
26930 73 74 20 62 65 20 74 68 65 20 72 69 67 68 74 6d  st be the rightm
26940 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69 6e  ost leaf-page in
26950 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 6f 72   the segment, or
26960 20 0a 20 20 2a 2a 20 65 6c 73 65 20 74 68 65 20   .  ** else the 
26970 73 65 67 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  segment has been
26980 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
26990 69 65 64 20 62 79 20 61 6e 20 6f 6e 67 6f 69 6e  ied by an ongoin
269a0 67 20 6d 65 72 67 65 0a 20 20 2a 2a 20 6f 70 65  g merge.  ** ope
269b0 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 69 66 28  ration. */.  if(
269c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
269d0 4b 20 0a 20 20 20 26 26 20 69 74 65 72 2e 69 4c  K .   && iter.iL
269e0 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  eaf!=pSeg->pgnoL
269f0 61 73 74 20 0a 20 20 20 26 26 20 28 70 53 65 67  ast .   && (pSeg
26a00 2d 3e 70 67 6e 6f 46 69 72 73 74 20 7c 7c 20 70  ->pgnoFirst || p
26a10 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 20 0a  Seg->pgnoLast) .
26a20 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d    ){.    p->rc =
26a30 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
26a40 20 7d 0a 0a 20 20 66 74 73 35 42 74 72 65 65 49   }..  fts5BtreeI
26a50 74 65 72 46 72 65 65 28 26 69 74 65 72 29 3b 0a  terFree(&iter);.
26a60 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  }...static int f
26a70 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20  ts5QueryCksum(. 
26a80 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26aa0 20 2f 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f   /* Fts5 index o
26ab0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
26ac0 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Idx,.  const cha
26ad0 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
26ae0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26af0 6b 65 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72  key to query for
26b00 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
26b30 20 69 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79   index key in by
26b40 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  tes */.  int fla
26b50 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
26b60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
26b70 73 20 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51  s for Fts5IndexQ
26b80 75 65 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70  uery */.  u64 *p
26b90 43 6b 73 75 6d 20 20 20 20 20 20 20 20 20 20 20  Cksum           
26ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
26bb0 4f 55 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61  OUT: Checksum va
26bc0 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20  lue */.){.  u64 
26bd0 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b  cksum = *pCksum;
26be0 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
26bf0 20 2a 70 49 64 78 49 74 65 72 20 3d 20 30 3b 0a   *pIdxIter = 0;.
26c00 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
26c10 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
26c20 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c  (p, z, n, flags,
26c30 20 26 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20   &pIdxIter);..  
26c40 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
26c50 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74  E_OK && 0==sqlit
26c60 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
26c70 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20 20 63  dxIter) ){.    c
26c80 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 3b 0a 20  onst u8 *pPos;. 
26c90 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
26ca0 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71 6c   i64 rowid = sql
26cb0 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69  ite3Fts5IterRowi
26cc0 64 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20  d(pIdxIter);.   
26cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
26ce0 35 49 74 65 72 50 6f 73 6c 69 73 74 28 70 49 64  5IterPoslist(pId
26cf0 78 49 74 65 72 2c 20 26 70 50 6f 73 2c 20 26 6e  xIter, &pPos, &n
26d00 50 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Pos);.    if( rc
26d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26d20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
26d30 52 65 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a  Reader sReader;.
26d40 20 20 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65        for(sqlite
26d50 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
26d60 65 72 49 6e 69 74 28 2d 31 2c 20 70 50 6f 73 2c  erInit(-1, pPos,
26d70 20 6e 50 6f 73 2c 20 26 73 52 65 61 64 65 72 29   nPos, &sReader)
26d80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 52 65 61  ;.          sRea
26d90 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20  der.bEof==0;.   
26da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
26db0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e  s5PoslistReaderN
26dc0 65 78 74 28 26 73 52 65 61 64 65 72 29 0a 20 20  ext(&sReader).  
26dd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
26de0 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50  nt iCol = FTS5_P
26df0 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65  OS2COLUMN(sReade
26e00 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  r.iPos);.       
26e10 20 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53 35   int iOff = FTS5
26e20 5f 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65 61  _POS2OFFSET(sRea
26e30 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20  der.iPos);.     
26e40 20 20 20 63 6b 73 75 6d 20 5e 3d 20 66 74 73 35     cksum ^= fts5
26e50 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
26e60 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66  rowid, iCol, iOf
26e70 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a  f, iIdx, z, n);.
26e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
26e90 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74   = sqlite3Fts5It
26ea0 65 72 4e 65 78 74 28 70 49 64 78 49 74 65 72 29  erNext(pIdxIter)
26eb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
26ec0 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
26ed0 73 65 28 70 49 64 78 49 74 65 72 29 3b 0a 0a 20  se(pIdxIter);.. 
26ee0 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d   *pCksum = cksum
26ef0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26f00 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65  ../*.** Run inte
26f10 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65  rnal checks to e
26f20 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46  nsure that the F
26f30 54 53 20 69 6e 64 65 78 20 28 61 29 20 69 73 20  TS index (a) is 
26f40 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63  internally .** c
26f50 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62  onsistent and (b
26f60 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69  ) contains entri
26f70 65 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  es for which the
26f80 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63   XOR of the chec
26f90 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63  ksums.** as calc
26fa0 75 6c 61 74 65 64 20 62 79 20 66 74 73 35 49 6e  ulated by fts5In
26fb0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20  dexEntryCksum() 
26fc0 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  is cksum..**.** 
26fd0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
26fe0 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20  RRUPT if any of 
26ff0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  the internal che
27000 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20  cks fail, or if 
27010 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20  the.** checksum 
27020 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20  does not match. 
27030 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
27040 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70   if all checks p
27050 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65  ass without.** e
27060 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74  rror, or some ot
27070 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72  her SQLite error
27080 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72   code if another
27090 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d   error (e.g. OOM
270a0 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  ).** occurs..*/.
270b0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
270c0 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
270d0 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ck(Fts5Index *p,
270e0 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 75   u64 cksum){.  u
270f0 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20  64 cksum2 = 0;  
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27110 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
27120 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   on contents of 
27130 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 75 36 34  indexes */.  u64
27140 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20 20   cksum3 = 0;    
27150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27160 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  Checksum based o
27170 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  n contents of in
27180 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  dexes */.  Fts5B
27190 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c  uffer term = {0,
271a0 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75  0,0};      /* Bu
271b0 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c  ffer used to hol
271c0 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 74 65  d most recent te
271d0 72 6d 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  rm */.  Fts5Buff
271e0 65 72 20 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c  er poslist = {0,
271f0 30 2c 30 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65  0,0};   /* Buffe
27200 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61  r used to hold a
27210 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74   poslist */.  Ft
27220 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
27230 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 2f 2a  pIter;        /*
27240 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
27250 20 74 68 72 6f 75 67 68 20 65 6e 74 69 72 65 20   through entire 
27260 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53  index */.  Fts5S
27270 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
27280 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t;         /* In
27290 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
272a0 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  .  .  /* Load th
272b0 65 20 46 54 53 20 69 6e 64 65 78 20 73 74 72 75  e FTS index stru
272c0 63 74 75 72 65 20 2a 2f 0a 20 20 70 53 74 72 75  cture */.  pStru
272d0 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
272e0 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a  reRead(p);..  /*
272f0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
27300 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f  internal nodes o
27310 66 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d  f each segment m
27320 61 74 63 68 20 74 68 65 20 6c 65 61 76 65 73 20  atch the leaves 
27330 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  */.  if( pStruct
27340 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
27350 2c 20 69 53 65 67 3b 0a 20 20 20 20 66 6f 72 28  , iSeg;.    for(
27360 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
27370 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
27380 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72  vl++){.      for
27390 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
273a0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
273b0 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
273c0 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
273d0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
273e0 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74  *pSeg = &pStruct
273f0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
27400 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
27410 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65     fts5IndexInte
27420 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e  grityCheckSegmen
27430 74 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20  t(p, pSeg);.    
27440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27450 20 2f 2a 20 54 68 65 20 63 6b 73 75 6d 20 61 72   /* The cksum ar
27460 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
27470 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27480 73 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  s a checksum cal
27490 63 75 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61 73  culated.  ** bas
274a0 65 64 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74  ed on all expect
274b0 65 64 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ed entries in th
274c0 65 20 46 54 53 20 69 6e 64 65 78 20 28 69 6e 63  e FTS index (inc
274d0 6c 75 64 69 6e 67 20 70 72 65 66 69 78 20 69 6e  luding prefix in
274e0 64 65 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73  dex.  ** entries
274f0 29 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 68  ). This block ch
27500 65 63 6b 73 20 74 68 61 74 20 61 20 63 68 65 63  ecks that a chec
27510 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 20  ksum calculated 
27520 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a  based on the.  *
27530 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74  * actual content
27540 73 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 69  s of FTS index i
27550 73 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a  s identical..  *
27560 2a 0a 20 20 2a 2a 20 54 77 6f 20 76 65 72 73 69  *.  ** Two versi
27570 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ons of the same 
27580 63 68 65 63 6b 73 75 6d 20 61 72 65 20 63 61 6c  checksum are cal
27590 63 75 6c 61 74 65 64 2e 20 54 68 65 20 66 69 72  culated. The fir
275a0 73 74 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76  st (stack.  ** v
275b0 61 72 69 61 62 6c 65 20 63 6b 73 75 6d 32 29 20  ariable cksum2) 
275c0 62 61 73 65 64 20 6f 6e 20 65 6e 74 72 69 65 73  based on entries
275d0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
275e0 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
275f0 64 65 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64  dex.  ** while d
27600 6f 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63  oing a linear sc
27610 61 6e 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76  an of each indiv
27620 69 64 75 61 6c 20 69 6e 64 65 78 20 69 6e 20 74  idual index in t
27630 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  urn. .  **.  ** 
27640 41 73 20 65 61 63 68 20 74 65 72 6d 20 76 69 73  As each term vis
27650 69 74 65 64 20 62 79 20 74 68 65 20 6c 69 6e 65  ited by the line
27660 61 72 20 73 63 61 6e 73 2c 20 61 20 73 65 70 61  ar scans, a sepa
27670 72 61 74 65 20 71 75 65 72 79 20 66 6f 72 20 74  rate query for t
27680 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65 72  he.  ** same ter
27690 6d 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  m is performed. 
276a0 63 6b 73 75 6d 33 20 69 73 20 63 61 6c 63 75 6c  cksum3 is calcul
276b0 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
276c0 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65  e entries.  ** e
276d0 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65 73  xtracted by thes
276e0 65 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  e queries..  */.
276f0 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49    for(fts5MultiI
27700 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63  terNew(p, pStruc
27710 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  t, 0, 0, 0, 0, -
27720 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20  1, 0, &pIter);. 
27730 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
27740 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
27750 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
27760 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
27770 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
27780 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  .    int n;     
27790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
277b0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
277c0 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20 20   i64 iPos = 0;  
277d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
277e0 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66 72  Position read fr
277f0 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20  om poslist */.  
27800 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20    int iOff = 0; 
27810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27820 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 70   Offset within p
27830 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 36  oslist */.    i6
27840 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d  4 iRowid = fts5M
27850 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
27860 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ter);.    char *
27870 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d  z = (char*)fts5M
27880 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74  ultiIterTerm(pIt
27890 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 70 6f  er, &n);..    po
278a0 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20  slist.n = 0;.   
278b0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f   fts5MultiIterPo
278c0 73 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20  slist(p, pIter, 
278d0 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20  0, &poslist);.  
278e0 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69    while( 0==sqli
278f0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
27900 78 74 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20  xt64(poslist.p, 
27910 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66  poslist.n, &iOff
27920 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20  , &iPos) ){.    
27930 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53    int iCol = FTS
27940 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f  5_POS2COLUMN(iPo
27950 73 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  s);.      int iT
27960 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53  okOff = FTS5_POS
27970 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a 20  2OFFSET(iPos);. 
27980 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66       cksum2 ^= f
27990 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
279a0 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  um(iRowid, iCol,
279b0 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c   iTokOff, -1, z,
279c0 20 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   n);.    }..    
279d0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
279e0 6e 65 77 20 74 65 72 6d 2c 20 71 75 65 72 79 20  new term, query 
279f0 66 6f 72 20 69 74 2e 20 55 70 64 61 74 65 20 63  for it. Update c
27a00 6b 73 75 6d 33 20 77 69 74 68 20 74 68 65 20 72  ksum3 with the r
27a10 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 69  esults. */.    i
27a20 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
27a30 5f 4f 4b 20 26 26 20 28 74 65 72 6d 2e 6e 21 3d  _OK && (term.n!=
27a40 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 74 65 72 6d  n || memcmp(term
27a50 2e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20  .p, z, n)) ){.  
27a60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27a70 7a 54 65 72 6d 20 3d 20 26 7a 5b 31 5d 3b 20 20  zTerm = &z[1];  
27a80 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 77     /* The term w
27a90 69 74 68 6f 75 74 20 74 68 65 20 70 72 65 66 69  ithout the prefi
27aa0 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 20 20  x-byte */.      
27ab0 69 6e 74 20 6e 54 65 72 6d 20 3d 20 6e 2d 31 3b  int nTerm = n-1;
27ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27ad0 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20  * Size of zTerm 
27ae0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
27af0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 7a 5b    int iIdx = (z[
27b00 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50  0] - FTS5_MAIN_P
27b10 52 45 46 49 58 29 3b 0a 20 20 20 20 20 20 69 6e  REFIX);.      in
27b20 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d  t flags = (iIdx=
27b30 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44  =0 ? 0 : FTS5IND
27b40 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29  EX_QUERY_PREFIX)
27b50 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  ;.      int rc;.
27b60 20 20 20 20 20 20 75 36 34 20 63 6b 31 20 3d 20        u64 ck1 = 
27b70 30 3b 0a 20 20 20 20 20 20 75 36 34 20 63 6b 32  0;.      u64 ck2
27b80 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
27b90 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72  Check that the r
27ba0 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20  esults returned 
27bb0 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45 53 43  for ASC and DESC
27bc0 20 71 75 65 72 69 65 73 20 61 72 65 0a 20 20 20   queries are.   
27bd0 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
27be0 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69  If not, call thi
27bf0 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  s corruption.  *
27c00 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  /.      rc = fts
27c10 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
27c20 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
27c30 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b  m, flags, &ck1);
27c40 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
27c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27c60 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
27c70 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
27c80 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 20 20  Y_DESC;.        
27c90 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
27ca0 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
27cb0 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
27cc0 6b 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  k2);.      }.   
27cd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27ce0 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
27cf0 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
27d00 52 55 50 54 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  RUPT;..      /* 
27d10 49 66 20 74 68 69 73 20 69 73 20 61 20 70 72 65  If this is a pre
27d20 66 69 78 20 71 75 65 72 79 2c 20 63 68 65 63 6b  fix query, check
27d30 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
27d40 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
27d50 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69  e.      ** the i
27d60 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64  ndex is disabled
27d70 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49   are the same. I
27d80 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44  n both ASC and D
27d90 45 53 43 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ESC order. */.  
27da0 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26      if( iIdx>0 &
27db0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
27dc0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
27dd0 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44   = flags|FTS5IND
27de0 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  EX_QUERY_TEST_NO
27df0 49 44 58 3b 0a 20 20 20 20 20 20 20 20 63 6b 32  IDX;.        ck2
27e00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
27e10 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
27e20 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
27e30 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32  , nTerm, f, &ck2
27e40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27e50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27e60 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
27e70 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
27e80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
27e90 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
27ea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27eb0 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
27ec0 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
27ed0 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35  _TEST_NOIDX|FTS5
27ee0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
27ef0 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20  ;.        ck2 = 
27f00 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
27f10 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
27f20 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
27f30 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
27f40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
27f50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
27f60 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
27f70 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
27f80 20 7d 0a 0a 20 20 20 20 20 20 63 6b 73 75 6d 33   }..      cksum3
27f90 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 20 20 66   ^= ck1;.      f
27fa0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63  ts5BufferSet(&rc
27fb0 2c 20 26 74 65 72 6d 2c 20 6e 2c 20 28 63 6f 6e  , &term, n, (con
27fc0 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 20 20 20  st u8*)z);.     
27fd0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
27fe0 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 4d 75 6c   }.  }.  fts5Mul
27ff0 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 49  tiIterFree(p, pI
28000 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ter);..  if( p->
28010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28020 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29   cksum!=cksum2 )
28030 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
28040 52 52 55 50 54 3b 0a 20 20 69 66 28 20 70 2d 3e  RRUPT;.  if( p->
28050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28060 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 33 20 29   cksum!=cksum3 )
28070 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
28080 52 52 55 50 54 3b 0a 0a 20 20 66 74 73 35 53 74  RRUPT;..  fts5St
28090 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
280a0 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 42  Struct);.  fts5B
280b0 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29  ufferFree(&term)
280c0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
280d0 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20  ee(&poslist);.  
280e0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
280f0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f  Return(p);.}.../
28100 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74 65 20 61  *.** Calculate a
28110 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
28120 6b 73 75 6d 20 74 68 61 74 20 69 73 20 74 68 65  ksum that is the
28130 20 58 4f 52 20 6f 66 20 74 68 65 20 69 6e 64 65   XOR of the inde
28140 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68 65 63 6b  x entry.** check
28150 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  sum of all entri
28160 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65  es that would be
28170 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
28180 65 20 74 6f 6b 65 6e 20 73 70 65 63 69 66 69 65  e token specifie
28190 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 69 6e 61  d.** by the fina
281a0 6c 20 35 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  l 5 arguments..*
281b0 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74 73  /.u64 sqlite3Fts
281c0 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a 20 20 46  5IndexCksum(.  F
281d0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
281e0 69 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ig,            /
281f0 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
28200 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20  object */.  i64 
28210 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
28220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28230 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20 61 70 70  ocument term app
28240 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  ears in */.  int
28250 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
28260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28270 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61 70 70 65  Column term appe
28280 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  ars in */.  int 
28290 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
282a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
282b0 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20 61 70 70  osition term app
282c0 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e  ears in */.  con
282d0 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 20  st char *pTerm, 
282e0 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 2f 2a 20  int nTerm    /* 
282f0 54 65 72 6d 20 61 74 20 69 50 6f 73 20 2a 2f 0a  Term at iPos */.
28300 29 7b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 30  ){.  u64 ret = 0
28310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28320 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
28330 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49  alue */.  int iI
28340 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
28350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
28360 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
28370 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 0a 20  gh indexes */.. 
28380 20 72 65 74 20 3d 20 66 74 73 35 49 6e 64 65 78   ret = fts5Index
28390 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69  EntryCksum(iRowi
283a0 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 30  d, iCol, iPos, 0
283b0 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , pTerm, nTerm);
283c0 0a 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20  ..  for(iIdx=0; 
283d0 69 49 64 78 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50  iIdx<pConfig->nP
283e0 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
283f0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
28400 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
28410 54 6f 42 79 74 65 6c 65 6e 28 70 54 65 72 6d 2c  ToBytelen(pTerm,
28420 20 6e 54 65 72 6d 2c 20 70 43 6f 6e 66 69 67 2d   nTerm, pConfig-
28430 3e 61 50 72 65 66 69 78 5b 69 49 64 78 5d 29 3b  >aPrefix[iIdx]);
28440 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
28450 7b 0a 20 20 20 20 20 20 72 65 74 20 5e 3d 20 66  {.      ret ^= f
28460 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
28470 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  um(iRowid, iCol,
28480 20 69 50 6f 73 2c 20 69 49 64 78 2b 31 2c 20 70   iPos, iIdx+1, p
28490 54 65 72 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Term, nByte);.  
284a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
284b0 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  n ret;.}../*****
284c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28500 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
28510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
28550 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f  ** Below this po
28560 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65  int is the imple
28570 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
28580 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 73   fts5_decode() s
28590 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f  calar.** functio
285a0 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  n only..*/../*.*
285b0 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65  * Decode a segme
285c0 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72  nt-data rowid fr
285d0 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
285e0 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
285f0 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70  on is.** the opp
28600 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46  osite of macro F
28610 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
28620 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  D()..*/.static v
28630 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f  oid fts5DecodeRo
28640 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69  wid(.  i64 iRowi
28650 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
28660 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
28670 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c  from %_data tabl
28680 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65  e */.  int *piSe
28690 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
286a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
286b0 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69  egment id */.  i
286c0 6e 74 20 2a 70 62 44 6c 69 64 78 2c 20 20 20 20  nt *pbDlidx,    
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
286e0 2a 20 4f 55 54 3a 20 44 6c 69 64 78 20 66 6c 61  * OUT: Dlidx fla
286f0 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65  g */.  int *piHe
28700 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
28710 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48         /* OUT: H
28720 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  eight */.  int *
28730 70 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20  piPgno          
28740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28750 54 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a  T: Page number *
28760 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d  /.){.  *piPgno =
28770 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
28780 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
28790 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20  _DATA_PAGE_B) - 
287a0 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  1));.  iRowid >>
287b0 3d 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  = FTS5_DATA_PAGE
287c0 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74  _B;..  *piHeight
287d0 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
287e0 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
287f0 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42  S5_DATA_HEIGHT_B
28800 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69  ) - 1));.  iRowi
28810 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
28820 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62  HEIGHT_B;..  *pb
28830 44 6c 69 64 78 20 3d 20 28 69 6e 74 29 28 69 52  Dlidx = (int)(iR
28840 6f 77 69 64 20 26 20 30 78 30 30 30 31 29 3b 0a  owid & 0x0001);.
28850 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
28860 35 5f 44 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20  5_DATA_DLI_B;.. 
28870 20 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74   *piSegid = (int
28880 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
28890 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
288a0 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a  _ID_B) - 1));.}.
288b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
288c0 35 44 65 62 75 67 52 6f 77 69 64 28 69 6e 74 20  5DebugRowid(int 
288d0 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
288e0 20 2a 70 42 75 66 2c 20 69 36 34 20 69 4b 65 79   *pBuf, i64 iKey
288f0 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c  ){.  int iSegid,
28900 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c   iHeight, iPgno,
28910 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20 20 2f   bDlidx;       /
28920 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e  * Rowid compenen
28930 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f  ts */.  fts5Deco
28940 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69  deRowid(iKey, &i
28950 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20  Segid, &bDlidx, 
28960 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f  &iHeight, &iPgno
28970 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64  );..  if( iSegid
28980 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ==0 ){.    if( i
28990 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47  Key==FTS5_AVERAG
289a0 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  ES_ROWID ){.    
289b0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
289c0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
289d0 70 52 63 2c 20 70 42 75 66 2c 20 22 28 61 76 65  pRc, pBuf, "(ave
289e0 72 61 67 65 73 29 20 22 29 3b 0a 20 20 20 20 7d  rages) ");.    }
289f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
28a00 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
28a10 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
28a20 42 75 66 2c 20 22 28 73 74 72 75 63 74 75 72 65  Buf, "(structure
28a30 29 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  )");.    }.  }. 
28a40 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
28a50 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
28a60 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
28a70 75 66 2c 20 22 28 25 73 73 65 67 69 64 3d 25 64  uf, "(%ssegid=%d
28a80 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c   h=%d pgno=%d)",
28a90 0a 20 20 20 20 20 20 20 20 62 44 6c 69 64 78 20  .        bDlidx 
28aa0 3f 20 22 64 6c 69 64 78 20 22 20 3a 20 22 22 2c  ? "dlidx " : "",
28ab0 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74   iSegid, iHeight
28ac0 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20  , iPgno.    );. 
28ad0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
28ae0 64 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63  d fts5DebugStruc
28af0 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ture(.  int *pRc
28b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28b10 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
28b20 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: error code */
28b30 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
28b40 42 75 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63  Buf,.  Fts5Struc
28b50 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74  ture *p.){.  int
28b60 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20   iLvl, iSeg;    
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b80 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
28b90 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73  levels, segments
28ba0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d   */..  for(iLvl=
28bb0 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65  0; iLvl<p->nLeve
28bc0 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
28bd0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
28be0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61  el *pLvl = &p->a
28bf0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
28c00 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
28c10 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
28c20 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20  Rc, pBuf, .     
28c30 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65     " {lvl=%d nMe
28c40 72 67 65 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70  rge=%d", iLvl, p
28c50 4c 76 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20 20 20  Lvl->nMerge.    
28c60 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d  );.    for(iSeg=
28c70 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53  0; iSeg<pLvl->nS
28c80 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
28c90 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
28ca0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
28cb0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
28cc0 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
28cd0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
28ce0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
28cf0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 7b  , .          " {
28d00 69 64 3d 25 64 20 68 3d 25 64 20 6c 65 61 76 65  id=%d h=%d leave
28d10 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67  s=%d..%d}", pSeg
28d20 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e  ->iSegid, pSeg->
28d30 6e 48 65 69 67 68 74 2c 20 0a 20 20 20 20 20 20  nHeight, .      
28d40 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
28d50 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  rst, pSeg->pgnoL
28d60 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ast.      );.   
28d70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
28d80 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
28d90 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
28da0 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  "}");.  }.}../*.
28db0 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20  ** This is part 
28dc0 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
28dd0 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61  de() debugging a
28de0 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  id..**.** Argume
28df0 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20  nts pBlob/nBlob 
28e00 63 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c  contain a serial
28e10 69 7a 65 64 20 46 74 73 35 53 74 72 75 63 74 75  ized Fts5Structu
28e20 72 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a  re object. This.
28e30 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
28e40 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  nds a human-read
28e50 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
28e60 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ion of the same 
28e70 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65  object.** to the
28e80 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 61   buffer passed a
28e90 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
28ea0 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  ument. .*/.stati
28eb0 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
28ec0 65 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  eStructure(.  in
28ed0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ef0 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
28f00 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
28f10 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e  fer *pBuf,.  con
28f20 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e  st u8 *pBlob, in
28f30 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74  t nBlob.){.  int
28f40 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f60 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
28f70 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
28f80 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
28f90 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75   /* Decoded stru
28fa0 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cture object */.
28fb0 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75  .  rc = fts5Stru
28fc0 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f  ctureDecode(pBlo
28fd0 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29  b, nBlob, 0, &p)
28fe0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
28ff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
29000 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  c = rc;.    retu
29010 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  rn;.  }..  fts5D
29020 65 62 75 67 53 74 72 75 63 74 75 72 65 28 70 52  ebugStructure(pR
29030 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66  c, pBuf, p);.  f
29040 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
29050 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ase(p);.}../*.**
29060 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73   Buffer (a/n) is
29070 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
29080 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65  ain a list of se
29090 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73  rialized varints
290a0 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76  . Read.** each v
290b0 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64  arint and append
290c0 20 69 74 73 20 73 74 72 69 6e 67 20 72 65 70 72   its string repr
290d0 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75  esentation to bu
290e0 66 66 65 72 20 70 42 75 66 2e 20 52 65 74 75 72  ffer pBuf. Retur
290f0 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65  n.** after eithe
29100 72 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  r the input buff
29110 65 72 20 69 73 20 65 78 68 61 75 73 74 65 64 20  er is exhausted 
29120 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69 73 20  or a 0 value is 
29130 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  read..**.** The 
29140 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
29150 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
29160 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  tes read from th
29170 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a  e input buffer..
29180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
29190 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
291a0 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75  int *pRc, Fts5Bu
291b0 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73  ffer *pBuf, cons
291c0 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b  t u8 *a, int n){
291d0 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b  .  int iOff = 0;
291e0 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e  .  while( iOff<n
291f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c   ){.    int iVal
29200 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
29210 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
29220 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20  [iOff], iVal);. 
29230 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
29240 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
29250 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64  (pRc, pBuf, " %d
29260 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20  ", iVal);.  }.  
29270 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a  return iOff;.}..
29280 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20  /*.** The start 
29290 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20  of buffer (a/n) 
292a0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61  contains the sta
292b0 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e  rt of a doclist.
292c0 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20   The doclist.** 
292d0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66  may or may not f
292e0 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74 68 65  inish within the
292f0 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75   buffer. This fu
29300 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
29310 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65   text.** represe
29320 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
29330 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  art of the docli
29340 73 74 20 74 68 61 74 20 69 73 20 70 72 65 73 65  st that is prese
29350 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20  nt to buffer.** 
29360 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pBuf. .**.** The
29370 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
29380 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
29390 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ytes read from t
293a0 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e  he input buffer.
293b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
293c0 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
293d0 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
293e0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e  uffer *pBuf, con
293f0 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29  st u8 *a, int n)
29400 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64 3b 0a  {.  i64 iDocid;.
29410 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
29420 0a 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65  .  iOff = sqlite
29430 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  3GetVarint(&a[iO
29440 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 6f 63  ff], (u64*)&iDoc
29450 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  id);.  sqlite3Ft
29460 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
29470 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
29480 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69  " rowid=%lld", i
29490 44 6f 63 69 64 29 3b 0a 20 20 77 68 69 6c 65 28  Docid);.  while(
294a0 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
294b0 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74  nt nPos;.    int
294c0 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69 4f 66   bDummy;.    iOf
294d0 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  f += fts5GetPosl
294e0 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d  istSize(&a[iOff]
294f0 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
29500 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
29510 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
29520 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b 69  (pRc, pBuf, &a[i
29530 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66  Off], MIN(n-iOff
29540 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69 66  , nPos));.    if
29550 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
29560 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
29570 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69      iOff += sqli
29580 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b  te3GetVarint(&a[
29590 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
295a0 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  elta);.      if(
295b0 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65 74   iDelta==0 ) ret
295c0 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  urn iOff;.      
295d0 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61  iDocid += iDelta
295e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
295f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
29600 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
29610 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20   " rowid=%lld", 
29620 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iDocid);.    }. 
29630 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66   }..  return iOf
29640 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f;.}../*.** The 
29650 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
29660 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  f user-defined s
29670 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
29680 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f  ts5_decode()..*/
29690 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
296a0 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28  5DecodeFunction(
296b0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
296c0 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
296d0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
296e0 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
296f0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29710 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
29720 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
29730 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
29740 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
29750 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
29760 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
29770 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
29780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29790 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72 65   /* Rowid for re
297a0 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64  cord being decod
297b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  ed */.  int iSeg
297c0 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f  id,iHeight,iPgno
297d0 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64  ,bDlidx;/* Rowid
297e0 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20   components */. 
297f0 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62   const u8 *aBlob
29800 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20  ; int n;        
29810 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64 65   /* Record to de
29820 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20  code */.  u8 *a 
29830 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65  = 0;.  Fts5Buffe
29840 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  r s;            
29850 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20         /* Build 
29860 75 70 20 74 65 78 74 20 74 6f 20 72 65 74 75 72  up text to retur
29870 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
29880 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
29890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
298a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
298b0 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a  int nSpace = 0;.
298c0 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d  .  assert( nArg=
298d0 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =2 );.  memset(&
298e0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  s, 0, sizeof(Fts
298f0 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f  5Buffer));.  iRo
29900 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
29910 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b  lue_int64(apVal[
29920 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  0]);.  n = sqlit
29930 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
29940 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f  pVal[1]);.  aBlo
29950 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
29960 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29  e_blob(apVal[1])
29970 3b 0a 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20  ;..  nSpace = n 
29980 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  + FTS5_DATA_ZERO
29990 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20  _PADDING;.  a = 
299a0 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35  (u8*)sqlite3Fts5
299b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
299c0 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61  nSpace);.  if( a
299d0 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64  ==0 ) goto decod
299e0 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28  e_out;.  memcpy(
299f0 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 20 20  a, aBlob, n);.  
29a00 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
29a10 69 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64 2c  iRowid, &iSegid,
29a20 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67   &bDlidx, &iHeig
29a30 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
29a40 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26  fts5DebugRowid(&
29a50 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b  rc, &s, iRowid);
29a60 0a 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b  .  if( bDlidx ){
29a70 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 64 6c  .    Fts5Data dl
29a80 69 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  idx;.    Fts5Dli
29a90 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20  dxLvl lvl;..    
29aa0 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20  dlidx.p = a;.   
29ab0 20 64 6c 69 64 78 2e 6e 20 3d 20 6e 3b 0a 20 20   dlidx.n = n;.  
29ac0 20 20 64 6c 69 64 78 2e 6e 52 65 66 20 3d 20 32    dlidx.nRef = 2
29ad0 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c  ;..    memset(&l
29ae0 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
29af0 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
29b00 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64    lvl.pData = &d
29b10 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c  lidx;.    lvl.iL
29b20 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b  eafPgno = iPgno;
29b30 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c  ..    for(fts5Dl
29b40 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29  idxLvlNext(&lvl)
29b50 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66  ; lvl.bEof==0; f
29b60 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
29b70 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71  &lvl)){.      sq
29b80 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
29b90 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
29ba0 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20   &s, .          
29bb0 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c  " %d(%lld)", lvl
29bc0 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e  .iLeafPgno, lvl.
29bd0 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a  iRowid.      );.
29be0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
29bf0 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
29c00 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46     if( iRowid==F
29c10 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
29c20 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74  ID ){.      /* t
29c30 6f 64 6f 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  odo */.    }else
29c40 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f  {.      fts5Deco
29c50 64 65 53 74 72 75 63 74 75 72 65 28 26 72 63 2c  deStructure(&rc,
29c60 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20   &s, a, n);.    
29c70 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  }.  }else{..    
29c80 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
29c90 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72  .    memset(&ter
29ca0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
29cb0 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
29cc0 69 66 28 20 69 48 65 69 67 68 74 3d 3d 30 20 29  if( iHeight==0 )
29cd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72  {.      int iTer
29ce0 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  mOff = 0;.      
29cf0 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20  int iRowidOff = 
29d00 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  0;.      int iOf
29d10 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  f;.      int nKe
29d20 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  ep = 0;..      i
29d30 66 28 20 6e 3e 3d 34 20 29 7b 0a 20 20 20 20 20  f( n>=4 ){.     
29d40 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
29d50 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29  ts5GetU16(&a[0])
29d60 3b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f  ;.        iTermO
29d70 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
29d80 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 65  &a[2]);.      }e
29d90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
29da0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
29db0 74 28 26 72 63 2c 20 26 73 2c 20 38 2c 20 28 63  t(&rc, &s, 8, (c
29dc0 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75 70  onst u8*)"corrup
29dd0 74 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  t");.        got
29de0 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20  o decode_out;.  
29df0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
29e00 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20   iRowidOff ){.  
29e10 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f        iOff = iRo
29e20 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65  widOff;.      }e
29e30 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
29e40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
29e50 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20   = iTermOff;.   
29e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29e70 20 20 69 4f 66 66 20 3d 20 6e 3b 0a 20 20 20 20    iOff = n;.    
29e80 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44 65    }.      fts5De
29e90 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c  codePoslist(&rc,
29ea0 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66   &s, &a[4], iOff
29eb0 2d 34 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  -4);..      asse
29ec0 72 74 28 20 69 52 6f 77 69 64 4f 66 66 3d 3d 30  rt( iRowidOff==0
29ed0 20 7c 7c 20 69 4f 66 66 3d 3d 69 52 6f 77 69 64   || iOff==iRowid
29ee0 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Off );.      if(
29ef0 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20   iRowidOff ){.  
29f00 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
29f10 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28  s5DecodeDoclist(
29f20 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
29f30 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20  ], n-iOff);.    
29f40 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
29f50 74 28 20 69 54 65 72 6d 4f 66 66 3d 3d 30 20 7c  t( iTermOff==0 |
29f60 7c 20 69 4f 66 66 3d 3d 69 54 65 72 6d 4f 66 66  | iOff==iTermOff
29f70 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   );.      while(
29f80 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
29f90 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
29fa0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
29fb0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
29fc0 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  [iOff], nByte);.
29fd0 20 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20          term.n= 
29fe0 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66  nKeep;.        f
29ff0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
2a000 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20  lob(&rc, &term, 
2a010 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29  nByte, &a[iOff])
2a020 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
2a030 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20  = nByte;..      
2a040 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2a050 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2a060 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 72 63  .            &rc
2a070 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a  , &s, " term=%.*
2a080 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e  s", term.n, (con
2a090 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a  st char*)term.p.
2a0a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2a0b0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
2a0c0 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
2a0d0 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
2a0e0 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20  n-iOff);.       
2a0f0 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20   if( iOff<n ){. 
2a100 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
2a110 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2a120 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
2a130 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2a140 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42     }.      fts5B
2a150 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29  ufferFree(&term)
2a160 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a170 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20     Fts5NodeIter 
2a180 73 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 66 74  ss;.      for(ft
2a190 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 61  s5NodeIterInit(a
2a1a0 2c 20 6e 2c 20 26 73 73 29 3b 20 73 73 2e 61 44  , n, &ss); ss.aD
2a1b0 61 74 61 3b 20 66 74 73 35 4e 6f 64 65 49 74 65  ata; fts5NodeIte
2a1c0 72 4e 65 78 74 28 26 72 63 2c 20 26 73 73 29 29  rNext(&rc, &ss))
2a1d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 73  {.        if( ss
2a1e0 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  .term.n==0 ){.  
2a1f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
2a200 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2a210 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22  rintf(&rc, &s, "
2a220 20 6c 65 66 74 3d 25 64 22 2c 20 73 73 2e 69 43   left=%d", ss.iC
2a230 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  hild);.        }
2a240 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a250 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2a260 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
2a270 63 2c 26 73 2c 20 22 20 5c 22 25 2e 2a 73 5c 22  c,&s, " \"%.*s\"
2a280 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
2a290 20 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e    ss.term.n, ss.
2a2a0 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 20 20 20  term.p.         
2a2b0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
2a2c0 20 20 20 20 20 20 69 66 28 20 73 73 2e 6e 45 6d        if( ss.nEm
2a2d0 70 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pty ){.         
2a2e0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2a2f0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
2a300 72 63 2c 20 26 73 2c 20 22 20 65 6d 70 74 79 3d  rc, &s, " empty=
2a310 25 64 25 73 22 2c 20 73 73 2e 6e 45 6d 70 74 79  %d%s", ss.nEmpty
2a320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a330 73 73 2e 62 44 6c 69 64 78 20 3f 20 22 2a 22 20  ss.bDlidx ? "*" 
2a340 3a 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 29  : "".          )
2a350 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a360 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 4e 6f    }.      fts5No
2a370 64 65 49 74 65 72 46 72 65 65 28 26 73 73 29 3b  deIterFree(&ss);
2a380 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 64  .    }.  }.  . d
2a390 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c  ecode_out:.  sql
2a3a0 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
2a3b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a3c0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2a3d0 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
2a3e0 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
2a3f0 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45  s.p, s.n, SQLITE
2a400 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
2a410 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
2a420 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
2a430 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20  ode(pCtx, rc);. 
2a440 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
2a450 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree(&s);.}../*.*
2a460 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
2a470 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
2a480 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
2a490 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28  tion fts5_rowid(
2a4a0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2a4b0 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74  d fts5RowidFunct
2a4c0 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
2a4d0 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
2a4e0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2a4f0 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
2a500 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a520 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a530 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32  f args (always 2
2a540 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) */.  sqlite3_v
2a550 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
2a560 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2a570 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
2a580 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2a590 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72  *zArg;.  if( nAr
2a5a0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  g==0 ){.    sqli
2a5b0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2a5c0 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62  (pCtx, "should b
2a5d0 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75  e: fts5_rowid(su
2a5e0 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d  bject, ....)", -
2a5f0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
2a600 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63   zArg = (const c
2a610 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
2a620 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
2a630 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  );.    if( 0==sq
2a640 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
2a650 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29  rg, "segment") )
2a660 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
2a670 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65  id;.      int se
2a680 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e  gid, height, pgn
2a690 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  o;.      if( nAr
2a6a0 67 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=4 ){.        
2a6b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2a6c0 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
2a6d0 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20          "should 
2a6e0 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27  be: fts5_rowid('
2a6f0 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c  segment', segid,
2a700 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 29 22   height, pgno))"
2a710 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a  , -1.        );.
2a720 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a730 20 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c       segid = sql
2a740 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
2a750 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20  pVal[1]);.      
2a760 20 20 68 65 69 67 68 74 20 3d 20 73 71 6c 69 74    height = sqlit
2a770 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
2a780 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  al[2]);.        
2a790 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76  pgno = sqlite3_v
2a7a0 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 33  alue_int(apVal[3
2a7b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77  ]);.        iRow
2a7c0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
2a7d0 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20 68  T_ROWID(segid, h
2a7e0 65 69 67 68 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  eight, pgno);.  
2a7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
2a800 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
2a810 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
2a820 7d 0a 23 69 66 20 30 0a 20 20 20 20 7d 65 6c 73  }.#if 0.    }els
2a830 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
2a840 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22  _stricmp(zArg, "
2a850 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78 22 29  start-of-index")
2a860 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
2a870 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  owid;.      int 
2a880 69 64 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  idx;.      if( n
2a890 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
2a8a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2a8b0 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
2a8c0 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c            "shoul
2a8d0 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
2a8e0 28 27 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78  ('start-of-index
2a8f0 27 2c 20 69 64 78 29 22 2c 20 2d 31 0a 20 20 20  ', idx)", -1.   
2a900 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65       );.      }e
2a910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 64 78  lse{.        idx
2a920 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2a930 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  _int(apVal[1]);.
2a940 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
2a950 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
2a960 57 49 44 28 69 64 78 2c 20 31 2c 20 30 2c 20 30  WID(idx, 1, 0, 0
2a970 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2a980 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
2a990 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20  pCtx, iRowid);. 
2a9a0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2a9b0 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20    }else {.      
2a9c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2a9d0 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
2a9e0 20 20 20 20 22 66 69 72 73 74 20 61 72 67 20 74      "first arg t
2a9f0 6f 20 66 74 73 35 5f 72 6f 77 69 64 28 29 20 6d  o fts5_rowid() m
2aa00 75 73 74 20 62 65 20 27 73 65 67 6d 65 6e 74 27  ust be 'segment'
2aa10 20 22 0a 20 20 20 20 20 20 20 20 22 6f 72 20 27   ".        "or '
2aa20 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78 27 22  start-of-index'"
2aa30 0a 20 20 20 20 20 20 20 20 2c 20 2d 31 0a 20 20  .        , -1.  
2aa40 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
2aa50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
2aa60 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
2aa70 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67 20   of registering 
2aa80 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20  the FTS5 module 
2aa90 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a  with database.**
2aaa0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20   connection db. 
2aab0 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65 76  It registers sev
2aac0 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65  eral user-define
2aad0 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
2aae0 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74  ns useful.** wit
2aaf0 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66  h FTS5..**.** If
2ab00 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
2ab10 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2ab20 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
2ab30 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68  occurs, some oth
2ab40 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  er.** SQLite err
2ab50 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2ab60 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ned instead..*/.
2ab70 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2ab80 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33  ndexInit(sqlite3
2ab90 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
2aba0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
2abb0 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
2abc0 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64   db, "fts5_decod
2abd0 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  e", 2, SQLITE_UT
2abe0 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64  F8, 0, fts5Decod
2abf0 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a  eFunction, 0, 0.
2ac00 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
2ac10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ac20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
2ac30 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
2ac40 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
2ac50 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49  rowid", -1, SQLI
2ac60 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
2ac70 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  RowidFunction, 0
2ac80 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  , 0.    );.  }. 
2ac90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2aca0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2acb0 45 4e 41 42 4c 45 5f 46 54 53 35 20 2a 2f 0a     ENABLE_FTS5 */.