/ Hex Artifact Content
Login

Artifact 79b8fcf40bee484dc62a7a0ba1f3d8de0a662812:


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 44 61 74 61 20 46 74 73 35 44 61 74 61 3b 0a  5Data Fts5Data;.
2ba0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2bb0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 46 74 73  ts5DlidxIter Fts
2bc0: 35 44 6c 69 64 78 49 74 65 72 3b 0a 74 79 70 65  5DlidxIter;.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 4c 76 6c 20 46 74 73 35 44 6c 69 64  lidxLvl Fts5Dlid
2bf0: 78 4c 76 6c 3b 0a 74 79 70 65 64 65 66 20 73 74  xLvl;.typedef st
2c00: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 57 72  ruct Fts5DlidxWr
2c10: 69 74 65 72 20 46 74 73 35 44 6c 69 64 78 57 72  iter Fts5DlidxWr
2c20: 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  iter;.typedef st
2c30: 72 75 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65  ruct Fts5MultiSe
2c40: 67 49 74 65 72 20 46 74 73 35 4d 75 6c 74 69 53  gIter Fts5MultiS
2c50: 65 67 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  egIter;.typedef 
2c60: 73 74 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49  struct Fts5NodeI
2c70: 74 65 72 20 46 74 73 35 4e 6f 64 65 49 74 65 72  ter Fts5NodeIter
2c80: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2c90: 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
2ca0: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 3b 0a  Fts5PageWriter;.
2cb0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2cc0: 74 73 35 53 65 67 49 74 65 72 20 46 74 73 35 53  ts5SegIter Fts5S
2cd0: 65 67 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  egIter;.typedef 
2ce0: 73 74 72 75 63 74 20 46 74 73 35 44 6f 63 6c 69  struct Fts5Docli
2cf0: 73 74 49 74 65 72 20 46 74 73 35 44 6f 63 6c 69  stIter Fts5Docli
2d00: 73 74 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  stIter;.typedef 
2d10: 73 74 72 75 63 74 20 46 74 73 35 53 65 67 57 72  struct Fts5SegWr
2d20: 69 74 65 72 20 46 74 73 35 53 65 67 57 72 69 74  iter Fts5SegWrit
2d30: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2d40: 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ct Fts5Structure
2d50: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 3b 0a   Fts5Structure;.
2d60: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2d70: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
2d80: 6c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  l Fts5StructureL
2d90: 65 76 65 6c 3b 0a 74 79 70 65 64 65 66 20 73 74  evel;.typedef st
2da0: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
2db0: 72 65 53 65 67 6d 65 6e 74 20 46 74 73 35 53 74  reSegment Fts5St
2dc0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a  ructureSegment;.
2dd0: 0a 73 74 72 75 63 74 20 46 74 73 35 44 61 74 61  .struct Fts5Data
2de0: 20 7b 0a 20 20 75 38 20 2a 70 3b 20 20 20 20 20   {.  u8 *p;     
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2e10: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
2e20: 6e 69 6e 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ning record */. 
2e30: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f   /* Size of reco
2e60: 72 64 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rd in bytes */. 
2e70: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 2f 2a 20 52 65 66 20 63 6f 75 6e 74 20 2a 2f   /* Ref count */
2ea0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f  .};../*.** One o
2eb0: 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74 61  bject per %_data
2ec0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
2ed0: 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20 20  t Fts5Index {.  
2ee0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
2ef0: 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  fig;            
2f00: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
2f10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
2f20: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 54  /.  char *zDataT
2f30: 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bl;             
2f40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 25      /* Name of %
2f50: 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
2f60: 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b 20   int nWorkUnit; 
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20 69   /* Leaf pages i
2f90: 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77 6f  n a "unit" of wo
2fa0: 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  rk */..  /*.  **
2fb0: 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61 74   Variables relat
2fc0: 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d 75  ed to the accumu
2fd0: 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 73  lation of tokens
2fe0: 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77 69   and doclists wi
2ff0: 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  thin the.  ** in
3000: 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
3010: 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79 20  les before they 
3020: 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64  are flushed to d
3030: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73 35  isk..  */.  Fts5
3040: 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20 20  Hash *pHash;    
3050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3060: 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69 6e  ash table for in
3070: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f 0a  -memory data */.
3080: 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e    int nMaxPendin
3090: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
30a0: 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67    /* Max pending
30b0: 20 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c 75   data before flu
30c0: 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  sh to disk */.  
30d0: 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74 61  int nPendingData
30e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30f0: 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 73  /* Current bytes
3100: 20 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74 61   of pending data
3110: 20 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74 65   */.  i64 iWrite
3120: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
3130: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
3140: 6f 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20 62  or current doc b
3150: 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
3160: 20 20 46 74 73 35 42 75 66 66 65 72 20 73 63 72    Fts5Buffer scr
3170: 61 74 63 68 3b 0a 0a 20 20 2f 2a 20 45 72 72 6f  atch;..  /* Erro
3180: 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e  r state. */.  in
3190: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31b0: 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63   Current error c
31c0: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61  ode */..  /* Sta
31d0: 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20 66  te used by the f
31e0: 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75 6e  ts5DataXXX() fun
31f0: 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c  ctions. */.  sql
3200: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64  ite3_blob *pRead
3210: 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er;          /* 
3220: 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65  RO incr-blob ope
3230: 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62 6c  n on %_data tabl
3240: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
3250: 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20 20  tmt *pWriter;   
3260: 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45 52         /* "INSER
3270: 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c  T ... %_data VAL
3280: 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73  UES(?,?)" */.  s
3290: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65  qlite3_stmt *pDe
32a0: 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f  leter;         /
32b0: 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25  * "DELETE FROM %
32c0: 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20  _data ... id>=? 
32d0: 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20  AND id<=?" */.  
32e0: 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20  int nRead;      
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
3310: 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a  of blocks read *
3320: 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73  /.};..struct Fts
3330: 35 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20  5DoclistIter {. 
3340: 20 69 6e 74 20 62 44 65 73 63 3b 20 20 20 20 20   int bDesc;     
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53   /* True for DES
3370: 43 20 6f 72 64 65 72 2c 20 66 61 6c 73 65 20 66  C order, false f
3380: 6f 72 20 41 53 43 20 2a 2f 0a 20 20 75 38 20 2a  or ASC */.  u8 *
3390: 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  a;.  int n;.  in
33a0: 74 20 69 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  t i;..  /* Outpu
33b0: 74 20 76 61 72 69 61 62 6c 65 73 2e 20 61 50 6f  t variables. aPo
33c0: 73 6c 69 73 74 3d 3d 30 20 61 74 20 45 4f 46 20  slist==0 at EOF 
33d0: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  */.  i64 iRowid;
33e0: 0a 20 20 75 38 20 2a 61 50 6f 73 6c 69 73 74 3b  .  u8 *aPoslist;
33f0: 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b  .  int nPoslist;
3400: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .};../*.** Each 
3410: 69 74 65 72 61 74 6f 72 20 75 73 65 64 20 62 79  iterator used by
3420: 20 65 78 74 65 72 6e 61 6c 20 6d 6f 64 75 6c 65   external module
3430: 73 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  s is an instance
3440: 20 6f 66 20 74 68 69 73 20 74 79 70 65 2e 0a 2a   of this type..*
3450: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e 64  /.struct Fts5Ind
3460: 65 78 49 74 65 72 20 7b 0a 20 20 46 74 73 35 49  exIter {.  Fts5I
3470: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
3480: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
3490: 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 4d 75  Struct;.  Fts5Mu
34a0: 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c  ltiSegIter *pMul
34b0: 74 69 3b 0a 20 20 46 74 73 35 44 6f 63 6c 69 73  ti;.  Fts5Doclis
34c0: 74 49 74 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b  tIter *pDoclist;
34d0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f  .  Fts5Buffer po
34e0: 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  slist;          
34f0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
3500: 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20  taining current 
3510: 70 6f 73 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f  poslist */.};../
3520: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
3530: 73 20 6f 66 20 74 68 65 20 22 73 74 72 75 63 74  s of the "struct
3540: 75 72 65 22 20 72 65 63 6f 72 64 20 66 6f 72 20  ure" record for 
3550: 65 61 63 68 20 69 6e 64 65 78 20 61 72 65 20 72  each index are r
3560: 65 70 72 65 73 65 6e 74 65 64 0a 2a 2a 20 75 73  epresented.** us
3570: 69 6e 67 20 61 6e 20 46 74 73 35 53 74 72 75 63  ing an Fts5Struc
3580: 74 75 72 65 20 72 65 63 6f 72 64 20 69 6e 20 6d  ture record in m
3590: 65 6d 6f 72 79 2e 20 57 68 69 63 68 20 75 73 65  emory. Which use
35a0: 73 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  s instances of t
35b0: 68 65 20 0a 2a 2a 20 6f 74 68 65 72 20 46 74 73  he .** other Fts
35c0: 35 53 74 72 75 63 74 75 72 65 58 58 58 20 74 79  5StructureXXX ty
35d0: 70 65 73 20 61 73 20 63 6f 6d 70 6f 6e 65 6e 74  pes as component
35e0: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  s..*/.struct Fts
35f0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
3600: 74 20 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  t {.  int iSegid
3610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3620: 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
3630: 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 65   id */.  int nHe
3640: 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
3650: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67           /* Heig
3660: 68 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d  ht of segment b-
3670: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  tree */.  int pg
3680: 6e 6f 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  noFirst;        
3690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
36a0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
36b0: 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
36c0: 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  /.  int pgnoLast
36d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36e0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66      /* Last leaf
36f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
3700: 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 73 74  segment */.};.st
3710: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
3720: 72 65 4c 65 76 65 6c 20 7b 0a 20 20 69 6e 74 20  reLevel {.  int 
3730: 6e 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20  nMerge;         
3740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3750: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
3760: 73 20 69 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20  s in incr-merge 
3770: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20  */.  int nSeg;  
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3790: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
37a0: 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
37b0: 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 46   on level */.  F
37c0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
37d0: 65 6e 74 20 2a 61 53 65 67 3b 20 20 20 20 20 2f  ent *aSeg;     /
37e0: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d 65  * Array of segme
37f0: 6e 74 73 2e 20 61 53 65 67 5b 30 5d 20 69 73 20  nts. aSeg[0] is 
3800: 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d 3b 0a 73 74  oldest. */.};.st
3810: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
3820: 72 65 20 7b 0a 20 20 75 36 34 20 6e 57 72 69 74  re {.  u64 nWrit
3830: 65 43 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20  eCounter;       
3840: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
3850: 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20 74  leaves written t
3860: 6f 20 6c 65 76 65 6c 20 30 20 2a 2f 0a 20 20 69  o level 0 */.  i
3870: 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20 20 20 20  nt nSegment;    
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3890: 2a 20 54 6f 74 61 6c 20 73 65 67 6d 65 6e 74 73  * Total segments
38a0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
38b0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76  re */.  int nLev
38c0: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
38d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
38e0: 72 20 6f 66 20 6c 65 76 65 6c 73 20 69 6e 20 74  r of levels in t
38f0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46  his index */.  F
3900: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
3910: 6c 20 61 4c 65 76 65 6c 5b 30 5d 3b 20 20 20 2f  l aLevel[0];   /
3920: 2a 20 41 72 72 61 79 20 6f 66 20 6e 4c 65 76 65  * Array of nLeve
3930: 6c 20 6c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20  l level objects 
3940: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3950: 6f 62 6a 65 63 74 20 6f 66 20 74 79 70 65 20 46  object of type F
3960: 74 73 35 53 65 67 57 72 69 74 65 72 20 69 73 20  ts5SegWriter is 
3970: 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  used to write to
3980: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74   segments..*/.st
3990: 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69  ruct Fts5PageWri
39a0: 74 65 72 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f  ter {.  int pgno
39b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
39c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
39d0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
39e0: 70 61 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  page */.  Fts5Bu
39f0: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
3a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3a10: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
3a20: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  age data */.  Ft
3a30: 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a50: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3a60: 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ng previous term
3a70: 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 73   on page */.};.s
3a80: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 57  truct Fts5DlidxW
3a90: 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 70 67  riter {.  int pg
3aa0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
3ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3ac0: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  e number for thi
3ad0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  s page */.  int 
3ae0: 62 50 72 65 76 56 61 6c 69 64 3b 20 20 20 20 20  bPrevValid;     
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3b00: 72 75 65 20 69 66 20 69 50 72 65 76 20 69 73 20  rue if iPrev is 
3b10: 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 69  valid */.  i64 i
3b20: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
3b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
3b40: 65 76 69 6f 75 73 20 64 6f 63 69 64 20 76 61 6c  evious docid val
3b50: 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20 70 61  ue written to pa
3b60: 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ge */.  Fts5Buff
3b70: 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  er buf;         
3b80: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
3b90: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67  r containing pag
3ba0: 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 73 74 72  e data */.};.str
3bb0: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
3bc0: 72 20 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  r {.  int iSegid
3bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3be0: 20 20 20 20 20 20 2f 2a 20 53 65 67 69 64 20 74        /* Segid t
3bf0: 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
3c00: 69 6e 74 20 6e 57 72 69 74 65 72 3b 20 20 20 20  int nWriter;    
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
3c30: 72 69 65 73 20 69 6e 20 61 57 72 69 74 65 72 20  ries in aWriter 
3c40: 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  */.  Fts5PageWri
3c50: 74 65 72 20 2a 61 57 72 69 74 65 72 3b 20 20 20  ter *aWriter;   
3c60: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
3c70: 20 50 61 67 65 57 72 69 74 65 72 20 6f 62 6a 65   PageWriter obje
3c80: 63 74 73 20 2a 2f 0a 20 20 69 36 34 20 69 50 72  cts */.  i64 iPr
3c90: 65 76 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  evRowid;        
3ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
3cb0: 69 6f 75 73 20 64 6f 63 69 64 20 77 72 69 74 74  ious docid writt
3cc0: 65 6e 20 74 6f 20 63 75 72 72 65 6e 74 20 6c 65  en to current le
3cd0: 61 66 20 2a 2f 0a 20 20 75 38 20 62 46 69 72 73  af */.  u8 bFirs
3ce0: 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 3b  tRowidInDoclist;
3cf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3d00: 69 66 20 6e 65 78 74 20 72 6f 77 69 64 20 69 73  if next rowid is
3d10: 20 66 69 72 73 74 20 69 6e 20 64 6f 63 6c 69 73   first in doclis
3d20: 74 20 2a 2f 0a 20 20 75 38 20 62 46 69 72 73 74  t */.  u8 bFirst
3d30: 52 6f 77 69 64 49 6e 50 61 67 65 3b 20 20 20 20  RowidInPage;    
3d40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3d50: 66 20 6e 65 78 74 20 72 6f 77 69 64 20 69 73 20  f next rowid is 
3d60: 66 69 72 73 74 20 69 6e 20 70 61 67 65 20 2a 2f  first in page */
3d70: 0a 20 20 75 38 20 62 46 69 72 73 74 54 65 72 6d  .  u8 bFirstTerm
3d80: 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  InPage;         
3d90: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
3da0: 78 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20  xt term will be 
3db0: 66 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f  first in leaf */
3dc0: 0a 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74  .  int nLeafWrit
3dd0: 74 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ten;            
3de0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3df0: 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74  leaf pages writt
3e00: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70  en */.  int nEmp
3e10: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
3e20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3e30: 72 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20  r of contiguous 
3e40: 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20  term-less nodes 
3e50: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78  */..  int nDlidx
3e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e70: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
3e80: 65 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64  ed size of aDlid
3e90: 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46  x[] array */.  F
3ea0: 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
3eb0: 61 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f  aDlidx;        /
3ec0: 2a 20 41 72 72 61 79 20 6f 66 20 46 74 73 35 44  * Array of Fts5D
3ed0: 6c 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63  lidxWriter objec
3ee0: 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.};../*.** 
3ef0: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
3f00: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
3f10: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
3f20: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
3f30: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
3f40: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 64  ting each term/d
3f50: 6f 63 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  ocid pair in the
3f60: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
3f70: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
3f80: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
3f90: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
3fa0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
3fb0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
3fc0: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
3fd0: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
3fe0: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
3ff0: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4000: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4010: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4020: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4030: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4040: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
4050: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
4060: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
4070: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
4080: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
4090: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
40a0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
40b0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
40c0: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
40d0: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
40e0: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
40f0: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4100: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4110: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4120: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4130: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4140: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4150: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4160: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4170: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4180: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4190: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
41a0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
41b0: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
41c0: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
41d0: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
41e0: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
41f0: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4200: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4210: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4220: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4230: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4240: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4250: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4260: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4270: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4280: 2e 20 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73  . .*/..typedef s
4290: 74 72 75 63 74 20 46 74 73 35 43 52 65 73 75 6c  truct Fts5CResul
42a0: 74 20 46 74 73 35 43 52 65 73 75 6c 74 3b 0a 73  t Fts5CResult;.s
42b0: 74 72 75 63 74 20 46 74 73 35 43 52 65 73 75 6c  truct Fts5CResul
42c0: 74 20 7b 0a 20 20 75 31 36 20 69 46 69 72 73 74  t {.  u16 iFirst
42d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
42e0: 20 20 20 20 20 20 2f 2a 20 61 53 65 67 5b 5d 20        /* aSeg[] 
42f0: 69 6e 64 65 78 20 6f 66 20 66 69 72 73 74 65 73  index of firstes
4300: 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  t iterator */.  
4310: 75 38 20 62 54 65 72 6d 45 71 3b 20 20 20 20 20  u8 bTermEq;     
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
4340: 65 72 6d 73 20 61 72 65 20 65 71 75 61 6c 20 2a  erms are equal *
4350: 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73  /.};..struct Fts
4360: 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 7b 0a  5MultiSegIter {.
4370: 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20    int nSeg;     
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65    /* Size of aSe
43a0: 67 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  g[] array */.  i
43b0: 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43d0: 2a 20 54 72 75 65 20 74 6f 20 69 74 65 72 61 74  * True to iterat
43e0: 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  e in reverse ord
43f0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69  er */.  int bSki
4400: 70 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20  pEmpty;         
4410: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4420: 74 6f 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20  to skip deleted 
4430: 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 46 74 73  entries */.  Fts
4440: 35 53 65 67 49 74 65 72 20 2a 61 53 65 67 3b 20  5SegIter *aSeg; 
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4460: 41 72 72 61 79 20 6f 66 20 73 65 67 6d 65 6e 74  Array of segment
4470: 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   iterators */.  
4480: 46 74 73 35 43 52 65 73 75 6c 74 20 2a 61 46 69  Fts5CResult *aFi
4490: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
44a0: 2f 2a 20 43 75 72 72 65 6e 74 20 6d 65 72 67 65  /* Current merge
44b0: 20 73 74 61 74 65 20 28 73 65 65 20 61 62 6f 76   state (see abov
44c0: 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  e) */.};../*.** 
44d0: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
44e0: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20 73  ting through a s
44f0: 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2c 20 76  ingle segment, v
4500: 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65 72  isiting each ter
4510: 6d 2f 64 6f 63 69 64 0a 2a 2a 20 70 61 69 72 20  m/docid.** pair 
4520: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
4530: 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a 2a 2a 20 20  **.** pSeg:.**  
4540: 20 54 68 65 20 73 65 67 6d 65 6e 74 20 74 6f 20   The segment to 
4550: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 2e  iterate through.
4560: 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 50 67 6e 6f  .**.** iLeafPgno
4570: 3a 0a 2a 2a 20 20 20 43 75 72 72 65 6e 74 20 6c  :.**   Current l
4580: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
4590: 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 2e 0a  within segment..
45a0: 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f 66 66 73 65  **.** iLeafOffse
45b0: 74 3a 0a 2a 2a 20 20 20 42 79 74 65 20 6f 66 66  t:.**   Byte off
45c0: 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 63  set within the c
45d0: 75 72 72 65 6e 74 20 6c 65 61 66 20 74 68 61 74  urrent leaf that
45e0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 62 79   is the first by
45f0: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  te of the .**   
4600: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61  position list da
4610: 74 61 20 28 6f 6e 65 20 62 79 74 65 20 70 61 73  ta (one byte pas
4620: 73 65 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  sed the position
4630: 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
4640: 29 2e 0a 2a 2a 20 20 20 72 6f 77 69 64 20 66 69  )..**   rowid fi
4650: 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  eld of the curre
4660: 6e 74 20 65 6e 74 72 79 2e 20 55 73 75 61 6c 6c  nt entry. Usuall
4670: 79 20 74 68 69 73 20 69 73 20 74 68 65 20 73 69  y this is the si
4680: 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  ze field of the.
4690: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
46a0: 73 74 20 64 61 74 61 2e 20 54 68 65 20 65 78 63  st data. The exc
46b0: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
46c0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
46d0: 75 72 72 65 6e 74 20 65 6e 74 72 79 20 0a 2a 2a  urrent entry .**
46e0: 20 20 20 69 73 20 74 68 65 20 6c 61 73 74 20 74     is the last t
46f0: 68 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 61 66  hing on the leaf
4700: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 4c 65   page..**.** pLe
4710: 61 66 3a 0a 2a 2a 20 20 20 42 75 66 66 65 72 20  af:.**   Buffer 
4720: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65  containing curre
4730: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 64 61 74  nt leaf page dat
4740: 61 2e 20 53 65 74 20 74 6f 20 4e 55 4c 4c 20 61  a. Set to NULL a
4750: 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 54 65  t EOF..**.** iTe
4760: 72 6d 4c 65 61 66 50 67 6e 6f 2c 20 69 54 65 72  rmLeafPgno, iTer
4770: 6d 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20  mLeafOffset:.** 
4780: 20 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62    Leaf page numb
4790: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
47a0: 65 20 6c 61 73 74 20 74 65 72 6d 20 72 65 61 64  e last term read
47b0: 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e   from the segmen
47c0: 74 2e 20 41 6e 64 0a 2a 2a 20 20 20 74 68 65 20  t. And.**   the 
47d0: 6f 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74 65  offset immediate
47e0: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
47f0: 20 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a 2a   term data..**.*
4800: 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20 20 20 4d 61  * flags:.**   Ma
4810: 73 6b 20 6f 66 20 46 54 53 35 5f 53 45 47 49 54  sk of FTS5_SEGIT
4820: 45 52 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49  ER_XXX values. I
4830: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
4840: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46  llows:.**.**   F
4850: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
4860: 45 52 4d 3a 0a 2a 2a 20 20 20 20 20 49 66 20 73  ERM:.**     If s
4870: 65 74 2c 20 73 65 74 20 74 68 65 20 69 74 65 72  et, set the iter
4880: 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  ator to point to
4890: 20 45 4f 46 20 61 66 74 65 72 20 74 68 65 20 63   EOF after the c
48a0: 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 0a  urrent doclist .
48b0: 2a 2a 20 20 20 20 20 68 61 73 20 62 65 65 6e 20  **     has been 
48c0: 65 78 68 61 75 73 74 65 64 2e 20 44 6f 20 6e 6f  exhausted. Do no
48d0: 74 20 70 72 6f 63 65 65 64 20 74 6f 20 74 68 65  t proceed to the
48e0: 20 6e 65 78 74 20 74 65 72 6d 20 69 6e 20 74 68   next term in th
48f0: 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  e segment..**.**
4900: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
4910: 52 45 56 45 52 53 45 3a 0a 2a 2a 20 20 20 20 20  REVERSE:.**     
4920: 54 68 69 73 20 66 6c 61 67 20 69 73 20 6f 6e 6c  This flag is onl
4930: 79 20 65 76 65 72 20 73 65 74 20 69 66 20 46 54  y ever set if FT
4940: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
4950: 52 4d 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20  RM is also set. 
4960: 49 66 0a 2a 2a 20 20 20 20 20 69 74 20 69 73 20  If.**     it is 
4970: 73 65 74 2c 20 69 74 65 72 61 74 65 20 74 68 72  set, iterate thr
4980: 6f 75 67 68 20 64 6f 63 69 64 73 20 69 6e 20 64  ough docids in d
4990: 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  escending order 
49a0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 0a 2a  instead of the.*
49b0: 2a 20 20 20 20 20 64 65 66 61 75 6c 74 20 61 73  *     default as
49c0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
49d0: 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f 66 66 73 65  *.** iRowidOffse
49e0: 74 2f 6e 52 6f 77 69 64 4f 66 66 73 65 74 2f 61  t/nRowidOffset/a
49f0: 52 6f 77 69 64 4f 66 66 73 65 74 3a 0a 2a 2a 20  RowidOffset:.** 
4a00: 20 20 20 20 54 68 65 73 65 20 61 72 65 20 75 73      These are us
4a10: 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53  ed if the FTS5_S
4a20: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66  EGITER_REVERSE f
4a30: 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  lag is set..**.*
4a40: 2a 20 20 20 20 20 46 6f 72 20 65 61 63 68 20 72  *     For each r
4a50: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
4a60: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
4a70: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  o the current te
4a80: 72 6d 2c 20 74 68 65 0a 2a 2a 20 20 20 20 20 63  rm, the.**     c
4a90: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 52 6f  orresponding aRo
4aa0: 77 69 64 4f 66 66 73 65 74 5b 5d 20 65 6e 74 72  widOffset[] entr
4ab0: 79 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  y is set to the 
4ac0: 62 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74  byte offset of t
4ad0: 68 65 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20  he.**     start 
4ae0: 6f 66 20 74 68 65 20 22 70 6f 73 69 74 69 6f 6e  of the "position
4af0: 2d 6c 69 73 74 2d 73 69 7a 65 22 20 66 69 65 6c  -list-size" fiel
4b00: 64 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  d within the pag
4b10: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  e..*/.struct Fts
4b20: 35 53 65 67 49 74 65 72 20 7b 0a 20 20 46 74 73  5SegIter {.  Fts
4b30: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
4b40: 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
4b50: 53 65 67 6d 65 6e 74 20 74 6f 20 69 74 65 72 61  Segment to itera
4b60: 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  te through */.  
4b70: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e 66 69  /* Mask of confi
4ba0: 67 75 72 61 74 69 6f 6e 20 66 6c 61 67 73 20 2a  guration flags *
4bb0: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
4bc0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
4bd0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
4be0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
4bf0: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
4c00: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
4c10: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4c20: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
4c30: 74 73 35 44 61 74 61 20 2a 70 4e 65 78 74 4c 65  ts5Data *pNextLe
4c40: 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  af;            /
4c50: 2a 20 4c 65 61 66 20 70 61 67 65 20 28 69 4c 65  * Leaf page (iLe
4c60: 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a 20 20 69  afPgno+1) */.  i
4c70: 6e 74 20 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  nt iLeafOffset; 
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c90: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69  * Byte offset wi
4ca0: 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61  thin current lea
4cb0: 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 70  f */..  /* The p
4cc0: 61 67 65 20 61 6e 64 20 6f 66 66 73 65 74 20 66  age and offset f
4cd0: 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20 63 75  rom which the cu
4ce0: 72 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 72  rrent term was r
4cf0: 65 61 64 2e 20 54 68 65 20 6f 66 66 73 65 74 20  ead. The offset 
4d00: 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 66 66  .  ** is the off
4d10: 73 65 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  set of the first
4d20: 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 63 75   rowid in the cu
4d30: 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e 20 20  rrent doclist.  
4d40: 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65  */.  int iTermLe
4d50: 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 54  afPgno;.  int iT
4d60: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a  ermLeafOffset;..
4d70: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
4d80: 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64  ng are only used
4d90: 20 69 66 20 74 68 65 20 46 54 53 35 5f 53 45 47   if the FTS5_SEG
4da0: 49 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c 61  ITER_REVERSE fla
4db0: 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69  g is set. */.  i
4dc0: 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b  nt iRowidOffset;
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4de0: 2a 20 43 75 72 72 65 6e 74 20 65 6e 74 72 79 20  * Current entry 
4df0: 69 6e 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  in aRowidOffset[
4e00: 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69  ] */.  int nRowi
4e10: 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  dOffset;        
4e20: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
4e30: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 77  ted size of aRow
4e40: 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79  idOffset[] array
4e50: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69   */.  int *aRowi
4e60: 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  dOffset;        
4e70: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
4e80: 66 20 6f 66 66 73 65 74 20 74 6f 20 72 6f 77 69  f offset to rowi
4e90: 64 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46  d fields */..  F
4ea0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
4eb0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f  lidx;          /
4ec0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
4ed0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f  doclist-index */
4ee0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
4ef0: 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64   populated based
4f00: 20 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72   on current entr
4f10: 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  y. */.  Fts5Buff
4f20: 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  er term;        
4f30: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f40: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34  nt term */.  i64
4f50: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f70: 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f  Current rowid */
4f80: 0a 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20  .  int nPos;    
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4fb0: 62 79 74 65 73 20 69 6e 20 63 75 72 72 65 6e 74  bytes in current
4fc0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
4fd0: 2f 0a 20 20 69 6e 74 20 62 44 65 6c 3b 20 20 20  /.  int bDel;   
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5000: 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69  he delete flag i
5010: 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a 23 64 65  s set */.};..#de
5020: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
5030: 52 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23  R_ONETERM 0x01.#
5040: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49  define FTS5_SEGI
5050: 54 45 52 5f 52 45 56 45 52 53 45 20 30 78 30 32  TER_REVERSE 0x02
5060: 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  .../*.** Object 
5070: 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  for iterating th
5080: 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e 74  rough the conent
5090: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69 6e  s of a single in
50a0: 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 0a  ternal node in .
50b0: 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
50c0: 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65  ruct Fts5NodeIte
50d0: 72 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e 61  r {.  /* Interna
50e0: 6c 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61 67  l. Set and manag
50f0: 65 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49 74  ed by fts5NodeIt
5100: 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  erXXX() function
5110: 73 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a 2a  s. Except, .  **
5120: 20 74 68 65 20 45 4f 46 20 74 65 73 74 20 66 6f   the EOF test fo
5130: 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  r the iterator i
5140: 73 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72 2e  s (Fts5NodeIter.
5150: 61 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a 20  aData==0).  */. 
5160: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
5170: 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20  ;.  int nData;. 
5180: 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f 2a   int iOff;..  /*
5190: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
51a0: 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
51b0: 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 45  r term;.  int nE
51c0: 6d 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68 69  mpty;.  int iChi
51d0: 6c 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78  ld;.  int bDlidx
51e0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ;.};../*.** An i
51f0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5200: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
5210: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5220: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5230: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5240: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5250: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5260: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5270: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5280: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
5290: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
52a0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
52b0: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
52c0: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
52d0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
52e0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
52f0: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5300: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5310: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
5320: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
5330: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5340: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5350: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
5360: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
5370: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5390: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
53a0: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
53b0: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
53d0: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
53e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
53f0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5400: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5410: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
5420: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
5430: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5440: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5470: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5480: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
5490: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
54a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
54b0: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
54c0: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
54d0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
54e0: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
54f0: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5500: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5510: 5b 31 5d 3b 0a 7d 3b 0a 0a 0a 0a 2f 2a 0a 2a 2a  [1];.};..../*.**
5520: 20 41 6e 20 46 74 73 35 42 74 72 65 65 49 74 65   An Fts5BtreeIte
5530: 72 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64  r object is used
5540: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
5550: 75 67 68 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  ugh all entries 
5560: 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65  in the.** b-tree
5570: 20 68 69 65 72 61 72 63 68 79 20 62 65 6c 6f 6e   hierarchy belon
5580: 67 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65  ging to a single
5590: 20 66 74 73 35 20 73 65 67 6d 65 6e 74 2e 20 49   fts5 segment. I
55a0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 0a  n this case the.
55b0: 2a 2a 20 22 62 2d 74 72 65 65 20 68 69 65 72 61  ** "b-tree hiera
55c0: 72 63 68 79 22 20 69 73 20 61 6c 6c 20 62 2d 74  rchy" is all b-t
55d0: 72 65 65 20 6e 6f 64 65 73 20 65 78 63 65 70 74  ree nodes except
55e0: 20 6c 65 61 76 65 73 2e 20 45 61 63 68 20 65 6e   leaves. Each en
55f0: 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d  try in the.** b-
5600: 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20 63  tree hierarchy c
5610: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 66  onsists of the f
5620: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
5630: 20 20 69 4c 65 61 66 3a 20 20 54 68 65 20 70 61    iLeaf:  The pa
5640: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
5650: 20 6c 65 61 66 20 70 61 67 65 20 74 68 65 20 65   leaf page the e
5660: 6e 74 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntry points to..
5670: 2a 2a 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20 20  **.**   term:   
5680: 41 20 73 70 6c 69 74 2d 6b 65 79 20 74 68 61 74  A split-key that
5690: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c 65   all terms on le
56a0: 61 66 20 70 61 67 65 20 24 69 4c 65 61 66 20 6d  af page $iLeaf m
56b0: 75 73 74 20 62 65 20 67 72 65 61 74 65 72 0a 2a  ust be greater.*
56c0: 2a 20 20 20 20 20 20 20 20 20 20 20 74 68 61 6e  *           than
56d0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 2e 20 54 68   or equal to. Th
56e0: 65 20 22 74 65 72 6d 22 20 61 73 73 6f 63 69 61  e "term" associa
56f0: 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
5700: 73 74 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20  st b-tree.**    
5710: 20 20 20 20 20 20 20 68 69 65 72 61 72 63 68 79         hierarchy
5720: 20 65 6e 74 72 79 20 28 74 68 65 20 6f 6e 65 20   entry (the one 
5730: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 6c  that points to l
5740: 65 61 66 20 70 61 67 65 20 31 29 20 69 73 20 61  eaf page 1) is a
5750: 6c 77 61 79 73 20 0a 2a 2a 20 20 20 20 20 20 20  lways .**       
5760: 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72      an empty str
5770: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45 6d  ing..**.**   nEm
5780: 70 74 79 3a 20 54 68 65 20 6e 75 6d 62 65 72 20  pty: The number 
5790: 6f 66 20 65 6d 70 74 79 20 28 74 65 72 6d 6c 65  of empty (termle
57a0: 73 73 29 20 6c 65 61 66 20 70 61 67 65 73 20 74  ss) leaf pages t
57b0: 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  hat immediately.
57c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c  **           fol
57d0: 6c 6f 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a 2a  lowing iLeaf..**
57e0: 0a 2a 2a 20 54 68 65 20 46 74 73 35 42 74 72 65  .** The Fts5Btre
57f0: 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20  eIter object is 
5800: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
5810: 74 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69  t of the integri
5820: 74 79 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a 2a  ty-check code..*
5830: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 42 74 72  /.struct Fts5Btr
5840: 65 65 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20 20  eeIterLevel {.  
5850: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 3b 20  Fts5NodeIter s; 
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
5880: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
5890: 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
58a0: 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
58b0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
58c0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  r the current no
58d0: 64 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  de */.};.struct 
58e0: 46 74 73 35 42 74 72 65 65 49 74 65 72 20 7b 0a  Fts5BtreeIter {.
58f0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20    Fts5Index *p; 
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5910: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
5920: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
5930: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
5940: 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a  nt *pSeg;     /*
5950: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
5960: 20 74 68 69 73 20 73 65 67 6d 65 6e 74 27 73 20   this segment's 
5970: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
5980: 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nLvl;           
5990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
59a0: 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d 20 61 72  ize of aLvl[] ar
59b0: 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 42 74 72  ray */.  Fts5Btr
59c0: 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 61 4c 76  eeIterLevel *aLv
59d0: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65  l;       /* Leve
59e0: 6c 20 66 6f 72 20 65 61 63 68 20 74 69 65 72 20  l for each tier 
59f0: 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20  of b-tree */..  
5a00: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
5a10: 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  les */.  Fts5Buf
5a20: 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
5a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
5a40: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ent term */.  in
5a50: 74 20 69 4c 65 61 66 3b 20 20 20 20 20 20 20 20  t iLeaf;        
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a70: 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e 69 6e 67   Leaf containing
5a80: 20 74 65 72 6d 73 20 3e 3d 20 63 75 72 72 65 6e   terms >= curren
5a90: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  t term */.  int 
5aa0: 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20  nEmpty;         
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5ac0: 75 6d 62 65 72 20 6f 66 20 22 65 6d 70 74 79 22  umber of "empty"
5ad0: 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e   leaves followin
5ae0: 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20 69 6e 74  g iLeaf */.  int
5af0: 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20   bEof;          
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5b10: 53 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 45  Set to true at E
5b20: 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62 44 6c 69  OF */.  int bDli
5b30: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
5b40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5b50: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
5b60: 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b 0a 0a 0a  a dlidx */.};...
5b70: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
5b80: 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75 74 2c  PutU16(u8 *aOut,
5b90: 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f   u16 iVal){.  aO
5ba0: 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38  ut[0] = (iVal>>8
5bb0: 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28  );.  aOut[1] = (
5bc0: 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73  iVal&0xFF);.}..s
5bd0: 74 61 74 69 63 20 75 31 36 20 66 74 73 35 47 65  tatic u16 fts5Ge
5be0: 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a 61  tU16(const u8 *a
5bf0: 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28  In){.  return ((
5c00: 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29  u16)aIn[0] << 8)
5c10: 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a 2f 2a   + aIn[1];.}../*
5c20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
5c30: 70 79 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  py of the sqlite
5c40: 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 72  3GetVarint32() r
5c50: 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74 68 65 20  outine from the 
5c60: 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a 2a 2a 20  SQLite core..** 
5c70: 45 78 63 65 70 74 2c 20 74 68 69 73 20 76 65 72  Except, this ver
5c80: 73 69 6f 6e 20 64 6f 65 73 20 68 61 6e 64 6c 65  sion does handle
5c90: 20 74 68 65 20 73 69 6e 67 6c 65 20 62 79 74 65   the single byte
5ca0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 63   case that the c
5cb0: 6f 72 65 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 64  ore.** version d
5cc0: 65 70 65 6e 64 73 20 6f 6e 20 62 65 69 6e 67 20  epends on being 
5cd0: 68 61 6e 64 6c 65 64 20 62 65 66 6f 72 65 20 69  handled before i
5ce0: 74 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  ts function is c
5cf0: 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  alled..*/.int sq
5d00: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
5d10: 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69 67  nt32(const unsig
5d20: 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33 32  ned char *p, u32
5d30: 20 2a 76 29 7b 0a 20 20 75 33 32 20 61 2c 62 3b   *v){.  u32 a,b;
5d40: 0a 0a 20 20 2f 2a 20 54 68 65 20 31 2d 62 79 74  ..  /* The 1-byt
5d50: 65 20 63 61 73 65 2e 20 4f 76 65 72 77 68 65 6c  e case. Overwhel
5d60: 6d 69 6e 67 6c 79 20 74 68 65 20 6d 6f 73 74 20  mingly the most 
5d70: 63 6f 6d 6d 6f 6e 2e 20 2a 2f 0a 20 20 61 20 3d  common. */.  a =
5d80: 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70 30 20   *p;.  /* a: p0 
5d90: 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20  (unmasked) */.  
5da0: 69 66 20 28 21 28 61 26 30 78 38 30 29 29 0a 20  if (!(a&0x80)). 
5db0: 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73   {.    /* Values
5dc0: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
5dd0: 32 37 20 2a 2f 0a 20 20 20 20 2a 76 20 3d 20 61  27 */.    *v = a
5de0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
5df0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 32 2d    }..  /* The 2-
5e00: 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20 70  byte case */.  p
5e10: 2b 2b 3b 0a 20 20 62 20 3d 20 2a 70 3b 0a 20 20  ++;.  b = *p;.  
5e20: 2f 2a 20 62 3a 20 70 31 20 28 75 6e 6d 61 73 6b  /* b: p1 (unmask
5e30: 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21 28 62  ed) */.  if (!(b
5e40: 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20 20 20  &0x80)).  {.    
5e50: 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77 65 65  /* Values betwee
5e60: 6e 20 31 32 38 20 61 6e 64 20 31 36 33 38 33 20  n 128 and 16383 
5e70: 2a 2f 0a 20 20 20 20 61 20 26 3d 20 30 78 37 66  */.    a &= 0x7f
5e80: 3b 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37 3b 0a  ;.    a = a<<7;.
5e90: 20 20 20 20 2a 76 20 3d 20 61 20 7c 20 62 3b 0a      *v = a | b;.
5ea0: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
5eb0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 33 2d 62 79  }..  /* The 3-by
5ec0: 74 65 20 63 61 73 65 20 2a 2f 0a 20 20 70 2b 2b  te case */.  p++
5ed0: 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34 3b 0a 20  ;.  a = a<<14;. 
5ee0: 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61   a |= *p;.  /* a
5ef0: 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32 20 28 75  : p0<<14 | p2 (u
5f00: 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66  nmasked) */.  if
5f10: 20 28 21 28 61 26 30 78 38 30 29 29 0a 20 20 7b   (!(a&0x80)).  {
5f20: 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 62  .    /* Values b
5f30: 65 74 77 65 65 6e 20 31 36 33 38 34 20 61 6e 64  etween 16384 and
5f40: 20 32 30 39 37 31 35 31 20 2a 2f 0a 20 20 20 20   2097151 */.    
5f50: 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c  a &= (0x7f<<14)|
5f60: 28 30 78 37 66 29 3b 0a 20 20 20 20 62 20 26 3d  (0x7f);.    b &=
5f70: 20 30 78 37 66 3b 0a 20 20 20 20 62 20 3d 20 62   0x7f;.    b = b
5f80: 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20  <<7;.    *v = a 
5f90: 7c 20 62 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  | b;.    return 
5fa0: 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 33  3;.  }..  /* A 3
5fb0: 32 2d 62 69 74 20 76 61 72 69 6e 74 20 69 73 20  2-bit varint is 
5fc0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 73 69  used to store si
5fd0: 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ze information i
5fe0: 6e 20 62 74 72 65 65 73 2e 0a 20 20 2a 2a 20 4f  n btrees..  ** O
5ff0: 62 6a 65 63 74 73 20 61 72 65 20 72 61 72 65 6c  bjects are rarel
6000: 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 32 4d  y larger than 2M
6010: 69 42 20 6c 69 6d 69 74 20 6f 66 20 61 20 33 2d  iB limit of a 3-
6020: 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20 20 2a  byte varint..  *
6030: 2a 20 41 20 33 2d 62 79 74 65 20 76 61 72 69 6e  * A 3-byte varin
6040: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  t is sufficient,
6050: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f   for example, to
6060: 20 72 65 63 6f 72 64 20 74 68 65 20 73 69 7a 65   record the size
6070: 0a 20 20 2a 2a 20 6f 66 20 61 20 31 30 34 38 35  .  ** of a 10485
6080: 36 39 2d 62 79 74 65 20 42 4c 4f 42 20 6f 72 20  69-byte BLOB or 
6090: 73 74 72 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  string..  **.  *
60a0: 2a 20 57 65 20 6f 6e 6c 79 20 75 6e 72 6f 6c 6c  * We only unroll
60b0: 20 74 68 65 20 66 69 72 73 74 20 31 2d 2c 20 32   the first 1-, 2
60c0: 2d 2c 20 61 6e 64 20 33 2d 20 62 79 74 65 20 63  -, and 3- byte c
60d0: 61 73 65 73 2e 20 20 54 68 65 20 76 65 72 79 0a  ases.  The very.
60e0: 20 20 2a 2a 20 72 61 72 65 20 6c 61 72 67 65 72    ** rare larger
60f0: 20 63 61 73 65 73 20 63 61 6e 20 62 65 20 68 61   cases can be ha
6100: 6e 64 6c 65 64 20 62 79 20 74 68 65 20 73 6c 6f  ndled by the slo
6110: 77 65 72 20 36 34 2d 62 69 74 20 76 61 72 69 6e  wer 64-bit varin
6120: 74 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a  t.  ** routine..
6130: 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 36 34    */.  {.    u64
6140: 20 76 36 34 3b 0a 20 20 20 20 75 38 20 6e 3b 0a   v64;.    u8 n;.
6150: 20 20 20 20 70 20 2d 3d 20 32 3b 0a 20 20 20 20      p -= 2;.    
6160: 6e 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61  n = sqlite3GetVa
6170: 72 69 6e 74 28 70 2c 20 26 76 36 34 29 3b 0a 20  rint(p, &v64);. 
6180: 20 20 20 2a 76 20 3d 20 28 75 33 32 29 76 36 34     *v = (u32)v64
6190: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e  ;.    assert( n>
61a0: 33 20 26 26 20 6e 3c 3d 39 20 29 3b 0a 20 20 20  3 && n<=9 );.   
61b0: 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 7d 0a 7d   return n;.  }.}
61c0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
61d0: 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 75 33  5GetVarintLen(u3
61e0: 32 20 69 56 61 6c 29 7b 0a 20 20 69 66 28 20 69  2 iVal){.  if( i
61f0: 56 61 6c 3c 28 31 20 3c 3c 20 37 20 29 20 29 20  Val<(1 << 7 ) ) 
6200: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
6210: 69 56 61 6c 3c 28 31 20 3c 3c 20 31 34 29 20 29  iVal<(1 << 14) )
6220: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
6230: 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32 31 29 20   iVal<(1 << 21) 
6240: 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 69 66  ) return 3;.  if
6250: 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32 38 29  ( iVal<(1 << 28)
6260: 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 72   ) return 4;.  r
6270: 65 74 75 72 6e 20 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 5;.}../*.*
6280: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
6290: 65 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61  eturn a buffer a
62a0: 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79  t least nByte by
62b0: 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
62c0: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
62d0: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
62e0: 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  d, return NULL a
62f0: 6e 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  nd set the error
6300: 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20   code in.** the 
6310: 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
6320: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
6330: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
6340: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66  /.static void *f
6350: 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73  ts5IdxMalloc(Fts
6360: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e  5Index *p, int n
6370: 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Byte){.  return 
6380: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
6390: 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42  cZero(&p->rc, nB
63a0: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  yte);.}../*.** C
63b0: 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
63c0: 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74  nts of the pLeft
63d0: 20 62 75 66 66 65 72 20 77 69 74 68 20 74 68 65   buffer with the
63e0: 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62   pRight/nRight b
63f0: 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lob..**.** Retur
6400: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
6410: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
6420: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
6430: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
6440: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
6450: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
6460: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
6470: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
6480: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
6490: 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63  pRight.*/.static
64a0: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
64b0: 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74  ompareBlob(.  Ft
64c0: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
64e0: 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20   Left hand side 
64f0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
6500: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
6510: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20  ght, int nRight 
6520: 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64     /* Right hand
6530: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
6540: 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
6550: 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74  nCmp = MIN(pLeft
6560: 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20  ->n, nRight);.  
6570: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
6580: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
6590: 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  t, nCmp);.  retu
65a0: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
65b0: 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29  eft->n - nRight)
65c0: 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   : res);.}.../*.
65d0: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63  ** Compare the c
65e0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74  ontents of the t
65f0: 77 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e 67  wo buffers using
6600: 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e   memcmp(). If on
6610: 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20 61  e buffer.** is a
6620: 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
6630: 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73  ther, it is cons
6640: 69 64 65 72 65 64 20 74 68 65 20 6c 65 73 73 65  idered the lesse
6650: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
6660: 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20  -ve if pLeft is 
6670: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69  smaller than pRi
6680: 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61  ght, 0 if they a
6690: 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b  re equal or.** +
66a0: 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20  ve if pRight is 
66b0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65  smaller than pLe
66c0: 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ft. In other wor
66d0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65  ds:.**.**     re
66e0: 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52  s = *pLeft - *pR
66f0: 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ight.*/.static i
6700: 6e 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  nt fts5BufferCom
6710: 70 61 72 65 28 46 74 73 35 42 75 66 66 65 72 20  pare(Fts5Buffer 
6720: 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66 66  *pLeft, Fts5Buff
6730: 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  er *pRight){.  i
6740: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c  nt nCmp = MIN(pL
6750: 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d 3e  eft->n, pRight->
6760: 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  n);.  int res = 
6770: 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c  memcmp(pLeft->p,
6780: 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d 70   pRight->p, nCmp
6790: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73  );.  return (res
67a0: 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20  ==0 ? (pLeft->n 
67b0: 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20 72  - pRight->n) : r
67c0: 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  es);.}..#ifdef S
67d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
67e0: 69 63 20 69 6e 74 20 66 74 73 35 42 6c 6f 62 43  ic int fts5BlobC
67f0: 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20  ompare(.  const 
6800: 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74 20 6e  u8 *pLeft, int n
6810: 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75  Left, .  const u
6820: 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e  8 *pRight, int n
6830: 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 6e  Right.){.  int n
6840: 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66 74 2c  Cmp = MIN(nLeft,
6850: 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74 20   nRight);.  int 
6860: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
6870: 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d 70  ft, pRight, nCmp
6880: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73  );.  return (res
6890: 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d 20 6e  ==0 ? (nLeft - n
68a0: 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d  Right) : res);.}
68b0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
68c0: 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d 6f  Close the read-o
68d0: 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c  nly blob handle,
68e0: 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a   if it is open..
68f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6900: 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 46  ts5CloseReader(F
6910: 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
6920: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29  if( p->pReader )
6930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  {.    sqlite3_bl
6940: 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20 70 2d  ob *pReader = p-
6950: 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 70 2d  >pReader;.    p-
6960: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
6970: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63    sqlite3_blob_c
6980: 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b 0a 20  lose(pReader);. 
6990: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63   }.}../*.** Chec
69a0: 6b 20 69 66 20 72 6f 77 20 69 52 6f 77 69 64 20  k if row iRowid 
69b0: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 25 5f  exists in the %_
69c0: 64 61 74 61 20 74 61 62 6c 65 2c 20 61 6e 64 20  data table, and 
69d0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
69e0: 0a 2a 2a 20 61 20 62 6c 6f 62 20 76 61 6c 75 65  .** a blob value
69f0: 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20  . If so, return 
6a00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 28 79 65  SQLITE_ERROR (ye
6a10: 73 20 2d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  s - SQLITE_ERROR
6a20: 2c 20 6e 6f 74 20 0a 2a 2a 20 53 51 4c 49 54 45  , not .** SQLITE
6a30: 5f 4f 4b 29 2e 20 49 66 20 6e 6f 74 2c 20 72 65  _OK). If not, re
6a40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6a50: 55 50 54 5f 56 54 41 42 2e 0a 2a 2a 0a 2a 2a 20  UPT_VTAB..**.** 
6a60: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6a70: 72 73 20 28 65 2e 67 2e 20 4f 4f 4d 20 6f 72 20  rs (e.g. OOM or 
6a80: 49 4f 45 52 52 29 2c 20 72 65 74 75 72 6e 20 74  IOERR), return t
6a90: 68 65 20 72 65 6c 65 76 61 6e 74 20 65 72 72 6f  he relevant erro
6aa0: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
6ab0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
6ac0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
6ad0: 65 66 66 69 63 69 65 6e 74 2e 20 49 74 20 69 73  efficient. It is
6ae0: 20 70 61 72 74 20 6f 66 20 76 61 72 79 20 72 61   part of vary ra
6af0: 72 65 6c 79 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20  rely.** invoked 
6b00: 65 72 72 6f 72 20 68 61 6e 64 6c 69 6e 67 20 63  error handling c
6b10: 6f 64 65 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ode only..*/.#if
6b20: 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74   0.static int ft
6b30: 73 35 43 68 65 63 6b 4d 69 73 73 69 6e 67 52 6f  s5CheckMissingRo
6b40: 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  wid(Fts5Index *p
6b50: 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
6b60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
6b70: 74 20 3d 20 22 53 45 4c 45 43 54 20 74 79 70 65  t = "SELECT type
6b80: 6f 66 28 62 6c 6f 63 6b 29 3d 3d 27 62 6c 6f 62  of(block)=='blob
6b90: 27 20 46 52 4f 4d 20 27 25 71 27 2e 25 51 20 57  ' FROM '%q'.%Q W
6ba0: 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 3b 0a 20  HERE id=%lld";. 
6bb0: 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20   int bOk = 0;.  
6bc0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
6bd0: 7a 53 71 6c 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  zSql;..  zSql = 
6be0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6bf0: 7a 46 6d 74 2c 20 70 2d 3e 70 43 6f 6e 66 69 67  zFmt, p->pConfig
6c00: 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54  ->zDb, p->zDataT
6c10: 62 6c 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69  bl, iRowid);.  i
6c20: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
6c30: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
6c40: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
6c50: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
6c60: 70 53 74 6d 74 3b 0a 20 20 20 20 72 63 20 3d 20  pStmt;.    rc = 
6c70: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
6c80: 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64  v2(p->pConfig->d
6c90: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
6ca0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
6cb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6cc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
6cd0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
6ce0: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
6cf0: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 73 71 6c         bOk = sql
6d00: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
6d10: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
6d20: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
6d30: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
6d40: 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Stmt);.    }.   
6d50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
6d60: 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ql);.  }..  if( 
6d70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6d80: 0a 20 20 20 20 72 63 20 3d 20 62 4f 6b 20 3f 20  .    rc = bOk ? 
6d90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 46  SQLITE_ERROR : F
6da0: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  TS5_CORRUPT;.  }
6db0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
6dc0: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
6dd0: 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61  Fts5Data *fts5Da
6de0: 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28 0a  taReadOrBuffer(.
6df0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
6e00: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
6e10: 42 75 66 2c 20 0a 20 20 69 36 34 20 69 52 6f 77  Buf, .  i64 iRow
6e20: 69 64 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61  id.){.  Fts5Data
6e30: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
6e40: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
6e50: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
6e60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
6e70: 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65     if( p->pReade
6e80: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  r ){.      /* Th
6e90: 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75  is call may retu
6ea0: 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  rn SQLITE_ABORT 
6eb0: 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
6ec0: 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20  n a savepoint.  
6ed0: 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
6ee0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
6ef0: 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20  t used. In this 
6f00: 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20  case a new blob 
6f10: 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20  handle.      ** 
6f20: 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  is required.  */
6f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
6f40: 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e  lob *pBlob = p->
6f50: 70 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 70  pReader;.      p
6f60: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
6f70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6f80: 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42  3_blob_reopen(pB
6f90: 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  lob, iRowid);.  
6fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
6fb0: 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
6fc0: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
6fd0: 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66 28  pBlob;.      if(
6fe0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6ff0: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 6c  {.        fts5Cl
7000: 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
7010: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7020: 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  rc==SQLITE_ABORT
7030: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
7040: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
7050: 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e   If the blob han
7060: 64 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  dle is not yet o
7070: 70 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65  pen, open and se
7080: 65 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  ek it. Otherwise
7090: 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  , use.    ** the
70a0: 20 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41   blob_reopen() A
70b0: 50 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65  PI to reseek the
70c0: 20 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68   existing blob h
70d0: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  andle.  */.    i
70e0: 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  f( p->pReader==0
70f0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
7100: 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43  K ){.      Fts5C
7110: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
7120: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
7130: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7140: 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
7150: 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20  g->db, .        
7160: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
7170: 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c  p->zDataTbl, "bl
7180: 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c  ock", iRowid, 0,
7190: 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20   &p->pReader.   
71a0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
71b0: 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66   /* If either of
71c0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
71d0: 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69  b_open() or sqli
71e0: 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28  te3_blob_reopen(
71f0: 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61  ) calls.    ** a
7200: 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20 53 51  bove returned SQ
7210: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65 74 75  LITE_ERROR, retu
7220: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7230: 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64 2e 0a  T_VTAB instead..
7240: 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72      ** All the r
7250: 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e  easons those fun
7260: 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72 65 74  ctions might ret
7270: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
7280: 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a   - missing.    *
7290: 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67  * table, missing
72a0: 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74   row, non-blob/t
72b0: 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c  ext in block col
72c0: 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65 20 0a  umn - indicate .
72d0: 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73      ** backing s
72e0: 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  tore corruption.
72f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
7300: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20  =SQLITE_ERROR ) 
7310: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
7320: 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  T;..    if( rc==
7330: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7340: 20 20 20 75 38 20 2a 61 4f 75 74 3b 20 20 20 20     u8 *aOut;    
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7360: 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61 74 61  * Read blob data
7370: 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
7380: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  r */.      int n
7390: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
73a0: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65  lob_bytes(p->pRe
73b0: 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ader);.      if(
73c0: 20 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20   pBuf ){.       
73d0: 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
73e0: 70 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66  pBuf);.        f
73f0: 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 72  ts5BufferGrow(&r
7400: 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  c, pBuf, nByte);
7410: 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20  .        aOut = 
7420: 70 42 75 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20  pBuf->p;.       
7430: 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79 74 65   pBuf->n = nByte
7440: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7450: 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63         int nSpac
7460: 65 20 3d 20 6e 42 79 74 65 20 2b 20 46 54 53 35  e = nByte + FTS5
7470: 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49  _DATA_ZERO_PADDI
7480: 4e 47 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  NG;.        pRet
7490: 20 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71   = (Fts5Data*)sq
74a0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
74b0: 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 2b  ero(&rc, nSpace+
74c0: 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
74d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
74e0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Ret ){.         
74f0: 20 70 52 65 74 2d 3e 6e 20 3d 20 6e 42 79 74 65   pRet->n = nByte
7500: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4f 75 74  ;.          aOut
7510: 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38   = pRet->p = (u8
7520: 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20  *)&pRet[1];.    
7530: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66        pRet->nRef
7540: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
7550: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
7560: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7570: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
7580: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
7590: 61 64 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 61  ad(p->pReader, a
75a0: 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  Out, nByte, 0);.
75b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
75c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
75d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
75e0: 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b 0a 20  e3_free(pRet);. 
75f0: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b         pRet = 0;
7600: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7610: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
7620: 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20     p->nRead++;. 
7630: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
7640: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  t;.}../*.** Retr
7650: 69 65 76 65 20 61 20 72 65 63 6f 72 64 20 66 72  ieve a record fr
7660: 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
7670: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ble..**.** If an
7680: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
7690: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
76a0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65 66  and an error lef
76b0: 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74 73  t in the .** Fts
76c0: 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a  5Index object..*
76d0: 2f 0a 73 74 61 74 69 63 20 46 74 73 35 44 61 74  /.static Fts5Dat
76e0: 61 20 2a 66 74 73 35 44 61 74 61 52 65 61 64 28  a *fts5DataRead(
76f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
7700: 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46 74 73  4 iRowid){.  Fts
7710: 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20 66 74  5Data *pRet = ft
7720: 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66 66  s5DataReadOrBuff
7730: 65 72 28 70 2c 20 30 2c 20 69 52 6f 77 69 64 29  er(p, 0, iRowid)
7740: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 52 65  ;.  assert( (pRe
7750: 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53  t==0)==(p->rc!=S
7760: 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72  QLITE_OK) );.  r
7770: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
7780: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 72 65 63 6f  *.** Read a reco
7790: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
77a0: 74 61 20 74 61 62 6c 65 20 69 6e 74 6f 20 74 68  ta table into th
77b0: 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65  e buffer supplie
77c0: 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f  d as the.** seco
77d0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
77e0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
77f0: 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
7800: 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 46  is left in the F
7810: 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  ts5Index object.
7820: 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   If an.** error 
7830: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
7840: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
7850: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
7860: 64 2c 20 69 74 20 69 73 20 61 20 0a 2a 2a 20 6e  d, it is a .** n
7870: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
7880: 76 6f 69 64 20 66 74 73 35 44 61 74 61 42 75 66  void fts5DataBuf
7890: 66 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70  fer(Fts5Index *p
78a0: 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
78b0: 75 66 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  uf, i64 iRowid){
78c0: 0a 20 20 28 76 6f 69 64 29 66 74 73 35 44 61 74  .  (void)fts5Dat
78d0: 61 52 65 61 64 4f 72 42 75 66 66 65 72 28 70 2c  aReadOrBuffer(p,
78e0: 20 70 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a   pBuf, iRowid);.
78f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
7900: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
7910: 64 61 74 61 20 72 65 63 6f 72 64 20 72 65 74 75  data record retu
7920: 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  rned by an earli
7930: 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74  er call to.** ft
7940: 73 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f  s5DataRead()..*/
7950: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7960: 35 44 61 74 61 52 65 6c 65 61 73 65 28 46 74 73  5DataRelease(Fts
7970: 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20  5Data *pData){. 
7980: 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
7990: 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 2d    assert( pData-
79a0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
79b0: 44 61 74 61 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Data->nRef--;.  
79c0: 20 20 69 66 28 20 70 44 61 74 61 2d 3e 6e 52 65    if( pData->nRe
79d0: 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66  f==0 ) sqlite3_f
79e0: 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 7d 0a  ree(pData);.  }.
79f0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
7a00: 74 73 35 44 61 74 61 52 65 66 65 72 65 6e 63 65  ts5DataReference
7a10: 28 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61  (Fts5Data *pData
7a20: 29 7b 0a 20 20 70 44 61 74 61 2d 3e 6e 52 65 66  ){.  pData->nRef
7a30: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53  ++;.}../*.** INS
7a40: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61  ERT OR REPLACE a
7a50: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
7a60: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
7a70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7a80: 73 35 44 61 74 61 57 72 69 74 65 28 46 74 73 35  s5DataWrite(Fts5
7a90: 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52  Index *p, i64 iR
7aa0: 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  owid, const u8 *
7ab0: 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
7ac0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ){.  if( p->rc!=
7ad0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7ae0: 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57  rn;..  if( p->pW
7af0: 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  riter==0 ){.    
7b00: 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35  int rc;.    Fts5
7b10: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
7b20: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
7b30: 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
7b40: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
7b50: 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
7b60: 20 49 4e 54 4f 20 27 25 71 27 2e 25 51 28 69 64   INTO '%q'.%Q(id
7b70: 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28  , block) VALUES(
7b80: 3f 2c 3f 29 22 2c 20 70 43 6f 6e 66 69 67 2d 3e  ?,?)", pConfig->
7b90: 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
7ba0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
7bb0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
7bc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
7bd0: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
7be0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7bf0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f  3_prepare_v2(pCo
7c00: 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  nfig->db, zSql, 
7c10: 2d 31 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c  -1, &p->pWriter,
7c20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
7c30: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
7c40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
7c50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7c60: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
7c70: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7c80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
7c90: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d  e3_bind_int64(p-
7ca0: 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69 52 6f  >pWriter, 1, iRo
7cb0: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  wid);.  sqlite3_
7cc0: 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72  bind_blob(p->pWr
7cd0: 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61 2c 20  iter, 2, pData, 
7ce0: 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 53 54  nData, SQLITE_ST
7cf0: 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
7d00: 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74 65 72  _step(p->pWriter
7d10: 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  );.  p->rc = sql
7d20: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 57  ite3_reset(p->pW
7d30: 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  riter);.}../*.**
7d40: 20 45 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c   Execute the fol
7d50: 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a  lowing SQL:.**.*
7d60: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  *     DELETE FRO
7d70: 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45 20 69  M %_data WHERE i
7d80: 64 20 42 45 54 57 45 45 4e 20 24 69 46 69 72 73  d BETWEEN $iFirs
7d90: 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a  t AND $iLast.*/.
7da0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7db0: 44 61 74 61 44 65 6c 65 74 65 28 46 74 73 35 49  DataDelete(Fts5I
7dc0: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69  ndex *p, i64 iFi
7dd0: 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b  rst, i64 iLast){
7de0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
7df0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7e00: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c  ;..  if( p->pDel
7e10: 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69  eter==0 ){.    i
7e20: 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43  nt rc;.    Fts5C
7e30: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
7e40: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
7e50: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
7e60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
7e70: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
7e80: 52 4f 4d 20 27 25 71 27 2e 25 51 20 57 48 45 52  ROM '%q'.%Q WHER
7e90: 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d  E id>=? AND id<=
7ea0: 3f 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62  ?", pConfig->zDb
7eb0: 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20  , p->zDataTbl.  
7ec0: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71    );.    if( zSq
7ed0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
7ee0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7ef0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7f00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
7f10: 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69  repare_v2(pConfi
7f20: 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  g->db, zSql, -1,
7f30: 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30   &p->pDeleter, 0
7f40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7f50: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
7f60: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
7f70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7f80: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
7f90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7fa0: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
7fb0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
7fc0: 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72  Deleter, 1, iFir
7fd0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  st);.  sqlite3_b
7fe0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
7ff0: 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29  leter, 2, iLast)
8000: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
8010: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
8020: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
8030: 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74  _reset(p->pDelet
8040: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  er);.}../*.** Cl
8050: 6f 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ose the sqlite3_
8060: 62 6c 6f 62 20 68 61 6e 64 6c 65 20 75 73 65 64  blob handle used
8070: 20 74 6f 20 72 65 61 64 20 72 65 63 6f 72 64 73   to read records
8080: 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
8090: 20 74 61 62 6c 65 2e 0a 2a 2a 20 41 6e 64 20 64   table..** And d
80a0: 69 73 63 61 72 64 20 61 6e 79 20 63 61 63 68 65  iscard any cache
80b0: 64 20 72 65 61 64 73 2e 20 54 68 69 73 20 66 75  d reads. This fu
80c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
80d0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   at the end of.*
80e0: 2a 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  * a read transac
80f0: 74 69 6f 6e 20 6f 72 20 77 68 65 6e 20 61 6e 79  tion or when any
8100: 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
8110: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
8120: 0a 2a 2f 0a 23 69 66 20 30 0a 73 74 61 74 69 63  .*/.#if 0.static
8130: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
8140: 73 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  set(Fts5Index *p
8150: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  ){.  if( p->pRea
8160: 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  der ){.    sqlit
8170: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d  e3_blob_close(p-
8180: 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 70  >pReader);.    p
8190: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
81a0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
81b0: 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65  ** Remove all re
81c0: 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74 65 64  cords associated
81d0: 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53   with segment iS
81e0: 65 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  egid..*/.static 
81f0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6d  void fts5DataRem
8200: 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49  oveSegment(Fts5I
8210: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65  ndex *p, int iSe
8220: 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72  gid){.  i64 iFir
8230: 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  st = FTS5_SEGMEN
8240: 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
8250: 30 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61  0, 0);.  i64 iLa
8260: 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  st = FTS5_SEGMEN
8270: 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b 31  T_ROWID(iSegid+1
8280: 2c 20 30 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73  , 0, 0)-1;.  fts
8290: 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20 69  5DataDelete(p, i
82a0: 46 69 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a 7d  First, iLast);.}
82b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
82c0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
82d0: 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  n Fts5Structure 
82e0: 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20  object returned 
82f0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a  by an earlier .*
8300: 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74  * call to fts5St
8310: 72 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72  ructureRead() or
8320: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
8330: 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  code()..*/.stati
8340: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
8350: 74 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35  tureRelease(Fts5
8360: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8370: 63 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72 75  ct){.  if( pStru
8380: 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ct ){.    int i;
8390: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
83a0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
83b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
83c0: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
83d0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
83e0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
83f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
8400: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ct);.  }.}../*.*
8410: 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e  * Deserialize an
8420: 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72  d return the str
8430: 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 63 75  ucture record cu
8440: 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
8450: 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20  n serialized.** 
8460: 66 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66  form within buff
8470: 65 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a  er pData/nData..
8480: 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74  **.** The Fts5St
8490: 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d  ructure.aLevel[]
84a0: 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74   and each Fts5St
84b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65  ructureLevel.aSe
84c0: 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  g[] array.** are
84d0: 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20   over-allocated 
84e0: 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69  by one slot. Thi
84f0: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72  s allows the str
8500: 75 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a  ucture contents.
8510: 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61  ** to be more ea
8520: 73 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a  sily edited..**.
8530: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
8540: 63 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73  ccurs, *ppOut is
8550: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
8560: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
8570: 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65   code.** returne
8580: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70  d. Otherwise, *p
8590: 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70  pOut is set to p
85a0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
85b0: 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51  object and.** SQ
85c0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
85d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
85e0: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
85f0: 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20  ode(.  const u8 
8600: 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  *pData,         
8610: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
8620: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69   containing seri
8630: 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65  alized structure
8640: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c   */.  int nData,
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8670: 20 62 75 66 66 65 72 20 70 44 61 74 61 20 69 6e   buffer pData in
8680: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
8690: 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20  *piCookie,      
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
86b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
86c0: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46  kie value */.  F
86d0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
86e0: 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f  pOut           /
86f0: 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69  * OUT: Deseriali
8700: 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  zed object */.){
8710: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8720: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d  TE_OK;.  int i =
8730: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a   0;.  int iLvl;.
8740: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30    int nLevel = 0
8750: 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  ;.  int nSegment
8760: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74   = 0;.  int nByt
8770: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8780: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
8790: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
87a0: 6f 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f  ocate at pRet */
87b0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
87c0: 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
87d0: 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20     /* Structure 
87e0: 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e  object to return
87f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74   */..  /* Grab t
8800: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  he cookie value 
8810: 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69  */.  if( piCooki
8820: 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20  e ) *piCookie = 
8830: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32  sqlite3Fts5Get32
8840: 28 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34  (pData);.  i = 4
8850: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
8860: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
8870: 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d   levels and segm
8880: 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74  ents from the st
8890: 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
88a0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
88b0: 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73  .  */.  i += fts
88c0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
88d0: 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b  ata[i], nLevel);
88e0: 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56  .  i += fts5GetV
88f0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
8900: 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20  ], nSegment);.  
8910: 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20  nByte = (.      
8920: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
8930: 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20  ture) +         
8940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8950: 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  in structure */.
8960: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
8970: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
8980: 20 2a 20 28 6e 4c 65 76 65 6c 29 20 20 20 20 20   * (nLevel)     
8990: 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72   /* aLevel[] arr
89a0: 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65  ay */.  );.  pRe
89b0: 74 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  t = (Fts5Structu
89c0: 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  re*)sqlite3Fts5M
89d0: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
89e0: 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52  Byte);..  if( pR
89f0: 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e  et ){.    pRet->
8a00: 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b  nLevel = nLevel;
8a10: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d  .    pRet->nSegm
8a20: 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a  ent = nSegment;.
8a30: 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
8a40: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
8a50: 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69  [i], &pRet->nWri
8a60: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  teCounter);..   
8a70: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63 3d   for(iLvl=0; rc=
8a80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
8a90: 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  vl<nLevel; iLvl+
8aa0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
8ab0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
8ac0: 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76  vl = &pRet->aLev
8ad0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
8ae0: 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20  int nTotal;.    
8af0: 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20    int iSeg;..   
8b00: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
8b10: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
8b20: 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29  ], pLvl->nMerge)
8b30: 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73  ;.      i += fts
8b40: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
8b50: 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b  ata[i], nTotal);
8b60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
8b70: 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65  Total>=pLvl->nMe
8b80: 72 67 65 20 29 3b 0a 20 20 20 20 20 20 70 4c 76  rge );.      pLv
8b90: 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53  l->aSeg = (Fts5S
8ba0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a  tructureSegment*
8bb0: 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
8bc0: 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20 20  ocZero(&rc, .   
8bd0: 20 20 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20         nTotal * 
8be0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
8bf0: 74 75 72 65 53 65 67 6d 65 6e 74 29 0a 20 20 20  tureSegment).   
8c00: 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28     );..      if(
8c10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8c20: 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  {.        pLvl->
8c30: 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20  nSeg = nTotal;. 
8c40: 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
8c50: 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20  0; iSeg<nTotal; 
8c60: 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
8c70: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
8c80: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
8c90: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
8ca0: 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg].iSegid);.   
8cb0: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
8cc0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
8cd0: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
8ce0: 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74 29  g[iSeg].nHeight)
8cf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
8d00: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
8d10: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
8d20: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
8d30: 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20  oFirst);.       
8d40: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
8d50: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
8d60: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
8d70: 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  eg].pgnoLast);. 
8d80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8d90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
8da0: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8db0: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  se(pRet);.      
8dc0: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
8dd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
8de0: 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a   *ppOut = pRet;.
8df0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8e00: 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
8e10: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
8e20: 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a  reAddLevel(int *
8e30: 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74 75  pRc, Fts5Structu
8e40: 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a  re **ppStruct){.
8e50: 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
8e60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
8e70: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8e80: 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
8e90: 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20  .    int nLevel 
8ea0: 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  = pStruct->nLeve
8eb0: 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  l;.    int nByte
8ec0: 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69 7a   = (.        siz
8ed0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8ee0: 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  e) +            
8ef0: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
8f00: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
8f10: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
8f20: 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20  ructureLevel) * 
8f30: 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61  (nLevel+1)  /* a
8f40: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
8f50: 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53 74  .    );..    pSt
8f60: 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 72  ruct = sqlite3_r
8f70: 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c 20  ealloc(pStruct, 
8f80: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
8f90: 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20  pStruct ){.     
8fa0: 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63 74   memset(&pStruct
8fb0: 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d  ->aLevel[nLevel]
8fc0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
8fd0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 29  StructureLevel))
8fe0: 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
8ff0: 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20  >nLevel++;.     
9000: 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
9010: 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ruct;.    }else{
9020: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
9030: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9040: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  }.  }.}../*.** E
9050: 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c  xtend level iLvl
9060: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
9070: 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65  s room for at le
9080: 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a  ast nExtra more.
9090: 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a  ** segments..*/.
90a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
90b0: 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
90c0: 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63  evel(.  int *pRc
90d0: 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  , .  Fts5Structu
90e0: 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20 20  re *pStruct, .  
90f0: 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74  int iLvl, .  int
9100: 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20   nExtra, .  int 
9110: 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66 28  bInsert.){.  if(
9120: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
9130: 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
9140: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
9150: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9160: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46  vel[iLvl];.    F
9170: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
9180: 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69  ent *aNew;.    i
9190: 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  nt nByte;..    n
91a0: 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Byte = (pLvl->nS
91b0: 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73  eg + nExtra) * s
91c0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
91d0: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
91e0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
91f0: 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53  realloc(pLvl->aS
9200: 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  eg, nByte);.    
9210: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
9220: 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d 30    if( bInsert==0
9230: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
9240: 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e  et(&aNew[pLvl->n
9250: 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Seg], 0, sizeof(
9260: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9270: 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b  ment) * nExtra);
9280: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9290: 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20        int nMove 
92a0: 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73  = pLvl->nSeg * s
92b0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
92c0: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
92d0: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e       memmove(&aN
92e0: 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77  ew[nExtra], aNew
92f0: 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  , nMove);.      
9300: 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30    memset(aNew, 0
9310: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
9320: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
9330: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   nExtra);.      
9340: 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53  }.      pLvl->aS
9350: 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d  eg = aNew;.    }
9360: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63  else{.      *pRc
9370: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9380: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9390: 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72 69  .** Read, deseri
93a0: 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e  alize and return
93b0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
93c0: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ecord..**.** The
93d0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61   Fts5Structure.a
93e0: 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68  Level[] and each
93f0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9400: 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79  vel.aSeg[] array
9410: 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c  .** are over-all
9420: 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72 69  ocated as descri
9430: 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  bed for function
9440: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
9450: 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65  code() .** above
9460: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
9470: 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
9480: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
9490: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c   an error code l
94a0: 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74  eft in the.** Ft
94b0: 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20  s5Index handle. 
94c0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
94d0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
94e0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
94f0: 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
9500: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
9510: 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 53  .*/.static Fts5S
9520: 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53 74  tructure *fts5St
9530: 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73 35  ructureRead(Fts5
9540: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
9550: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
9560: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
9570: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
9580: 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  pRet = 0;       
9590: 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72 65   /* Object to re
95a0: 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61  turn */.  Fts5Da
95b0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
95c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 25 5f 64            /* %_d
95d0: 61 74 61 20 65 6e 74 72 79 20 63 6f 6e 74 61 69  ata entry contai
95e0: 6e 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72  ning structure r
95f0: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ecord */.  int i
9600: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
9610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
9620: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
9630: 69 65 20 2a 2f 0a 0a 20 20 70 44 61 74 61 20 3d  ie */..  pData =
9640: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
9650: 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
9660: 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 21 70  ROWID);.  if( !p
9670: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 30 3b  Data ) return 0;
9680: 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53  .  p->rc = fts5S
9690: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70  tructureDecode(p
96a0: 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
96b0: 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52  n, &iCookie, &pR
96c0: 65 74 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  et);..  if( p->r
96d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
96e0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
96f0: 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  !=iCookie ){.   
9700: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
9710: 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70  Fts5ConfigLoad(p
9720: 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29  Config, iCookie)
9730: 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74  ;.  }..  fts5Dat
9740: 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
9750: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
9760: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
9770: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
9780: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70  ase(pRet);.    p
9790: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Ret = 0;.  }.  r
97a0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
97b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
97c0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
97d0: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65  segments in inde
97e0: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
97f0: 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  uct. This.** fun
9800: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76  ction is only ev
9810: 65 72 20 75 73 65 64 20 61 73 20 70 61 72 74 20  er used as part 
9820: 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64  of assert() cond
9830: 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65  itions..*/.#ifde
9840: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
9850: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74  tatic int fts5St
9860: 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
9870: 65 6e 74 73 28 46 74 73 35 53 74 72 75 63 74 75  ents(Fts5Structu
9880: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
9890: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
98a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
98b0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
98c0: 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  of segments */. 
98d0: 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
98e0: 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
9910: 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
9920: 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  els */.    for(i
9930: 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
9940: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
9950: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65 67  l++){.      nSeg
9960: 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d  ment += pStruct-
9970: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
9980: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  eg;.    }.  }.. 
9990: 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e 74   return nSegment
99a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
99b0: 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  * Serialize and 
99c0: 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75 63  store the "struc
99d0: 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a 2a  ture" record..**
99e0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
99f0: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
9a00: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74   error code in t
9a10: 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a  he Fts5Index obj
9a20: 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  ect. If an.** er
9a30: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
9a40: 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
9a50: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
9a60: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
9a70: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
9a80: 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20  Write(Fts5Index 
9a90: 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  *p, Fts5Structur
9aa0: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
9ab0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
9ac0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 42  _OK ){.    Fts5B
9ad0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
9ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
9af0: 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65 20  er to serialize 
9b00: 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20  record into */. 
9b10: 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20     int iLvl;    
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
9b40: 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
9b50: 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ls */.    int iC
9b60: 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20  ookie;          
9b70: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69          /* Cooki
9b80: 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72 65  e value to store
9b90: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
9ba0: 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
9bb0: 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72  nt==fts5Structur
9bc0: 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70  eCountSegments(p
9bd0: 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 6d  Struct) );.    m
9be0: 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
9bf0: 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
9c00: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65  ));..    /* Appe
9c10: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  nd the current c
9c20: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
9c30: 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b  kie */.    iCook
9c40: 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ie = p->pConfig-
9c50: 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66  >iCookie;.    if
9c60: 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69 43  ( iCookie<0 ) iC
9c70: 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 20 20 66  ookie = 0;.    f
9c80: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 33  ts5BufferAppend3
9c90: 32 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  2(&p->rc, &buf, 
9ca0: 69 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20 20 20 66  iCookie);..    f
9cb0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
9cc0: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
9cd0: 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  uf, pStruct->nLe
9ce0: 76 65 6c 29 3b 0a 20 20 20 20 66 74 73 35 42 75  vel);.    fts5Bu
9cf0: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
9d00: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
9d10: 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
9d20: 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
9d30: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9d40: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36 34  ->rc, &buf, (i64
9d50: 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65  )pStruct->nWrite
9d60: 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66  Counter);..    f
9d70: 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
9d80: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9d90: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
9da0: 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20  int iSeg;       
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9dc0: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
9dd0: 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
9de0: 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53  s */.      Fts5S
9df0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
9e00: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
9e10: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
9e20: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9e30: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9e40: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
9e50: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74  Merge);.      ft
9e60: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9e70: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9e80: 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a  f, pLvl->nSeg);.
9e90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
9ea0: 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c  vl->nMerge<=pLvl
9eb0: 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20  ->nSeg );..     
9ec0: 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
9ed0: 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
9ee0: 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  eg++){.        f
9ef0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
9f00: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
9f10: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
9f20: 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  Seg].iSegid);.  
9f30: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9f40: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9f50: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9f60: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69  >aSeg[iSeg].nHei
9f70: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ght);.        ft
9f80: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9f90: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9fa0: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9fb0: 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg].pgnoFirst);.
9fc0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
9fd0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
9fe0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
9ff0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
a000: 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d  noLast);.      }
a010: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
a020: 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
a030: 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
a040: 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  D, buf.p, buf.n)
a050: 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
a060: 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a  Free(&buf);.  }.
a070: 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20  }..#if 0.static 
a080: 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74  void fts5DebugSt
a090: 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73  ructure(int*,Fts
a0a0: 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72  5Buffer*,Fts5Str
a0b0: 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63  ucture*);.static
a0c0: 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53   void fts5PrintS
a0d0: 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63  tructure(const c
a0e0: 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46  har *zCaption, F
a0f0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
a100: 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63  truct){.  int rc
a110: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a120: 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a  Fts5Buffer buf;.
a130: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
a140: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a  , sizeof(buf));.
a150: 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63    fts5DebugStruc
a160: 74 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20  ture(&rc, &buf, 
a170: 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69  pStruct);.  fpri
a180: 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a  ntf(stdout, "%s:
a190: 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e   %s\n", zCaption
a1a0: 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75  , buf.p);.  fflu
a1b0: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74  sh(stdout);.  ft
a1c0: 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
a1d0: 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  f);.}.#else.# de
a1e0: 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74  fine fts5PrintSt
a1f0: 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e  ructure(x,y).#en
a200: 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
a210: 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28  fts5SegmentSize(
a220: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
a230: 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72  ment *pSeg){.  r
a240: 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e  eturn 1 + pSeg->
a250: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
a260: 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f  >pgnoFirst;.}../
a270: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f  *.** Return a co
a280: 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75  py of index stru
a290: 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 45  cture pStruct. E
a2a0: 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61  xcept, promote a
a2b0: 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65  s many .** segme
a2c0: 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20  nts as possible 
a2d0: 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74  to level iPromot
a2e0: 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  e. If an OOM occ
a2f0: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a  urs, NULL is .**
a300: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
a310: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
a320: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
a330: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
a340: 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65  ,.  int iPromote
a350: 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74  ,.  int szPromot
a360: 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  e,.  Fts5Structu
a370: 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20  re *pStruct.){. 
a380: 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46   int il, is;.  F
a390: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
a3a0: 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75  l *pOut = &pStru
a3b0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d  ct->aLevel[iProm
a3c0: 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75  ote];..  if( pOu
a3d0: 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  t->nMerge==0 ){.
a3e0: 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d      for(il=iProm
a3f0: 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63  ote+1; il<pStruc
a400: 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29  t->nLevel; il++)
a410: 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
a420: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
a430: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
a440: 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69  vel[il];.      i
a450: 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
a460: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
a470: 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65  for(is=pLvl->nSe
a480: 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d  g-1; is>=0; is--
a490: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
a4a0: 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53  z = fts5SegmentS
a4b0: 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  ize(&pLvl->aSeg[
a4c0: 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  is]);.        if
a4d0: 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29  ( sz>szPromote )
a4e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a4f0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
a500: 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
a510: 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d  , pStruct, iProm
a520: 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  ote, 1, 1);.    
a530: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
a540: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
a550: 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65  memcpy(pOut->aSe
a560: 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  g, &pLvl->aSeg[i
a570: 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53  s], sizeof(Fts5S
a580: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
a590: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  );.        pOut-
a5a0: 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20  >nSeg++;.       
a5b0: 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20   pLvl->nSeg--;. 
a5c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a5d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20  .}../*.** A new 
a5e0: 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74  segment has just
a5f0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
a600: 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69   level iLvl of i
a610: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a  ndex structure.*
a620: 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20  * pStruct. This 
a630: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
a640: 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65  nes if any segme
a650: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72  nts should be pr
a660: 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72  omoted.** as a r
a670: 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20  esult. Segments 
a680: 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20  are promoted in 
a690: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
a6a0: 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65  *.**   a) If the
a6b0: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
a6c0: 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72  itten is smaller
a6d0: 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   than one or mor
a6e0: 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20  e segments.**   
a6f0: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 72     within the pr
a700: 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64  evious populated
a710: 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72   level, it is pr
a720: 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72  omoted to the pr
a730: 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70  evious.**      p
a740: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a  opulated level..
a750: 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68  **.**   b) If th
a760: 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  e segment just w
a770: 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72  ritten is larger
a780: 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74   than the newest
a790: 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20   segment on.**  
a7a0: 20 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70      the next pop
a7b0: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68  ulated level, th
a7c0: 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c  en that segment,
a7d0: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61   and any other a
a7e0: 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20  djacent.**      
a7f0: 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72  segments that ar
a800: 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74  e also smaller t
a810: 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74  han the one just
a820: 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a   written, are .*
a830: 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e  *      promoted.
a840: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f   .**.** If one o
a850: 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20  r more segments 
a860: 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68  are promoted, th
a870: 65 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  e structure obje
a880: 63 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a  ct is updated.**
a890: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73   to reflect this
a8a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a8b0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
a8c0: 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64  omote(.  Fts5Ind
a8d0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
a8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
a8f0: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
a900: 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20  */.  int iLvl,  
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a920: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65       /* Index le
a930: 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64  vel just updated
a940: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
a950: 75 72 65 20 2a 70 53 74 72 75 63 74 20 20 20 20  ure *pStruct    
a960: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
a970: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
a980: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
a990: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
a9a0: 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69   iTst;.    int i
a9b0: 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20  Promote = -1;.  
a9c0: 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 3b    int szPromote;
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68  /* Promote anyth
a9f0: 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72  ing this size or
aa00: 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
aa10: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
aa20: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
aa30: 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   Segment just wr
aa40: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
aa50: 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20   szSeg;         
aa60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
aa70: 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75  ze of segment ju
aa80: 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 0a  st written */...
aa90: 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72      pSeg = &pStr
aaa0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
aab0: 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e  ].aSeg[pStruct->
aac0: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
aad0: 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20  g-1];.    szSeg 
aae0: 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e  = (1 + pSeg->pgn
aaf0: 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67  oLast - pSeg->pg
ab00: 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f  noFirst);..    /
ab10: 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64  * Check for cond
ab20: 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20  ition (a) */.   
ab30: 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31   for(iTst=iLvl-1
ab40: 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74  ; iTst>=0 && pSt
ab50: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73  ruct->aLevel[iTs
ab60: 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74  t].nSeg==0; iTst
ab70: 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20 69 54 73  --);.    if( iTs
ab80: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  t>=0 ){.      in
ab90: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  t i;.      int s
aba0: 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  zMax = 0;.      
abb0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
abc0: 65 6c 20 2a 70 54 73 74 20 3d 20 26 70 53 74 72  el *pTst = &pStr
abd0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74  uct->aLevel[iTst
abe0: 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
abf0: 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30   pTst->nMerge==0
ac00: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
ac10: 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b  0; i<pTst->nSeg;
ac20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
ac30: 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53  nt sz = pTst->aS
ac40: 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d  eg[i].pgnoLast -
ac50: 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70   pTst->aSeg[i].p
ac60: 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20 20  gnoFirst + 1;.  
ac70: 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d        if( sz>szM
ac80: 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b  ax ) szMax = sz;
ac90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
aca0: 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20  f( szMax>=szSeg 
acb0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ){.        /* Co
acc0: 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 74  ndition (a) is t
acd0: 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65  rue. Promote the
ace0: 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20   newest segment 
acf0: 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20 20 20  on level .      
ad00: 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76    ** iLvl to lev
ad10: 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20  el iTst.  */.   
ad20: 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20       iPromote = 
ad30: 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20 73 7a  iTst;.        sz
ad40: 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b  Promote = szMax;
ad50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
ad60: 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74      /* If condit
ad70: 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74 20 6d  ion (a) is not m
ad80: 65 74 2c 20 61 73 73 75 6d 65 20 28 62 29 20 69  et, assume (b) i
ad90: 73 20 74 72 75 65 2e 20 53 74 72 75 63 74 75 72  s true. Structur
ada0: 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20  ePromoteTo().   
adb0: 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69   ** is a no-op i
adc0: 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f  f it is not.  */
add0: 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d 6f 74  .    if( iPromot
ade0: 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 50 72  e<0 ){.      iPr
adf0: 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20  omote = iLvl;.  
ae00: 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20      szPromote = 
ae10: 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  szSeg;.    }.   
ae20: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
ae30: 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d  omoteTo(p, iProm
ae40: 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20  ote, szPromote, 
ae50: 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a  pStruct);.  }.}.
ae60: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
ae70: 49 74 65 72 2d 3e 69 4f 66 66 20 6f 66 66 73 65  Iter->iOff offse
ae80: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
ae90: 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 69  ts to an entry i
aea0: 6e 64 69 63 61 74 69 6e 67 20 6f 6e 65 0a 2a 2a  ndicating one.**
aeb0: 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 2d 6c 65   or more term-le
aec0: 73 73 20 6e 6f 64 65 73 2c 20 61 64 76 61 6e 63  ss nodes, advanc
aed0: 65 20 70 61 73 74 20 69 74 20 61 6e 64 20 73 65  e past it and se
aee0: 74 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20  t pIter->nEmpty 
aef0: 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  to.** the number
af00: 20 6f 66 20 65 6d 70 74 79 20 63 68 69 6c 64 20   of empty child 
af10: 6e 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nodes..*/.static
af20: 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74   void fts5NodeIt
af30: 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 46  erGobbleNEmpty(F
af40: 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74  ts5NodeIter *pIt
af50: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
af60: 2d 3e 69 4f 66 66 3c 70 49 74 65 72 2d 3e 6e 44  ->iOff<pIter->nD
af70: 61 74 61 20 26 26 20 30 3d 3d 28 70 49 74 65 72  ata && 0==(pIter
af80: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
af90: 4f 66 66 5d 20 26 20 30 78 66 65 29 20 29 7b 0a  Off] & 0xfe) ){.
afa0: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64      pIter->bDlid
afb0: 78 20 3d 20 70 49 74 65 72 2d 3e 61 44 61 74 61  x = pIter->aData
afc0: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20  [pIter->iOff] & 
afd0: 30 78 30 31 3b 0a 20 20 20 20 70 49 74 65 72 2d  0x01;.    pIter-
afe0: 3e 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 70 49 74  >iOff++;.    pIt
aff0: 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  er->iOff += fts5
b000: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
b010: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
b020: 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72 2d 3e 6e  >iOff], pIter->n
b030: 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  Empty);.  }else{
b040: 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d 70  .    pIter->nEmp
b050: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ty = 0;.    pIte
b060: 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20  r->bDlidx = 0;. 
b070: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61   }.}../*.** Adva
b080: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
b090: 65 6e 74 72 79 20 77 69 74 68 69 6e 20 74 68 65  entry within the
b0a0: 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   node..*/.static
b0b0: 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74   void fts5NodeIt
b0c0: 65 72 4e 65 78 74 28 69 6e 74 20 2a 70 52 63 2c  erNext(int *pRc,
b0d0: 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70   Fts5NodeIter *p
b0e0: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
b0f0: 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72 2d  er->iOff>=pIter-
b100: 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 70 49  >nData ){.    pI
b110: 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b 0a  ter->aData = 0;.
b120: 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69 6c      pIter->iChil
b130: 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 45 6d 70  d += pIter->nEmp
b140: 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ty;.  }else{.   
b150: 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e 65 77 3b   int nPre, nNew;
b160: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
b170: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
b180: 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74  t32(&pIter->aDat
b190: 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20  a[pIter->iOff], 
b1a0: 6e 50 72 65 29 3b 0a 20 20 20 20 70 49 74 65 72  nPre);.    pIter
b1b0: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
b1c0: 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72  tVarint32(&pIter
b1d0: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
b1e0: 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  Off], nNew);.   
b1f0: 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d   pIter->term.n =
b200: 20 6e 50 72 65 2d 32 3b 0a 20 20 20 20 66 74 73   nPre-2;.    fts
b210: 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
b220: 62 28 70 52 63 2c 20 26 70 49 74 65 72 2d 3e 74  b(pRc, &pIter->t
b230: 65 72 6d 2c 20 6e 4e 65 77 2c 20 70 49 74 65 72  erm, nNew, pIter
b240: 2d 3e 61 44 61 74 61 2b 70 49 74 65 72 2d 3e 69  ->aData+pIter->i
b250: 4f 66 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  Off);.    pIter-
b260: 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20  >iOff += nNew;. 
b270: 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69 6c 64     pIter->iChild
b280: 20 2b 3d 20 28 31 20 2b 20 70 49 74 65 72 2d 3e   += (1 + pIter->
b290: 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 66 74 73  nEmpty);.    fts
b2a0: 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e  5NodeIterGobbleN
b2b0: 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a 20 20  Empty(pIter);.  
b2c0: 20 20 69 66 28 20 2a 70 52 63 20 29 20 70 49 74    if( *pRc ) pIt
b2d0: 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b 0a 20  er->aData = 0;. 
b2e0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   }.}.../*.** Ini
b2f0: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72  tialize the iter
b300: 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65  ator object pIte
b310: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
b320: 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72 6e 61  ough the interna
b330: 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6e 6f 64  l.** segment nod
b340: 65 20 69 6e 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  e in pData..*/.s
b350: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e  tatic void fts5N
b360: 6f 64 65 49 74 65 72 49 6e 69 74 28 63 6f 6e 73  odeIterInit(cons
b370: 74 20 75 38 20 2a 61 44 61 74 61 2c 20 69 6e 74  t u8 *aData, int
b380: 20 6e 44 61 74 61 2c 20 46 74 73 35 4e 6f 64 65   nData, Fts5Node
b390: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b3a0: 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
b3b0: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
b3c0: 3b 0a 20 20 70 49 74 65 72 2d 3e 61 44 61 74 61  ;.  pIter->aData
b3d0: 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 49 74 65   = aData;.  pIte
b3e0: 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74 61  r->nData = nData
b3f0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20  ;.  pIter->iOff 
b400: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
b410: 32 28 61 44 61 74 61 2c 20 70 49 74 65 72 2d 3e  2(aData, pIter->
b420: 69 43 68 69 6c 64 29 3b 0a 20 20 66 74 73 35 4e  iChild);.  fts5N
b430: 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d  odeIterGobbleNEm
b440: 70 74 79 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  pty(pIter);.}../
b450: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6d 65  *.** Free any me
b460: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  mory allocated b
b470: 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  y the iterator o
b480: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
b490: 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74   void fts5NodeIt
b4a0: 65 72 46 72 65 65 28 46 74 73 35 4e 6f 64 65 49  erFree(Fts5NodeI
b4b0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66  ter *pIter){.  f
b4c0: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
b4d0: 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a 0a  Iter->term);.}..
b4e0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
b4f0: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
b500: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
b510: 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 65  gument. If the e
b520: 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64 6f  nd of the .** do
b530: 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65  clist-index page
b540: 20 69 73 20 72 65 61 63 68 65 64 2c 20 72 65 74   is reached, ret
b550: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
b560: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b570: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74 73  DlidxLvlNext(Fts
b580: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29  5DlidxLvl *pLvl)
b590: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  {.  Fts5Data *pD
b5a0: 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74  ata = pLvl->pDat
b5b0: 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e  a;..  if( pLvl->
b5c0: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  iOff==0 ){.    a
b5d0: 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f  ssert( pLvl->bEo
b5e0: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c  f==0 );.    pLvl
b5f0: 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20 20  ->iOff = 1;.    
b600: 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74  pLvl->iOff += ft
b610: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
b620: 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c  Data->p[1], pLvl
b630: 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ->iLeafPgno);.  
b640: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20    pLvl->iOff += 
b650: 67 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  getVarint(&pData
b660: 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c  ->p[pLvl->iOff],
b670: 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52   (u64*)&pLvl->iR
b680: 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  owid);.    pLvl-
b690: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76  >iFirstOff = pLv
b6a0: 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65  l->iOff;.  }else
b6b0: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  {.    int iOff;.
b6c0: 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76      for(iOff=pLv
b6d0: 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  l->iOff; iOff<pD
b6e0: 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b  ata->n; iOff++){
b6f0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
b700: 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61  ->p[iOff] ) brea
b710: 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  k; .    }..    i
b720: 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e  f( iOff<pData->n
b730: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56   ){.      i64 iV
b740: 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  al;.      pLvl->
b750: 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f  iLeafPgno += (iO
b760: 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66 29  ff - pLvl->iOff)
b770: 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66 66   + 1;.      iOff
b780: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
b790: 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Data->p[iOff], (
b7a0: 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20  u64*)&iVal);.   
b7b0: 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20     pLvl->iRowid 
b7c0: 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70  += iVal;.      p
b7d0: 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  Lvl->iOff = iOff
b7e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b7f0: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
b800: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
b810: 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f  return pLvl->bEo
b820: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  f;.}../*.** Adva
b830: 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
b840: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
b850: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
b860: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b870: 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 46  DlidxIterNextR(F
b880: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
b890: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
b8a0: 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20  r, int iLvl){.  
b8b0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
b8c0: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
b8d0: 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65  l[iLvl];..  asse
b8e0: 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e  rt( iLvl<pIter->
b8f0: 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74  nLvl );.  if( ft
b900: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70  s5DlidxLvlNext(p
b910: 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Lvl) ){.    if( 
b920: 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72  (iLvl+1) < pIter
b930: 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20  ->nLvl ){.      
b940: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
b950: 74 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76  tR(p, pIter, iLv
b960: 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l+1);.      if( 
b970: 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20  pLvl[1].bEof==0 
b980: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  ){.        fts5D
b990: 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
b9a0: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >pData);.       
b9b0: 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c   memset(pLvl, 0,
b9c0: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
b9d0: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  xLvl));.        
b9e0: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
b9f0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
ba00: 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
ba10: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
ba20: 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c  r->iSegid, iLvl,
ba30: 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67   pLvl[1].iLeafPg
ba40: 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
ba50: 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
ba60: 3e 70 44 61 74 61 20 29 20 66 74 73 35 44 6c 69  >pData ) fts5Dli
ba70: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b  dxLvlNext(pLvl);
ba80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ba90: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74   }..  return pIt
baa0: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
bab0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
bac0: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
bad0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
bae0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
baf0: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  ter){.  return f
bb00: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
bb10: 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  R(p, pIter, 0);.
bb20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
bb30: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
bb40: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
bb50: 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f  nt has the follo
bb60: 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a  wing fields set.
bb70: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54  ** as follows. T
bb80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
bb90: 73 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66  s up the rest of
bba0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
bbb0: 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e   that it.** poin
bbc0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
bbd0: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
bbe0: 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  list-index..**.*
bbf0: 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20  *   pData:.**   
bc00: 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63    pointer to doc
bc10: 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72  list-index recor
bc20: 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  d, .**.** When t
bc30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
bc40: 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c  called pIter->iL
bc50: 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70  eafPgno is the p
bc60: 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a  age number the.*
bc70: 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73  * doclist is ass
bc80: 6f 63 69 61 74 65 64 20 77 69 74 68 20 28 74 68  ociated with (th
bc90: 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20  e one featuring 
bca0: 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74  the term)..*/.st
bcb0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
bcc0: 64 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35  dxIterFirst(Fts5
bcd0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
bce0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
bcf0: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
bd00: 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nLvl; i++){.    
bd10: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
bd20: 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d  (&pIter->aLvl[i]
bd30: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bd40: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62  pIter->aLvl[0].b
bd50: 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  Eof;.}...static 
bd60: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
bd70: 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
bd80: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
bd90: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
bda0: 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  rn p->rc!=SQLITE
bdb0: 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c  _OK || pIter->aL
bdc0: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73  vl[0].bEof;.}..s
bdd0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
bde0: 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73  lidxIterLast(Fts
bdf0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
be00: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
be10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
be20: 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65   Advance each le
be30: 76 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20  vel to the last 
be40: 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73  entry on the las
be50: 74 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28  t page */.  for(
be60: 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b  i=pIter->nLvl-1;
be70: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
be80: 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  K && i>=0; i--){
be90: 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76  .    Fts5DlidxLv
bea0: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
beb0: 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77  ->aLvl[i];.    w
bec0: 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c  hile( fts5DlidxL
bed0: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20  vlNext(pLvl)==0 
bee0: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  );.    pLvl->bEo
bef0: 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  f = 0;..    if( 
bf00: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73  i>0 ){.      Fts
bf10: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c  5DlidxLvl *pChil
bf20: 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20  d = &pLvl[-1];. 
bf30: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
bf40: 65 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61  ease(pChild->pDa
bf50: 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ta);.      memse
bf60: 74 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a  t(pChild, 0, siz
bf70: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
bf80: 29 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64  ));.      pChild
bf90: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
bfa0: 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20  taRead(p, .     
bfb0: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
bfc0: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
bfd0: 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e  gid, i-1, pLvl->
bfe0: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
bff0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
c000: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
c010: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
c020: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
c030: 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76  ment to the prev
c040: 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  ious entry..*/.s
c050: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
c060: 69 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44  idxLvlPrev(Fts5D
c070: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a  lidxLvl *pLvl){.
c080: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76    int iOff = pLv
c090: 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  l->iOff;..  asse
c0a0: 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d  rt( pLvl->bEof==
c0b0: 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c  0 );.  if( iOff<
c0c0: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
c0d0: 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45   ){.    pLvl->bE
c0e0: 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
c0f0: 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76  .    u8 *a = pLv
c100: 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20  l->pData->p;.   
c110: 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   i64 iVal;.    i
c120: 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69  nt iLimit;.    i
c130: 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e  nt ii;.    int n
c140: 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Zero = 0;..    /
c150: 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66  * Currently iOff
c160: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
c170: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76  irst byte of a v
c180: 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63  arint. This bloc
c190: 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d  k .    ** decrem
c1a0: 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20  ents iOff until 
c1b0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
c1c0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
c1d0: 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20  he previous .   
c1e0: 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69   ** varint. Taki
c1f0: 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72  ng care not to r
c200: 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c  ead any memory l
c210: 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63  ocations that oc
c220: 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  cur.    ** befor
c230: 65 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20  e the buffer in 
c240: 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20  memory.  */.    
c250: 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39  iLimit = (iOff>9
c260: 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a   ? iOff-9 : 0);.
c270: 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20      for(iOff--; 
c280: 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66  iOff>iLimit; iOf
c290: 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  f--){.      if( 
c2a0: 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38  (a[iOff-1] & 0x8
c2b0: 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  0)==0 ) break;. 
c2c0: 20 20 20 7d 0a 0a 20 20 20 20 67 65 74 56 61 72     }..    getVar
c2d0: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
c2e0: 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20  64*)&iVal);.    
c2f0: 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20  pLvl->iRowid -= 
c300: 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  iVal;.    pLvl->
c310: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20  iLeafPgno--;..  
c320: 20 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77 61    /* Skip backwa
c330: 72 64 73 20 70 61 73 74 20 61 6e 79 20 30 78 30  rds past any 0x0
c340: 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20  0 varints. */.  
c350: 20 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b    for(ii=iOff-1;
c360: 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73   ii>=pLvl->iFirs
c370: 74 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30  tOff && a[ii]==0
c380: 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20  x00; ii--){.    
c390: 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d    nZero++;.    }
c3a0: 0a 20 20 20 20 69 66 28 20 69 69 3e 3d 70 4c 76  .    if( ii>=pLv
c3b0: 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20  l->iFirstOff && 
c3c0: 28 61 5b 69 69 5d 20 26 20 30 78 38 30 29 20 29  (a[ii] & 0x80) )
c3d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  {.      /* The b
c3e0: 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  yte immediately 
c3f0: 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20  before the last 
c400: 30 78 30 30 20 62 79 74 65 20 68 61 73 20 74 68  0x00 byte has th
c410: 65 20 30 78 38 30 20 62 69 74 0a 20 20 20 20 20  e 0x80 bit.     
c420: 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68 65 20   ** set. So the 
c430: 6c 61 73 74 20 30 78 30 30 20 69 73 20 6f 6e 6c  last 0x00 is onl
c440: 79 20 61 20 76 61 72 69 6e 74 20 30 20 69 66 20  y a varint 0 if 
c450: 74 68 65 72 65 20 61 72 65 20 38 20 6d 6f 72 65  there are 8 more
c460: 20 30 78 38 30 0a 20 20 20 20 20 20 2a 2a 20 62   0x80.      ** b
c470: 79 74 65 73 20 62 65 66 6f 72 65 20 61 5b 69 69  ytes before a[ii
c480: 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ]. */.      int 
c490: 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20  bZero = 0;      
c4a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
c4b0: 69 66 20 6c 61 73 74 20 30 78 30 30 20 63 6f 75  if last 0x00 cou
c4c0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nts */.      if(
c4d0: 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69   (ii-8)>=pLvl->i
c4e0: 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20  FirstOff ){.    
c4f0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
c500: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38     for(j=1; j<=8
c510: 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30   && (a[ii-j] & 0
c520: 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20  x80); j++);.    
c530: 20 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38      bZero = (j>8
c540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c550: 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20   if( bZero==0 ) 
c560: 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nZero--;.    }. 
c570: 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67     pLvl->iLeafPg
c580: 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20  no -= nZero;.   
c590: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f   pLvl->iOff = iO
c5a0: 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  ff - nZero;.  }.
c5b0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e  .  return pLvl->
c5c0: 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bEof;.}..static 
c5d0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
c5e0: 72 50 72 65 76 52 28 46 74 73 35 49 6e 64 65 78  rPrevR(Fts5Index
c5f0: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
c600: 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69  er *pIter, int i
c610: 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  Lvl){.  Fts5Dlid
c620: 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49  xLvl *pLvl = &pI
c630: 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b  ter->aLvl[iLvl];
c640: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c  ..  assert( iLvl
c650: 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a  <pIter->nLvl );.
c660: 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c    if( fts5DlidxL
c670: 76 6c 50 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a  vlPrev(pLvl) ){.
c680: 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29      if( (iLvl+1)
c690: 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29   < pIter->nLvl )
c6a0: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
c6b0: 78 49 74 65 72 50 72 65 76 52 28 70 2c 20 70 49  xIterPrevR(p, pI
c6c0: 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20  ter, iLvl+1);.  
c6d0: 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e      if( pLvl[1].
c6e0: 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  bEof==0 ){.     
c6f0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
c700: 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b  se(pLvl->pData);
c710: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
c720: 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pLvl, 0, sizeof(
c730: 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a  Fts5DlidxLvl));.
c740: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44          pLvl->pD
c750: 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
c760: 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  ad(p, .         
c770: 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
c780: 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69  WID(pIter->iSegi
c790: 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d  d, iLvl, pLvl[1]
c7a0: 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20  .iLeafPgno).    
c7b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
c7c0: 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
c7d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
c7e0: 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  e( fts5DlidxLvlN
c7f0: 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a  ext(pLvl)==0 );.
c800: 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e            pLvl->
c810: 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  bEof = 0;.      
c820: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c830: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c840: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62  pIter->aLvl[0].b
c850: 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  Eof;.}.static in
c860: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  t fts5DlidxIterP
c870: 72 65 76 28 46 74 73 35 49 6e 64 65 78 20 2a 70  rev(Fts5Index *p
c880: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
c890: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
c8a0: 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  n fts5DlidxIterP
c8b0: 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 30  revR(p, pIter, 0
c8c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
c8d0: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
c8e0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
c8f0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74   allocated by ft
c900: 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
c910: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
c920: 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46  d fts5DlidxIterF
c930: 72 65 65 28 46 74 73 35 44 6c 69 64 78 49 74 65  ree(Fts5DlidxIte
c940: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
c950: 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e   pIter ){.    in
c960: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
c970: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
c980: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
c990: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
c9a0: 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74  er->aLvl[i].pDat
c9b0: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
c9c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
c9d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
c9e0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
c9f0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
ca00: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
ca10: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
ca20: 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63       /* Fts5 Bac
ca30: 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
ca40: 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  within */.  int 
ca50: 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ca70: 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59  rue for ORDER BY
ca80: 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53   ASC */.  int iS
ca90: 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  egid,           
caa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
cab0: 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74  ment id */.  int
cac0: 20 69 4c 65 61 66 50 67 20 20 20 20 20 20 20 20   iLeafPg        
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cae0: 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  Leaf page number
caf0: 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66   to load dlidx f
cb00: 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  or */.){.  Fts5D
cb10: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 20  lidxIter *pIter 
cb20: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
cb30: 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a  int bDone = 0;..
cb40: 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
cb50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
cb60: 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  Done==0; i++){. 
cb70: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
cb80: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49  izeof(Fts5DlidxI
cb90: 74 65 72 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f  ter) + i * sizeo
cba0: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b  f(Fts5DlidxLvl);
cbb0: 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74  .    Fts5DlidxIt
cbc0: 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70  er *pNew;..    p
cbd0: 4e 65 77 20 3d 20 28 46 74 73 35 44 6c 69 64 78  New = (Fts5Dlidx
cbe0: 49 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65  Iter*)sqlite3_re
cbf0: 61 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42 79  alloc(pIter, nBy
cc00: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  te);.    if( pNe
cc10: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
cc20: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
cc30: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
cc40: 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
cc50: 3d 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57  = FTS5_DLIDX_ROW
cc60: 49 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c  ID(iSegid, i, iL
cc70: 65 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74  eafPg);.      Ft
cc80: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
cc90: 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69   = &pNew->aLvl[i
cca0: 5d 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d  ];.      pIter =
ccb0: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d   pNew;.      mem
ccc0: 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a  set(pLvl, 0, siz
ccd0: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
cce0: 29 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ));.      pLvl->
ccf0: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
cd00: 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b  Read(p, iRowid);
cd10: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
cd20: 3e 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d  >pData && (pLvl-
cd30: 3e 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30  >pData->p[0] & 0
cd40: 78 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20  x0001)==0 ){.   
cd50: 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a       bDone = 1;.
cd60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
cd70: 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b  ter->nLvl = i+1;
cd80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
cd90: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
cda0: 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  OK ){.    pIter-
cdb0: 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
cdc0: 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d  ;.    if( bRev==
cdd0: 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  0 ){.      fts5D
cde0: 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49  lidxIterFirst(pI
cdf0: 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ter);.    }else{
ce00: 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
ce10: 49 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65  IterLast(p, pIte
ce20: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
ce30: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
ce40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73  TE_OK ){.    fts
ce50: 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
ce60: 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72  Iter);.    pIter
ce70: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
ce80: 75 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74  urn pIter;.}..st
ce90: 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69  atic i64 fts5Dli
cea0: 64 78 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  dxIterRowid(Fts5
ceb0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
cec0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  ){.  return pIte
ced0: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69  r->aLvl[0].iRowi
cee0: 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  d;.}.static int 
cef0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
cf00: 6f 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  o(Fts5DlidxIter 
cf10: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
cf20: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
cf30: 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 73  .iLeafPgno;.}..s
cf40: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4c  tatic void fts5L
cf50: 65 61 66 48 65 61 64 65 72 28 46 74 73 35 44 61  eafHeader(Fts5Da
cf60: 74 61 20 2a 70 4c 65 61 66 2c 20 69 6e 74 20 2a  ta *pLeaf, int *
cf70: 70 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70 69  piRowid, int *pi
cf80: 54 65 72 6d 29 7b 0a 20 20 2a 70 69 52 6f 77 69  Term){.  *piRowi
cf90: 64 20 3d 20 28 69 6e 74 29 66 74 73 35 47 65 74  d = (int)fts5Get
cfa0: 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d  U16(&pLeaf->p[0]
cfb0: 29 3b 0a 20 20 2a 70 69 54 65 72 6d 20 3d 20 28  );.  *piTerm = (
cfc0: 69 6e 74 29 66 74 73 35 47 65 74 55 31 36 28 26  int)fts5GetU16(&
cfd0: 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d 0a  pLeaf->p[2]);.}.
cfe0: 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
cff0: 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65 20 69  next leaf page i
d000: 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20  nto the segment 
d010: 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  iterator..*/.sta
d020: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
d030: 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20 20  IterNextPage(.  
d040: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
d070: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
d080: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
d090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d0a0: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
d0b0: 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65 20  ce to next page 
d0c0: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
d0d0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
d0e0: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
d0f0: 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
d100: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
d110: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
d120: 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70  fPgno++;.  if( p
d130: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
d140: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d150: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c  Iter->iLeafPgno<
d160: 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  =pSeg->pgnoLast 
d170: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  );.    pIter->pL
d180: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  eaf = pIter->pNe
d190: 78 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65  xtLeaf;.    pIte
d1a0: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30  r->pNextLeaf = 0
d1b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ;.  }else if( pI
d1c0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d  ter->iLeafPgno<=
d1d0: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
d1e0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
d1f0: 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
d200: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54  d(p, .        FT
d210: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
d220: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30  (pSeg->iSegid, 0
d230: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  , pIter->iLeafPg
d240: 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  no).    );.  }el
d250: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  se{.    pIter->p
d260: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Leaf = 0;.  }.}.
d270: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
d280: 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  p points to a bu
d290: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d2a0: 61 20 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69  a varint to be i
d2b0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a  nterpreted as a.
d2c0: 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ** position list
d2d0: 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61   size field. Rea
d2e0: 64 20 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64  d the varint and
d2f0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
d300: 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72  er of bytes.** r
d310: 65 61 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75  ead. Before retu
d320: 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a  rning, set *pnSz
d330: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
d340: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 70  f bytes in the p
d350: 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c  osition.** list,
d360: 20 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74   and *pbDel to t
d370: 72 75 65 20 69 66 20 74 68 65 20 64 65 6c 65 74  rue if the delet
d380: 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f  e flag is set, o
d390: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
d3a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d3b0: 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
d3c0: 69 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c  ize(const u8 *p,
d3d0: 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20   int *pnSz, int 
d3e0: 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e  *pbDel){.  int n
d3f0: 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 66 74  Sz;.  int n = ft
d400: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  s5GetVarint32(p,
d410: 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72 74 5f   nSz);.  assert_
d420: 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20  nc( nSz>=0 );.  
d430: 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20  *pnSz = nSz/2;. 
d440: 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20   *pbDel = nSz & 
d450: 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75 72 6e  0x0001;.  return
d460: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73   n;.}../*.** Fts
d470: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
d480: 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70  fset currently p
d490: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
d4a0: 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20  st byte of a.** 
d4b0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
d4c0: 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74  ze field. Read t
d4d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
d4e0: 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72 65 20  field and store 
d4f0: 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  it.** in the fol
d500: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
d510: 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65  :.**.**   Fts5Se
d520: 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20  gIter.nPos.**   
d530: 46 74 73 35 53 65 67 49 74 65 72 2e 62 44 65 6c  Fts5SegIter.bDel
d540: 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73  .**.** Leave Fts
d550: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
d560: 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  fset pointing to
d570: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
d580: 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74  of the .** posit
d590: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion list content
d5a0: 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74   (if any)..*/.st
d5b0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d5c0: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74  gIterLoadNPos(Ft
d5d0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
d5e0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
d5f0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d600: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
d610: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
d620: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f  >iLeafOffset;  /
d630: 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64  * Offset to read
d640: 20 61 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 69   at */.    if( i
d650: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
d660: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  f->n ){.      p-
d670: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
d680: 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
d690: 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61       const u8 *a
d6a0: 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66   = &pIter->pLeaf
d6b0: 2d 3e 70 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  ->p[iOff];.     
d6c0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d6d0: 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74 50 6f  set += fts5GetPo
d6e0: 73 6c 69 73 74 53 69 7a 65 28 61 2c 20 26 70 49  slistSize(a, &pI
d6f0: 74 65 72 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65  ter->nPos, &pIte
d700: 72 2d 3e 62 44 65 6c 29 3b 0a 20 20 20 20 7d 0a  r->bDel);.    }.
d710: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73    }.}../*.** Fts
d720: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
d730: 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70  fset currently p
d740: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
d750: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
d760: 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69 65  ** "nSuffix" fie
d770: 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75  ld of a term. Fu
d780: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
d790: 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20   nKeep contains 
d7a0: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
d7b0: 74 68 65 20 22 6e 50 72 65 66 69 78 22 20 66 69  the "nPrefix" fi
d7c0: 65 6c 64 20 28 69 66 20 74 68 65 72 65 20 77 61  eld (if there wa
d7d0: 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61  s one - it is pa
d7e0: 73 73 65 64 20 30 20 69 66 20 74 68 69 73 20 69  ssed 0 if this i
d7f0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  s.** the first t
d800: 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65  erm in the segme
d810: 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nt)..**.** This 
d820: 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
d830: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35  es:.**.**   Fts5
d840: 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20  SegIter.term.** 
d850: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f    Fts5SegIter.ro
d860: 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64  wid.**.** accord
d870: 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73  ingly and leaves
d880: 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c   (Fts5SegIter.iL
d890: 65 61 66 4f 66 66 73 65 74 29 20 73 65 74 20 74  eafOffset) set t
d8a0: 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  o the content of
d8b0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f  .** the first po
d8c0: 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65  sition list. The
d8d0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62   position list b
d8e0: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75  elonging to docu
d8f0: 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65  ment .** (Fts5Se
d900: 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a  gIter.iRowid)..*
d910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
d920: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
d930: 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  m(Fts5Index *p, 
d940: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
d950: 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a  er, int nKeep){.
d960: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
d970: 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20  >pLeaf->p;      
d980: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72    /* Buffer to r
d990: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f  ead data from */
d9a0: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49  .  int iOff = pI
d9b0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d9c0: 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20  ;  /* Offset to 
d9d0: 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74  read at */.  int
d9e0: 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   nNew;          
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da00: 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74  Bytes of new dat
da10: 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20  a */..  iOff += 
da20: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
da30: 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b  &a[iOff], nNew);
da40: 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e  .  pIter->term.n
da50: 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35   = nKeep;.  fts5
da60: 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
da70: 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
da80: 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b  >term, nNew, &a[
da90: 69 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b  iOff]);.  iOff +
daa0: 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d  = nNew;.  pIter-
dab0: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
dac0: 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72   = iOff;.  pIter
dad0: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
dae0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
daf0: 6e 6f 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d  no;.  if( iOff>=
db00: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20  pIter->pLeaf->n 
db10: 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ){.    fts5SegIt
db20: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
db30: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ter);.    if( pI
db40: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b  ter->pLeaf==0 ){
db50: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
db60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  ==SQLITE_OK ) p-
db70: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
db80: 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
db90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66  ;.    }.    iOff
dba0: 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49   = 4;.    a = pI
dbb0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
dbc0: 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c   }.  iOff += sql
dbd0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
dbe0: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
dbf0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
dc00: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
dc10: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f  set = iOff;.}../
dc20: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
dc30: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
dc40: 65 63 74 20 70 49 74 65 72 20 74 6f 20 69 74 65  ect pIter to ite
dc50: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
dc60: 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73   entries in.** s
dc70: 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54 68 65  egment pSeg. The
dc80: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
dc90: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
dca0: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 77 68  e first entry wh
dcb0: 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
dcc0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
dcd0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
dce0: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
dcf0: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
dd00: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
dd10: 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
dd20: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
dd30: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
dd40: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
dd50: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
dd60: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
dd70: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
dd80: 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  egIterInit(.  Ft
dd90: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ddb0: 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a 65 63   FTS index objec
ddc0: 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
ddd0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
dde0: 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  g,     /* Descri
ddf0: 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74  ption of segment
de00: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
de10: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
de20: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
de30: 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29  to populate */.)
de40: 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67  {.  if( pSeg->pg
de50: 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20  noFirst==0 ){.  
de60: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
de70: 73 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74  s if the segment
de80: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 61   is being used a
de90: 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e  s an input to an
dea0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20   incremental.   
deb0: 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20 61 6c   ** merge and al
dec0: 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72 65 61  l data has alrea
ded0: 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d 65 64  dy been "trimmed
dee0: 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  ". See function.
def0: 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69 6d 53      ** fts5TrimS
df00: 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20 64 65  egments() for de
df10: 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63  tails. In this c
df20: 61 73 65 20 6c 65 61 76 65 20 74 68 65 20 69 74  ase leave the it
df30: 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20  erator empty..  
df40: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
df50: 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28 70 49  will see the (pI
df60: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61  ter->pLeaf==0) a
df70: 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20 69 74  nd assume the it
df80: 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a  erator is.    **
df90: 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64 79 2e   at EOF already.
dfa0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
dfb0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
dfc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
dfd0: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
dfe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dff0: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
e000: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
e010: 29 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  ));.    pIter->p
e020: 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20  Seg = pSeg;.    
e030: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
e040: 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
e050: 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65  st-1;.    fts5Se
e060: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
e070: 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20   pIter);.  }..  
e080: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
e090: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38 20 2a  E_OK ){.    u8 *
e0a0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
e0b0: 2d 3e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ->p;.    pIter->
e0c0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
e0d0: 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b  s5GetU16(&a[2]);
e0e0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
e0f0: 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65  LoadTerm(p, pIte
e100: 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53  r, 0);.    fts5S
e110: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
e120: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
e130: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e140: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
e150: 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  r called on iter
e160: 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79  ators created by
e170: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73   calls to.** Fts
e180: 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69  5IndexQuery() wi
e190: 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58  th the FTS5INDEX
e1a0: 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67  _QUERY_DESC flag
e1b0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   set..**.** The 
e1c0: 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61  iterator is in a
e1d0: 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20  n unusual state 
e1e0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
e1f0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68  on is called: th
e200: 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  e.** Fts5SegIter
e210: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72  .iLeafOffset var
e220: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
e230: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
e240: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
e250: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
e260: 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74  size field for t
e270: 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
e280: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
e290: 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49  age..** Fts5SegI
e2a0: 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74  ter.rowid is set
e2b0: 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62  , but nPos and b
e2c0: 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a  Del are not..**.
e2d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e2e0: 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 69 74   advances the it
e2f0: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
e300: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
e310: 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e  last .** relevan
e320: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
e330: 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  age and, if nece
e340: 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a  ssary, initializ
e350: 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69  es the .** aRowi
e360: 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52  dOffset[] and iR
e370: 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61  owidOffset varia
e380: 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f  bles. At this po
e390: 69 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  int the iterator
e3a0: 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65  .** is in its re
e3b0: 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74  gular state - Ft
e3c0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
e3d0: 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20  ffset points to 
e3e0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74  the first.** byt
e3f0: 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  e of the positio
e400: 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61  n list content a
e410: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
e420: 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74  aid rowid..*/.st
e430: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
e440: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
e450: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
e460: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
e470: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  pIter){.  int n 
e480: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
e490: 6e 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 74  n;.  int i = pIt
e4a0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
e4b0: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
e4c0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e  ->pLeaf->p;.  in
e4d0: 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  t iRowidOffset =
e4e0: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
e4f0: 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  ){.    i64 iDelt
e500: 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  a = 0;.    int n
e510: 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44 75  Pos;.    int bDu
e520: 6d 6d 79 3b 0a 0a 20 20 20 20 69 20 2b 3d 20 66  mmy;..    i += f
e530: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
e540: 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20  e(&a[i], &nPos, 
e550: 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69 20  &bDummy);.    i 
e560: 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 69 66 28  += nPos;.    if(
e570: 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a 20   i>=n ) break;. 
e580: 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e     i += getVarin
e590: 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26  t(&a[i], (u64*)&
e5a0: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 69 66 28  iDelta);.    if(
e5b0: 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62 72 65   iDelta==0 ) bre
e5c0: 61 6b 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ak;.    pIter->i
e5d0: 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
e5e0: 0a 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  ..    if( iRowid
e5f0: 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e  Offset>=pIter->n
e600: 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a 20  RowidOffset ){. 
e610: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
e620: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
e630: 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20 69  set + 8;.      i
e640: 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a  nt *aNew = (int*
e650: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
e660: 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66  (pIter->aRowidOf
e670: 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f  fset, nNew*sizeo
e680: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69  f(int));.      i
e690: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
e6a0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
e6b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e6c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e6d0: 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e   }.      pIter->
e6e0: 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 61  aRowidOffset = a
e6f0: 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65 72  New;.      pIter
e700: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->nRowidOffset =
e710: 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20 20   nNew;.    }..  
e720: 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f    pIter->aRowidO
e730: 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66 73  ffset[iRowidOffs
e740: 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e 69  et++] = pIter->i
e750: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
e760: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e770: 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70 49  et = i;.  }.  pI
e780: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
e790: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65 74  t = iRowidOffset
e7a0: 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c  ;.  fts5SegIterL
e7b0: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
e7c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  );.}../*.**.*/.s
e7d0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
e7e0: 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
e7f0: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
e800: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
e810: 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
e820: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
e830: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
e840: 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72  VERSE );.  asser
e850: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
e860: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
e870: 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74 73  NETERM );..  fts
e880: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
e890: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
e8a0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
e8b0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
e8c0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
e8d0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70 49  er->iLeafPgno>pI
e8e0: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
e8f0: 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  no ){.    Fts5Da
e900: 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 49  ta *pNew;.    pI
e910: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d  ter->iLeafPgno--
e920: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73  ;.    pNew = fts
e930: 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
e940: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
e950: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e960: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  ->pSeg->iSegid, 
e970: 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  0, pIter->iLeafP
e980: 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20  gno.    ));.    
e990: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
e9a0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65    if( pIter->iLe
e9b0: 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
e9c0: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  TermLeafPgno ){.
e9d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
e9e0: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
e9f0: 65 74 3c 70 4e 65 77 2d 3e 6e 20 29 7b 0a 20 20  et<pNew->n ){.  
ea00: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
ea10: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
ea20: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
ea30: 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65  eafOffset = pIte
ea40: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
ea50: 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  et;.        }.  
ea60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea70: 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
ea80: 2c 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  , dummy;.       
ea90: 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28   fts5LeafHeader(
eaa0: 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 4f 66 66  pNew, &iRowidOff
eab0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  , &dummy);.     
eac0: 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
ead0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
eae0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65  ter->pLeaf = pNe
eaf0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  w;.          pIt
eb00: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
eb10: 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20  = iRowidOff;.   
eb20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
eb30: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
eb40: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
eb50: 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72    u8 *a = &pIter
eb60: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72  ->pLeaf->p[pIter
eb70: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
eb80: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
eb90: 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 67 65  LeafOffset += ge
eba0: 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a  tVarint(a, (u64*
ebb0: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
ebc0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ebd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ebe0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
ebf0: 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
ec00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
ec10: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
ec20: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
ec30: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
ec40: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
ec50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
ec60: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
ec70: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
ec80: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
ec90: 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
eca0: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
ecb0: 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41  delete marker. A
ecc0: 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69   delete marker i
ecd0: 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  s an entry with 
ece0: 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69  a 0 byte.** posi
ecf0: 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  tion-list..*/.st
ed00: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
ed10: 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 46 74  tiIterIsEmpty(Ft
ed20: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
ed30: 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
ed40: 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49  ter){.  Fts5SegI
ed50: 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
ed60: 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
ed70: 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
ed80: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  ];.  return (p->
ed90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
eda0: 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20   pSeg->pLeaf && 
edb0: 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a  pSeg->nPos==0);.
edc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
edd0: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
ede0: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
edf0: 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  y. .**.** If an 
ee00: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
ee10: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
ee20: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
ee30: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
ee40: 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  It .** is not co
ee50: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
ee60: 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
ee70: 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49  r reaches EOF. I
ee80: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
ee90: 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
eea0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
eeb0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
eec0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
eed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
eee0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
eef0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
ef20: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
ef30: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
ef40: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
ef50: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
ef60: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  vance */.  int *
ef70: 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
ef80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
ef90: 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74  T: Set for new t
efa0: 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  erm */.){.  asse
efb0: 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30  rt( pbNewTerm==0
efc0: 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d   || *pbNewTerm==
efd0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  0 );.  if( p->rc
efe0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
eff0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c     if( pIter->fl
f000: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
f010: 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20  ER_REVERSE ){.  
f020: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
f030: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  r->pNextLeaf==0 
f040: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
f050: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
f060: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  >0 ){.        u8
f070: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
f080: 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 69  af->p;.        i
f090: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20  nt iOff;.       
f0a0: 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
f0b0: 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
f0c0: 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74         i64 iDelt
f0d0: 61 3b 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65  a;..        pIte
f0e0: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d  r->iRowidOffset-
f0f0: 2d 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  -;.        pIter
f100: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
f110: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52  iOff = pIter->aR
f120: 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72  owidOffset[pIter
f130: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b  ->iRowidOffset];
f140: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
f150: 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
f160: 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e  ize(&a[iOff], &n
f170: 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
f180: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
f190: 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 67 65 74  Pos;.        get
f1a0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
f1b0: 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
f1c0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
f1d0: 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61  iRowid -= iDelta
f1e0: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
f1f0: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
f200: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
f210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
f220: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
f230: 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72  NewPage(p, pIter
f240: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f250: 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35  else{.      Fts5
f260: 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
f270: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20  ter->pLeaf;.    
f280: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
f290: 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
f2a0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b   0;.      int nK
f2b0: 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  eep = 0;..      
f2c0: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
f2d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  e end of the pos
f2e0: 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69  ition list withi
f2f0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
f300: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ge. */.      u8 
f310: 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20  *a = pLeaf->p;. 
f320: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65       int n = pLe
f330: 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f  af->n;..      iO
f340: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
f350: 66 4f 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d  fOffset + pIter-
f360: 3e 6e 50 6f 73 3b 0a 0a 20 20 20 20 20 20 69 66  >nPos;..      if
f370: 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
f380: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
f390: 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20  entry is on the 
f3a0: 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a  current page */.
f3b0: 20 20 20 20 20 20 20 20 75 36 34 20 69 44 65 6c          u64 iDel
f3c0: 74 61 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  ta;.        iOff
f3d0: 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61   += sqlite3GetVa
f3e0: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26  rint(&a[iOff], &
f3f0: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  iDelta);.       
f400: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f410: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
f420: 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d      if( iDelta==
f430: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
f440: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
f450: 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e         if( iOff>
f460: 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =n ){.          
f470: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
f480: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
f490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
f4a0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
f4b0: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 4;.          }
f4c0: 65 6c 73 65 20 69 66 28 20 69 4f 66 66 21 3d 66  else if( iOff!=f
f4d0: 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29  ts5GetU16(&a[2])
f4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f4f0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f500: 65 74 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  et += fts5GetVar
f510: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
f520: 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20  nKeep);.        
f530: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
f540: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  e{.          pIt
f550: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
f560: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a  elta;.        }.
f570: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f580: 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29  pIter->pSeg==0 )
f590: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
f5a0: 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
f5b0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
f5c0: 72 20 2a 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20  r *zTerm;.      
f5d0: 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20    int nList;.   
f5e0: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74       if( 0==(pIt
f5f0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
f600: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
f610: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
f620: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
f630: 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29  anNext(p->pHash)
f640: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
f650: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
f660: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
f670: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
f680: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nList);.        
f690: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  }.        if( pL
f6a0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
f6b0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
f6c0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
f6d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
f6e0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
f6f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f700: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
f710: 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70  Leaf->p = (u8*)p
f720: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  List;.          
f730: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20  pIter->pLeaf->n 
f740: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = nList;.       
f750: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
f760: 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
f770: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 73 74  &pIter->term, st
f780: 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 75 38  rlen(zTerm), (u8
f790: 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  *)zTerm);.      
f7a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f7b0: 4f 66 66 73 65 74 20 3d 20 67 65 74 56 61 72 69  Offset = getVari
f7c0: 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29  nt(pList, (u64*)
f7d0: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
f7e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f7f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f800: 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  iOff = 0;.      
f810: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
f820: 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
f830: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
f840: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66        while( iOf
f850: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
f860: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
f870: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
f880: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61 66  .          pLeaf
f890: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
f8a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
f8b0: 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
f8c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
f8d0: 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  iOff = fts5GetU1
f8e0: 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29  6(&pLeaf->p[0]))
f8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f900: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
f910: 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
f920: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
f930: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
f940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
f950: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
f960: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
f970: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c    }.          el
f980: 73 65 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66  se if( (iOff = f
f990: 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
f9a0: 2d 3e 70 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  ->p[2])) ){.    
f9b0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
f9c0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f9d0: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  f;.            b
f9e0: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
f9f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fa00: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
fa10: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
fa20: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f  e iterator is no
fa30: 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c  w at EOF. If so,
fa40: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
fa50: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  /.      if( pIte
fa60: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
fa70: 20 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d      if( bNewTerm
fa80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
fa90: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
faa0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
fab0: 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20  ETERM ){.       
fac0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
fad0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
fae0: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
faf0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
fb00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
fb10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e{.            f
fb20: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
fb30: 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65  rm(p, pIter, nKe
fb40: 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ep);.           
fb50: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
fb60: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
fb80: 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e  pbNewTerm ) *pbN
fb90: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
fba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fbb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
fbc0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
fbd0: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
fbe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fbf0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  }.    }.  }.}..#
fc00: 64 65 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54  define SWAPVAL(T
fc10: 2c 20 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b  , a, b) { T tmp;
fc20: 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74   tmp=a; a=b; b=t
fc30: 6d 70 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  mp; }../*.** Ite
fc40: 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72  rator pIter curr
fc50: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
fc60: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
fc70: 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68  in a doclist. Th
fc80: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  is.** function s
fc90: 65 74 73 20 74 68 65 20 69 74 65 72 61 74 6f 72  ets the iterator
fca0: 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 65 72   up so that iter
fcb0: 61 74 65 73 20 69 6e 20 72 65 76 65 72 73 65 20  ates in reverse 
fcc0: 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a  order through.**
fcd0: 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f   the doclist..*/
fce0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
fcf0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
fd00: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
fd10: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
fd20: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
fd30: 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74  er *pDlidx = pIt
fd40: 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74  er->pDlidx;.  Ft
fd50: 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20  s5Data *pLast = 
fd60: 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73  0;.  int pgnoLas
fd70: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44  t = 0;..  if( pD
fd80: 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  lidx ){.    int 
fd90: 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e  iSegid = pIter->
fda0: 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
fdb0: 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73    pgnoLast = fts
fdc0: 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
fdd0: 44 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73  Dlidx);.    pLas
fde0: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
fdf0: 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
fe00: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30  _ROWID(iSegid, 0
fe10: 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20  , pgnoLast));.  
fe20: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
fe30: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe50: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
fe60: 74 20 77 69 74 68 69 6e 20 70 4c 65 61 66 20 2a  t within pLeaf *
fe70: 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
fe80: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
fe90: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  Leaf;         /*
fea0: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
feb0: 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75  ta */..    /* Cu
fec0: 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67  rrently, Fts5Seg
fed0: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
fee0: 20 28 61 6e 64 20 69 4f 66 66 29 20 70 6f 69 6e   (and iOff) poin
fef0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
ff00: 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 66 20  .    ** byte of 
ff10: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f  position-list co
ff20: 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75  ntent for the cu
ff30: 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63  rrent rowid. Bac
ff40: 6b 20 69 74 20 75 70 0a 20 20 20 20 2a 2a 20 73  k it up.    ** s
ff50: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
ff60: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
ff70: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
ff80: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a  st size field. *
ff90: 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  /.    pIter->iLe
ffa0: 61 66 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69  afOffset -= sqli
ffb0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
ffc0: 4c 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a  Len(pIter->nPos*
ffd0: 32 2b 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a  2+pIter->bDel);.
ffe0: 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72      iOff = pIter
fff0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
10000 20 20 20 61 73 73 65 72 74 28 20 69 4f 66 66 3e     assert( iOff>
10010 3d 34 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  =4 );..    /* Se
10020 61 72 63 68 20 66 6f 72 20 61 20 6e 65 77 20 74  arch for a new t
10030 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63  erm within the c
10040 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 49 66 20  urrent leaf. If 
10050 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  one can be found
10060 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
10070 69 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  is page contains
10080 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77   the largest row
10090 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  id for the curre
100a0 6e 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  nt term. */.    
100b0 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61  while( iOff<pLea
100c0 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  f->n ){.      in
100d0 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 36  t nPos;.      i6
100e0 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
100f0 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20  int bDummy;..   
10100 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70     /* Read the p
10110 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
10120 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20  e field */.     
10130 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
10140 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 4c 65  PoslistSize(&pLe
10150 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50  af->p[iOff], &nP
10160 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
10170 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73      iOff += nPos
10180 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
10190 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 20 62 72 65  >=pLeaf->n ) bre
101a0 61 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 6f  ak;..      /* Ro
101b0 77 69 64 20 64 65 6c 74 61 2e 20 4f 72 2c 20 69  wid delta. Or, i
101c0 66 20 30 78 30 30 2c 20 74 68 65 20 65 6e 64 20  f 0x00, the end 
101d0 6f 66 20 64 6f 63 6c 69 73 74 20 6d 61 72 6b 65  of doclist marke
101e0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73  r. */.      nPos
101f0 20 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c   = getVarint(&pL
10200 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
10210 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
10220 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d      if( iDelta==
10230 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
10240 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20   iOff += nPos;. 
10250 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
10260 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
10270 73 20 74 72 75 65 20 74 68 65 6e 20 74 68 65 20  s true then the 
10280 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f  largest rowid fo
10290 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  r the current.  
102a0 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f    ** term may no
102b0 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74  t be stored on t
102c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
102d0 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61   So search forwa
102e0 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65  rd to.    ** see
102f0 20 77 68 65 72 65 20 73 61 69 64 20 72 6f 77 69   where said rowi
10300 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f  d really is.  */
10310 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  .    if( iOff>=p
10320 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Leaf->n ){.     
10330 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20   int pgno;.     
10340 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
10350 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
10360 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20  ter->pSeg;..    
10370 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f    /* The last ro
10380 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
10390 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e  st may not be on
103a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
103b0 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20 20  e. Search.      
103c0 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69  ** forward to fi
103d0 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  nd the page cont
103e0 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20  aining the last 
103f0 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20  rowid.  */.     
10400 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d   for(pgno=pIter-
10410 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70  >iLeafPgno+1; !p
10420 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53  ->rc && pgno<=pS
10430 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67  eg->pgnoLast; pg
10440 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  no++){.        i
10450 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53  64 iAbs = FTS5_S
10460 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
10470 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 67  g->iSegid, 0, pg
10480 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74 73  no);.        Fts
10490 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74  5Data *pNew = ft
104a0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 41  s5DataRead(p, iA
104b0 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  bs);.        if(
104c0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
104d0 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 69     int iRowid, i
104e0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
104f0 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28 70  fts5LeafHeader(p
10500 4e 65 77 2c 20 26 69 52 6f 77 69 64 2c 20 26 69  New, &iRowid, &i
10510 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  Term);.         
10520 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20   if( iRowid ){. 
10530 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50 56             SWAPV
10540 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e  AL(Fts5Data*, pN
10550 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20  ew, pLast);.    
10560 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74          pgnoLast
10570 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20   = pgno;.       
10580 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
10590 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
105a0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
105b0 69 66 28 20 69 54 65 72 6d 20 29 20 62 72 65 61  if( iTerm ) brea
105c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
105d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
105e0 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73    /* If pLast is
105f0 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f   NULL at this po
10600 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  int, then the la
10610 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69  st rowid for thi
10620 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c  s doclist.  ** l
10630 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ies on the page 
10640 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61  currently indica
10650 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61  ted by the itera
10660 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
10670 65 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69  e .  ** pIter->i
10680 4c 65 61 66 4f 66 66 73 65 74 20 69 73 20 61 6c  LeafOffset is al
10690 72 65 61 64 79 20 73 65 74 20 74 6f 20 70 6f 69  ready set to poi
106a0 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  nt to the positi
106b0 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a  on-list size.  *
106c0 2a 20 66 69 65 6c 64 20 61 73 73 6f 63 69 61 74  * field associat
106d0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
106e0 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64  t relevant rowid
106f0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20   on the page..  
10700 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70  **.  ** Or, if p
10710 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  Last is non-NULL
10720 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
10730 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
10740 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a  ins the last.  *
10750 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74 68 69 73  * rowid. In this
10760 20 63 61 73 65 20 63 6f 6e 66 69 67 75 72 65 20   case configure 
10770 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20  the iterator so 
10780 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
10790 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  o the.  ** first
107a0 20 72 6f 77 69 64 20 6f 6e 20 74 68 69 73 20 70   rowid on this p
107b0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
107c0 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74  pLast ){.    int
107d0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74 20   dummy;.    int 
107e0 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61  iOff;.    fts5Da
107f0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
10800 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
10810 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73  er->pLeaf = pLas
10820 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  t;.    pIter->iL
10830 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61  eafPgno = pgnoLa
10840 73 74 3b 0a 20 20 20 20 66 74 73 35 4c 65 61 66  st;.    fts5Leaf
10850 48 65 61 64 65 72 28 70 4c 61 73 74 2c 20 26 69  Header(pLast, &i
10860 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Off, &dummy);.  
10870 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
10880 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f  int(&pLast->p[iO
10890 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
108a0 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
108b0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
108c0 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a  et = iOff;.  }..
108d0 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
108e0 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
108f0 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
10900 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
10910 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
10920 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
10930 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  wid of a doclist
10940 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20  ..** There is a 
10950 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73  doclist-index as
10960 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10970 65 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20  e final term on 
10980 74 68 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20  the current .** 
10990 70 61 67 65 2e 20 49 66 20 74 68 65 20 63 75 72  page. If the cur
109a0 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65  rent term is the
109b0 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68   last term on th
109c0 65 20 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65  e page, load the
109d0 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64   .** doclist-ind
109e0 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64  ex from disk and
109f0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69   initialize an i
10a00 74 65 72 61 74 6f 72 20 61 74 20 28 70 49 74 65  terator at (pIte
10a10 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73  r->pDlidx)..*/.s
10a20 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
10a30 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28  egIterLoadDlidx(
10a40 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
10a50 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
10a60 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20  ){.  int iSeg = 
10a70 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
10a80 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20  gid;.  int bRev 
10a90 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  = (pIter->flags 
10aa0 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
10ab0 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44  EVERSE);.  Fts5D
10ac0 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
10ad0 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75  er->pLeaf; /* Cu
10ae0 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
10af0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  */..  assert( pI
10b00 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
10b10 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
10b20 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
10b30 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20  Iter->pDlidx==0 
10b40 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
10b50 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  f the current do
10b60 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68  clist ends on th
10b70 69 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64  is page. If it d
10b80 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  oes, return.  **
10b90 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c   early without l
10ba0 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  oading the docli
10bb0 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20  st-index (as it 
10bc0 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66  belongs to a dif
10bd0 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d  ferent.  ** term
10be0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72  . */.  if( pIter
10bf0 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d  ->iTermLeafPgno=
10c00 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
10c10 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  o ){.    int iOf
10c20 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
10c30 4f 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e  Offset + pIter->
10c40 6e 50 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65 28  nPos;.    while(
10c50 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29   iOff<pLeaf->n )
10c60 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d  {.      int bDum
10c70 6d 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50  my;.      int nP
10c80 6f 73 3b 0a 20 20 20 20 20 20 69 36 34 20 69 44  os;.      i64 iD
10c90 65 6c 74 61 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  elta;..      /* 
10ca0 69 4f 66 66 20 69 73 20 63 75 72 72 65 6e 74 6c  iOff is currentl
10cb0 79 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  y the offset of 
10cc0 74 68 65 20 73 74 61 72 74 20 6f 66 20 70 6f 73  the start of pos
10cd0 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20  ition list data 
10ce0 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  */.      iOff +=
10cf0 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61   getVarint(&pLea
10d00 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
10d10 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
10d20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
10d30 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
10d40 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c  assert_nc( iOff<
10d50 70 4c 65 61 66 2d 3e 6e 20 29 3b 0a 20 20 20 20  pLeaf->n );.    
10d60 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
10d70 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 4c  tPoslistSize(&pL
10d80 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e  eaf->p[iOff], &n
10d90 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
10da0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f       iOff += nPo
10db0 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  s;.    }.  }..  
10dc0 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20  pIter->pDlidx = 
10dd0 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
10de0 74 28 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c  t(p, bRev, iSeg,
10df0 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
10e00 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  fPgno);.}../*.**
10e10 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
10e20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20  object pIter to 
10e30 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54  point to term pT
10e40 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e  erm/nTerm within
10e50 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67   segment.** pSeg
10e60 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
10e70 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68   such term in th
10e80 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65  e index, the ite
10e90 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20  rator is set to 
10ea0 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  EOF..**.** If an
10eb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
10ec0 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
10ed0 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
10ee0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
10ef0 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
10f00 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
10f10 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
10f20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
10f30 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
10f40 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
10f50 64 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65  d fts5SegIterSee
10f60 6b 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  kInit(.  Fts5Ind
10f70 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
10f80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
10f90 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f   backend */.  co
10fa0 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
10fb0 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
10fc0 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
10fd0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
11000 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66   FTS5INDEX_XXX f
11010 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74  lags */.  Fts5St
11020 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
11030 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73  pSeg,     /* Des
11040 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d  cription of segm
11050 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ent */.  Fts5Seg
11060 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
11070 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
11080 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
11090 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d  /.){.  int iPg =
110a0 20 31 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69   1;.  int h;.  i
110b0 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67 73 20  nt bGe = (flags 
110c0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
110d0 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62  Y_SCAN);.  int b
110e0 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  Dlidx = 0;      
110f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
11100 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ue if there is a
11110 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a   doclist-index *
11120 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 47 65  /..  assert( bGe
11130 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
11140 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
11150 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73  DESC)==0 );.  as
11160 73 65 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e  sert( pTerm && n
11170 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74  Term );.  memset
11180 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
11190 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
111a0 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ter->pSeg = pSeg
111b0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  ;..  /* This blo
111c0 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20 76 61  ck sets stack va
111d0 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68  riable iPg to th
111e0 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  e leaf page numb
111f0 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a  er that may.  **
11200 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70   contain term (p
11210 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20  Term/nTerm), if 
11220 69 74 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  it is present in
11230 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f   the segment. */
11240 0a 20 20 66 6f 72 28 68 3d 70 53 65 67 2d 3e 6e  .  for(h=pSeg->n
11250 48 65 69 67 68 74 2d 31 3b 20 68 3e 30 3b 20 68  Height-1; h>0; h
11260 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 4e 6f 64  --){.    Fts5Nod
11270 65 49 74 65 72 20 6e 6f 64 65 3b 20 20 20 20 20  eIter node;     
11280 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
11290 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
112a0 68 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  h internal nodes
112b0 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77   */.    i64 iRow
112c0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
112d0 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
112e0 65 67 69 64 2c 20 68 2c 20 69 50 67 29 3b 0a 20  egid, h, iPg);. 
112f0 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 6f     Fts5Data *pNo
11300 64 65 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  de = fts5DataRea
11310 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  d(p, iRowid);.  
11320 20 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29    if( pNode==0 )
11330 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 66 74 73   break;..    fts
11340 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70 4e  5NodeIterInit(pN
11350 6f 64 65 2d 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e  ode->p, pNode->n
11360 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20 20 61 73  , &node);.    as
11370 73 65 72 74 28 20 6e 6f 64 65 2e 74 65 72 6d 2e  sert( node.term.
11380 6e 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 50 67  n==0 );..    iPg
11390 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a   = node.iChild;.
113a0 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64      bDlidx = nod
113b0 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20 66 6f  e.bDlidx;.    fo
113c0 72 28 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65  r(fts5NodeIterNe
113d0 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65  xt(&p->rc, &node
113e0 29 3b 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 2e  );.        node.
113f0 61 44 61 74 61 20 26 26 20 66 74 73 35 42 75 66  aData && fts5Buf
11400 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
11410 6e 6f 64 65 2e 74 65 72 6d 2c 20 70 54 65 72 6d  node.term, pTerm
11420 2c 20 6e 54 65 72 6d 29 3c 3d 30 3b 0a 20 20 20  , nTerm)<=0;.   
11430 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65       fts5NodeIte
11440 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e  rNext(&p->rc, &n
11450 6f 64 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ode).    ){.    
11460 20 20 69 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68    iPg = node.iCh
11470 69 6c 64 3b 0a 20 20 20 20 20 20 62 44 6c 69 64  ild;.      bDlid
11480 78 20 3d 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b  x = node.bDlidx;
11490 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4e  .    }.    fts5N
114a0 6f 64 65 49 74 65 72 46 72 65 65 28 26 6e 6f 64  odeIterFree(&nod
114b0 65 29 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  e);.    fts5Data
114c0 52 65 6c 65 61 73 65 28 70 4e 6f 64 65 29 3b 0a  Release(pNode);.
114d0 20 20 7d 0a 0a 20 20 69 66 28 20 69 50 67 3c 70    }..  if( iPg<p
114e0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  Seg->pgnoFirst )
114f0 7b 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65 67  {.    iPg = pSeg
11500 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20  ->pgnoFirst;.   
11510 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d   bDlidx = 0;.  }
11520 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ..  pIter->iLeaf
11530 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a  Pgno = iPg - 1;.
11540 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
11550 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
11560 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ..  if( pIter->p
11570 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  Leaf ){.    int 
11580 72 65 73 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  res;.    pIter->
11590 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
115a0 73 35 47 65 74 55 31 36 28 26 70 49 74 65 72 2d  s5GetU16(&pIter-
115b0 3e 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20  >pLeaf->p[2]);. 
115c0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
115d0 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
115e0 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67   0);.    fts5Seg
115f0 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
11600 70 49 74 65 72 29 3b 0a 20 20 20 20 64 6f 20 7b  pIter);.    do {
11610 0a 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73  .      res = fts
11620 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
11630 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
11640 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   pTerm, nTerm);.
11650 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
11660 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
11670 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
11680 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20  p, pIter, 0);.  
11690 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d    }while( pIter-
116a0 3e 70 4c 65 61 66 20 26 26 20 70 2d 3e 72 63 3d  >pLeaf && p->rc=
116b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
116c0 20 20 20 69 66 28 20 62 47 65 3d 3d 30 20 26 26     if( bGe==0 &&
116d0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a   res ){.      /*
116e0 20 53 65 74 20 69 74 65 72 61 74 6f 72 20 74 6f   Set iterator to
116f0 20 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20 2a 2f   point to EOF */
11700 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
11710 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
11720 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65  eaf);.      pIte
11730 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
11740 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
11750 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11760 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20  && bGe==0 ){.   
11770 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
11780 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
11790 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70  ETERM;.    if( p
117a0 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
117b0 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
117c0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
117d0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
117e0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
117f0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
11800 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  VERSE;.      }. 
11810 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78 20       if( bDlidx 
11820 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
11830 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28  egIterLoadDlidx(
11840 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
11850 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61   }.      if( fla
11860 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
11870 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
11880 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
11890 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65 72  Reverse(p, pIter
118a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
118b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
118c0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a  itialize the obj
118d0 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ect pIter to poi
118e0 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d  nt to term pTerm
118f0 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68  /nTerm within th
11900 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68  e.** in-memory h
11910 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68  ash table. If th
11920 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74  ere is no such t
11930 65 72 6d 20 69 6e 20 74 68 65 20 68 61 73 68 2d  erm in the hash-
11940 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69  table, the .** i
11950 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  terator is set t
11960 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  o EOF..**.** If 
11970 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11980 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73   Fts5Index.rc is
11990 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f   set to an appro
119a0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
119b0 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  e. If .** an err
119c0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
119d0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
119e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
119f0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
11a00 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
11a10 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 48  oid fts5SegIterH
11a20 61 73 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49  ashInit(.  Fts5I
11a30 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
11a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
11a50 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20  S5 backend */.  
11a60 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
11a70 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
11a80 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
11a90 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
11aa0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
11ab0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
11ac0 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
11ad0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
11ae0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
11af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11b00 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
11b10 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
11b20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
11b30 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a   int nList = 0;.
11b40 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20    const u8 *z = 
11b50 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  0;.  int n = 0;.
11b60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48  .  assert( p->pH
11b70 61 73 68 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ash );.  assert(
11b80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11b90 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72  K );..  if( pTer
11ba0 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  m==0 || (flags &
11bb0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
11bc0 5f 53 43 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d  _SCAN) ){.    p-
11bd0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
11be0 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d  5HashScanInit(p-
11bf0 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63  >pHash, (const c
11c00 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72  har*)pTerm, nTer
11c10 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  m);.    sqlite3F
11c20 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79  ts5HashScanEntry
11c30 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73  (p->pHash, (cons
11c40 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c  t char**)&z, &pL
11c50 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
11c60 20 20 6e 20 3d 20 28 7a 20 3f 20 73 74 72 6c 65    n = (z ? strle
11c70 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  n((const char*)z
11c80 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ) : 0);.  }else{
11c90 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
11ca0 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
11cb0 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73  R_ONETERM;.    s
11cc0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75  qlite3Fts5HashQu
11cd0 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63  ery(p->pHash, (c
11ce0 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d  onst char*)pTerm
11cf0 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c  , nTerm, &pList,
11d00 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20   &nList);.    z 
11d10 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d  = pTerm;.    n =
11d20 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69   nTerm;.  }..  i
11d30 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
11d40 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
11d50 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
11d60 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
11d70 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
11d80 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66  n, z);.    pLeaf
11d90 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63   = fts5IdxMalloc
11da0 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
11db0 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ata));.    if( p
11dc0 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
11dd0 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 52 65  ;.    pLeaf->nRe
11de0 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 65 61 66  f = 1;.    pLeaf
11df0 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74  ->p = (u8*)pList
11e00 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 20 3d  ;.    pLeaf->n =
11e10 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65   nList;.    pIte
11e20 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66  r->pLeaf = pLeaf
11e30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
11e40 61 66 4f 66 66 73 65 74 20 3d 20 67 65 74 56 61  afOffset = getVa
11e50 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28  rint(pLeaf->p, (
11e60 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
11e70 77 69 64 29 3b 0a 0a 20 20 20 20 69 66 28 20 66  wid);..    if( f
11e80 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
11e90 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20  _QUERY_DESC ){. 
11ea0 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
11eb0 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
11ec0 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
11ed0 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
11ee0 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
11ef0 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Iter);.    }else
11f00 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
11f10 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
11f20 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Iter);.    }.  }
11f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74  .}../*.** Zero t
11f40 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
11f50 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
11f60 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
11f70 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
11f80 74 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67  terClear(Fts5Seg
11f90 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
11fa0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
11fb0 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20  pIter->term);.  
11fc0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
11fd0 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
11fe0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
11ff0 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
12000 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49  f);.  fts5DlidxI
12010 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70  terFree(pIter->p
12020 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65  Dlidx);.  sqlite
12030 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52  3_free(pIter->aR
12040 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d  owidOffset);.  m
12050 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
12060 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74  sizeof(Fts5SegIt
12070 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  er));.}..#ifdef 
12080 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a  SQLITE_DEBUG../*
12090 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
120a0 6e 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  n is used as par
120b0 74 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73  t of the big ass
120c0 65 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20  ert() procedure 
120d0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a  implemented by.*
120e0 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  * fts5AssertMult
120f0 69 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74  iIterSetup(). It
12100 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
12110 65 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74  e result current
12120 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  ly stored.** in 
12130 2a 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72  *pRes is the cor
12140 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63  rect result of c
12150 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72  omparing the cur
12160 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f  rent positions o
12170 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65  f the.** two ite
12180 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
12190 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
121a0 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
121b0 74 28 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  t(.  Fts5MultiSe
121c0 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20  gIter *pIter, . 
121d0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
121e0 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ,.  Fts5SegIter 
121f0 2a 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73 75  *p2,.  Fts5CResu
12200 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e  lt *pRes.){.  in
12210 74 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74 65  t i1 = p1 - pIte
12220 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20 69  r->aSeg;.  int i
12230 32 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d 3e  2 = p2 - pIter->
12240 61 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d  aSeg;..  if( p1-
12250 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c  >pLeaf || p2->pL
12260 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 70  eaf ){.    if( p
12270 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  1->pLeaf==0 ){. 
12280 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
12290 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b  s->iFirst==i2 );
122a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
122b0 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  2->pLeaf==0 ){. 
122c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
122d0 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b  s->iFirst==i1 );
122e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
122f0 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e    int nMin = MIN
12300 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d  (p1->term.n, p2-
12310 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
12320 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
12330 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d  (p1->term.p, p2-
12340 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a  >term.p, nMin);.
12350 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
12360 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65 72   ) res = p1->ter
12370 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e  m.n - p2->term.n
12380 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  ;..      if( res
12390 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
123a0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65  ssert( pRes->bTe
123b0 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20  rmEq==1 );.     
123c0 20 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e 69     assert( p1->i
123d0 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69  Rowid!=p2->iRowi
123e0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73  d );.        res
123f0 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20   = ((p1->iRowid 
12400 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70  > p2->iRowid)==p
12410 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31  Iter->bRev) ? -1
12420 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   : 1;.      }els
12430 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
12440 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
12450 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ==0 );.      }..
12460 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
12470 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
12480 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
12490 3d 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  =i1 );.      }el
124a0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
124b0 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74  rt( pRes->iFirst
124c0 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ==i2 );.      }.
124d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
124e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
124f0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
12500 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ss SQLITE_DEBUG 
12510 69 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e 20  is defined when 
12520 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69  this module.** i
12530 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74  s compiled. In t
12540 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 66  hat case, this f
12550 75 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65 6e  unction is essen
12560 74 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72 74  tially an assert
12570 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
12580 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   used to verify 
12590 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
125a0 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e  s of the pIter->
125b0 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a  aFirst[] array.*
125c0 2a 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a  * are correct..*
125d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
125e0 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
125f0 72 53 65 74 75 70 28 46 74 73 35 49 6e 64 65 78  rSetup(Fts5Index
12600 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65   *p, Fts5MultiSe
12610 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
12620 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
12630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
12640 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
12650 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
12660 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73  i+=2){.      Fts
12670 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26  5SegIter *p1 = &
12680 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a  pIter->aSeg[i];.
12690 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
126a0 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e  r *p2 = &pIter->
126b0 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20  aSeg[i+1];.     
126c0 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52   Fts5CResult *pR
126d0 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69  es = &pIter->aFi
126e0 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67  rst[(pIter->nSeg
126f0 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20   + i) / 2];.    
12700 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70    fts5AssertComp
12710 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74  arisonResult(pIt
12720 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73  er, p1, p2, pRes
12730 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  );.    }..    fo
12740 72 28 69 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d  r(i=1; i<(pIter-
12750 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32  >nSeg / 2); i+=2
12760 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ){.      Fts5CRe
12770 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
12780 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a  ter->aFirst[i];.
12790 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
127a0 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  r *p1 = &pIter->
127b0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
127c0 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20  rst[i*2].iFirst 
127d0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
127e0 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
127f0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
12800 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46  aFirst[i*2+1].iF
12810 69 72 73 74 20 5d 3b 0a 0a 20 20 20 20 20 20 66  irst ];..      f
12820 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
12830 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
12840 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
12850 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
12860 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 41  e.# define fts5A
12870 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
12880 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  tup(x,y).#endif.
12890 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f  ./*.** Do the co
128a0 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61  mparison necessa
128b0 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70  ry to populate p
128c0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
128d0 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  t]..**.** If the
128e0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
128f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
12900 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65  n it is the inde
12910 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  x of an entry.**
12920 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
12930 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74  Seg[] array that
12940 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45   is (a) not at E
12950 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e  OF, and (b) poin
12960 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79  ting.** to a key
12970 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69   that is a dupli
12980 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c  cate of another,
12990 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79   higher priority
129a0 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74  , .** segment-it
129b0 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53  erator in the pS
129c0 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  eg->aSeg[] array
129d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
129e0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
129f0 6f 6d 70 61 72 65 28 46 74 73 35 4d 75 6c 74 69  ompare(Fts5Multi
12a00 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
12a10 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74  int iOut){.  int
12a20 20 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   i1;            
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12a40 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61  Index of left-ha
12a50 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
12a60 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20  /.  int i2;     
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12a90 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53  right-hand Fts5S
12aa0 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
12ab0 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49  iRes;.  Fts5SegI
12ac0 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20  ter *p1;        
12ad0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
12ae0 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
12af0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
12b00 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20  r *p2;          
12b10 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68        /* Right-h
12b20 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
12b30 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74  */.  Fts5CResult
12b40 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d   *pRes = &pIter-
12b50 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a  >aFirst[iOut];..
12b60 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70    assert( iOut<p
12b70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f  Iter->nSeg && iO
12b80 75 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ut>0 );.  assert
12b90 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30  ( pIter->bRev==0
12ba0 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76 3d   || pIter->bRev=
12bb0 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75  =1 );..  if( iOu
12bc0 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f  t>=(pIter->nSeg/
12bd0 32 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28  2) ){.    i1 = (
12be0 69 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53  iOut - pIter->nS
12bf0 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69  eg/2) * 2;.    i
12c00 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65  2 = i1 + 1;.  }e
12c10 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 49  lse{.    i1 = pI
12c20 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
12c30 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20  *2].iFirst;.    
12c40 69 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  i2 = pIter->aFir
12c50 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69 46 69  st[iOut*2+1].iFi
12c60 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20  rst;.  }.  p1 = 
12c70 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d  &pIter->aSeg[i1]
12c80 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72 2d  ;.  p2 = &pIter-
12c90 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 70 52  >aSeg[i2];..  pR
12ca0 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 30 3b  es->bTermEq = 0;
12cb0 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66  .  if( p1->pLeaf
12cc0 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
12cd0 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74 20   /* If p1 is at 
12ce0 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20  EOF */.    iRes 
12cf0 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = i2;.  }else if
12d00 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
12d10 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20 69  {     /* If p2 i
12d20 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20  s at EOF */.    
12d30 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c  iRes = i1;.  }el
12d40 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20  se{.    int res 
12d50 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  = fts5BufferComp
12d60 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26  are(&p1->term, &
12d70 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69  p2->term);.    i
12d80 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
12d90 20 20 20 61 73 73 65 72 74 28 20 69 32 3e 69 31     assert( i2>i1
12da0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12db0 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( i2!=0 );.     
12dc0 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d   pRes->bTermEq =
12dd0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 31   1;.      if( p1
12de0 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52  ->iRowid==p2->iR
12df0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
12e00 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d 3e 62  p1->bDel = p2->b
12e10 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Del;.        ret
12e20 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 7d 0a  urn i2;.      }.
12e30 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31        res = ((p1
12e40 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69  ->iRowid > p2->i
12e50 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
12e60 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a  Rev) ? -1 : +1;.
12e70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
12e80 28 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20  ( res!=0 );.    
12e90 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
12ea0 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20     iRes = i1;.  
12eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
12ec0 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a  Res = i2;.    }.
12ed0 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46 69    }..  pRes->iFi
12ee0 72 73 74 20 3d 20 69 52 65 73 3b 0a 20 20 72 65  rst = iRes;.  re
12ef0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
12f00 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74   Move the seg-it
12f10 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  er so that it po
12f20 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
12f30 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20  t rowid on page 
12f40 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74  iLeafPgno..** It
12f50 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20   is an error if 
12f60 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64  leaf iLeafPgno d
12f70 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
12f80 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77   contains no row
12f90 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ids..*/.static v
12fa0 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47  oid fts5SegIterG
12fb0 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49  otoPage(.  Fts5I
12fc0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
12fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
12fe0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
12ff0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
13000 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
13010 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13020 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
13030 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
13040 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c  .){.  assert( iL
13050 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
13060 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69  LeafPgno );..  i
13070 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74  f( iLeafPgno>pIt
13080 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  er->pSeg->pgnoLa
13090 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  st ){.    p->rc 
130a0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
130b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
130c0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
130d0 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a  er->pNextLeaf);.
130e0 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74      pIter->pNext
130f0 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49  Leaf = 0;.    pI
13100 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
13110 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20   iLeafPgno-1;.  
13120 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
13130 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
13140 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
13160 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
13170 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a  o==iLeafPgno );.
13180 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
13190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
131a0 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
131b0 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72     u8 *a = pIter
131c0 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
131d0 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d    int n = pIter-
131e0 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20  >pLeaf->n;..    
131f0 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74    iOff = fts5Get
13200 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20  U16(&a[0]);.    
13210 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
13220 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  iOff>=n ){.     
13230 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
13240 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
13250 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
13260 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  ff += getVarint(
13270 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
13280 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
13290 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
132a0 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
132b0 66 66 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ff;.        fts5
132c0 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
132d0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
132e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
132f0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
13300 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
13310 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
13320 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69  argument until i
13330 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70  t is at or .** p
13340 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e  ast rowid iFrom.
13350 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
13360 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72 6f  he value of iFro
13370 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  m, the iterator 
13380 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64 76  is.** always adv
13390 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f  anced at least o
133a0 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nce..*/.static v
133b0 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
133c0 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49  extFrom(.  Fts5I
133d0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
133e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
133f0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
13400 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
13410 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
13420 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13430 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
13440 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20 20 20  .  i64 iMatch   
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74     /* Advance it
13470 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74 20  erator at least 
13480 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20  this far */.){. 
13490 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74   int bRev = (pIt
134a0 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
134b0 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
134c0 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  );.  Fts5DlidxIt
134d0 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74  er *pDlidx = pIt
134e0 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e  er->pDlidx;.  in
134f0 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49  t iLeafPgno = pI
13500 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  ter->iLeafPgno;.
13510 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b    int bMove = 1;
13520 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
13530 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
13540 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
13550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
13560 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20  er->pDlidx );.  
13570 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
13580 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20 62  Leaf );..  if( b
13590 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68  Rev==0 ){.    wh
135a0 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49  ile( !fts5DlidxI
135b0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
135c0 29 20 26 26 20 69 4d 61 74 63 68 3e 66 74 73 35  ) && iMatch>fts5
135d0 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
135e0 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20  Dlidx) ){.      
135f0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35  iLeafPgno = fts5
13600 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
13610 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73  lidx);.      fts
13620 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
13630 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d  , pDlidx);.    }
13640 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20  .    assert_nc( 
13650 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72  iLeafPgno>=pIter
13660 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70  ->iLeafPgno || p
13670 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20  ->rc );.    if( 
13680 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
13690 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
136a0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 47      fts5SegIterG
136b0 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65 72  otoPage(p, pIter
136c0 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  , iLeafPgno);.  
136d0 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20      bMove = 0;. 
136e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
136f0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
13700 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b  >pNextLeaf==0 );
13710 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 61  .    assert( iMa
13720 74 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77 69  tch<pIter->iRowi
13730 64 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  d );.    while( 
13740 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f  !fts5DlidxIterEo
13750 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20  f(p, pDlidx) && 
13760 69 4d 61 74 63 68 3c 66 74 73 35 44 6c 69 64 78  iMatch<fts5Dlidx
13770 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
13780 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  ) ){.      fts5D
13790 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20  lidxIterPrev(p, 
137a0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20  pDlidx);.    }. 
137b0 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66     iLeafPgno = f
137c0 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
137d0 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 61  (pDlidx);..    a
137e0 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78  ssert( fts5Dlidx
137f0 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
13800 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c  x) || iLeafPgno<
13810 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
13820 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c  o );..    if( iL
13830 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69  eafPgno<pIter->i
13840 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
13850 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
13860 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31  no = iLeafPgno+1
13870 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  ;.      fts5SegI
13880 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
13890 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
138a0 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20     bMove = 0;.  
138b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65    }.  }..  while
138c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
138d0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4d  OK ){.    if( bM
138e0 6f 76 65 20 29 20 66 74 73 35 53 65 67 49 74 65  ove ) fts5SegIte
138f0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
13900 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  0);.    if( pIte
13910 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72  r->pLeaf==0 ) br
13920 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65  eak;.    if( bRe
13930 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69  v==0 && pIter->i
13940 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
13950 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
13960 52 65 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d  Rev!=0 && pIter-
13970 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20  >iRowid<=iMatch 
13980 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f  ) break;.    bMo
13990 76 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ve = 1;.  }.}...
139a0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69  /*.** Free the i
139b0 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
139c0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
139d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
139e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
139f0 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46  5MultiIterFree(F
13a00 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
13a10 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
13a20 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
13a30 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  er ){.    int i;
13a40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13a50 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b  pIter->nSeg; i++
13a60 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
13a70 49 74 65 72 43 6c 65 61 72 28 26 70 49 74 65 72  IterClear(&pIter
13a80 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20  ->aSeg[i]);.    
13a90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
13aa0 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  ee(pIter);.  }.}
13ab0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
13ac0 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
13ad0 63 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ced(.  Fts5Index
13ae0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13af0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
13b00 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
13b10 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
13b20 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
13b30 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  pIter,        /*
13b40 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64   Iterator to upd
13b50 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72  ate aFirst[] arr
13b60 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ay for */.  int 
13b70 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20  iChanged,       
13b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13b90 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72  ndex of sub-iter
13ba0 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63  ator just advanc
13bb0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e  ed */.  int iMin
13bc0 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
13bd0 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
13be0 75 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72  um entry in aFir
13bf0 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29  st[] to set */.)
13c00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
13c10 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b  (i=(pIter->nSeg+
13c20 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d  iChanged)/2; i>=
13c30 69 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63  iMinset && p->rc
13c40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69  ==SQLITE_OK; i=i
13c50 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71  /2){.    int iEq
13c60 3b 0a 20 20 20 20 69 66 28 20 28 69 45 71 20 3d  ;.    if( (iEq =
13c70 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f   fts5MultiIterDo
13c80 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69  Compare(pIter, i
13c90 29 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  )) ){.      fts5
13ca0 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26  SegIterNext(p, &
13cb0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d  pIter->aSeg[iEq]
13cc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  , 0);.      i = 
13cd0 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45  pIter->nSeg + iE
13ce0 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  q;.    }.  }.}..
13cf0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
13d00 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52  ultiIterAdvanceR
13d10 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
13d20 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
13d30 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
13d40 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
13d50 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
13d60 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
13d70 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f  *pIter,        /
13d80 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70  * Iterator to up
13d90 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72  date aFirst[] ar
13da0 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ray for */.  int
13db0 20 69 43 68 61 6e 67 65 64 20 20 20 20 20 20 20   iChanged       
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13dd0 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65  Index of sub-ite
13de0 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e  rator just advan
13df0 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ced */.){.  int 
13e00 69 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  i;.  Fts5SegIter
13e10 20 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d   *pNew = &pIter-
13e20 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b  >aSeg[iChanged];
13e30 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
13e40 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
13e50 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e  >aSeg[iChanged ^
13e60 20 30 78 30 30 30 31 5d 3b 0a 0a 20 20 66 6f 72   0x0001];..  for
13e70 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b  (i=(pIter->nSeg+
13e80 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 70 2d 3e  iChanged)/2; p->
13e90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
13ea0 3d 69 2f 32 29 7b 0a 20 20 20 20 46 74 73 35 43  =i/2){.    Fts5C
13eb0 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
13ec0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d  pIter->aFirst[i]
13ed0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
13ee0 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20  New->pLeaf );.  
13ef0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13f00 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f  bTermEq==0 || pO
13f10 74 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 20  ther->pLeaf );. 
13f20 20 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 73     .    if( pRes
13f30 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20  ->bTermEq ){.   
13f40 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f     if( pNew->iRo
13f50 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f  wid==pOther->iRo
13f60 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  wid ){.        r
13f70 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
13f80 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72  else if( (pOther
13f90 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69  ->iRowid>pNew->i
13fa0 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
13fb0 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Rev ){.        p
13fc0 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20  New = pOther;.  
13fd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13fe0 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28  pRes->iFirst = (
13ff0 70 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53  pNew - pIter->aS
14000 65 67 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  eg);.    if( i==
14010 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  1 ) break;..    
14020 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
14030 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
14040 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d  irst[i ^ 0x0001]
14050 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 7d 0a 0a  .iFirst ];.  }..
14060 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
14070 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
14080 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
14090 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
140a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
140b0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
140c0 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
140d0 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69  s5Index.rc. It i
140e0 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  s not .** consid
140f0 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
14100 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
14110 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66  aches EOF, or if
14120 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
14130 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74  t .** EOF when t
14140 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14150 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
14160 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
14170 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35  IterNext(.  Fts5
14180 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
14190 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
141a0 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f  Iter,.  int bFro
141b0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
141c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
141d0 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f  if argument iFro
141e0 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  m is valid */.  
141f0 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20  i64 iFrom       
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65  /* Advance at le
14220 61 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68  ast as far as th
14230 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  is */.){.  if( p
14240 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14250 29 7b 0a 20 20 20 20 69 6e 74 20 62 55 73 65 46  ){.    int bUseF
14260 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 20  rom = bFrom;.   
14270 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   do {.      int 
14280 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e  iFirst = pIter->
14290 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
142a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77  ;.      int bNew
142b0 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
142c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
142d0 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
142e0 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  [iFirst];.      
142f0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
14300 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
14310 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26    if( bUseFrom &
14320 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29  & pSeg->pDlidx )
14330 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
14340 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c  gIterNextFrom(p,
14350 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20   pSeg, iFrom);. 
14360 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14370 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
14380 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e  ext(p, pSeg, &bN
14390 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d  ewTerm);.      }
143a0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67  ..      if( pSeg
143b0 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e  ->pLeaf==0 || bN
143c0 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c  ewTerm .       |
143d0 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  | fts5MultiIterA
143e0 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c 20 70  dvanceRowid(p, p
143f0 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a 20 20  Iter, iFirst).  
14400 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66      ){.        f
14410 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
14420 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69  nced(p, pIter, i
14430 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  First, 1);.     
14440 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73 73   }.      fts5Ass
14450 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
14460 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  p(p, pIter);..  
14470 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30      bUseFrom = 0
14480 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49  ;.    }while( pI
14490 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  ter->bSkipEmpty 
144a0 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  && fts5MultiIter
144b0 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72  IsEmpty(p, pIter
144c0 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ) );.  }.}../*.*
144d0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
144e0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
144f0 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
14500 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
14510 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
14520 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64  terate through d
14530 61 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65  ata in structure
14540 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20   pStruct..** If 
14550 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74  iLevel is -ve, t
14560 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20  hen all data in 
14570 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20  all segments is 
14580 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69  merged. Or, if i
14590 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f  Level.** is zero
145a0 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74   or greater, dat
145b0 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  a from the first
145c0 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e   nSegment segmen
145d0 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76  ts on level iLev
145e0 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e  el.** is merged.
145f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
14600 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f  tor initially po
14610 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
14620 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74  t term/rowid ent
14630 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74  ry in the .** it
14640 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  erated data..*/.
14650 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14660 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20  MultiIterNew(.  
14670 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
146a0 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
146b0 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  n */.  Fts5Struc
146c0 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20  ture *pStruct,  
146d0 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
146e0 75 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20  ure of specific 
146f0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62  index */.  int b
14700 53 6b 69 70 45 6d 70 74 79 2c 20 20 20 20 20 20  SkipEmpty,      
14710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14720 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 64 65 6c  ue to ignore del
14730 65 74 65 2d 6b 65 79 73 20 2a 2f 0a 20 20 69 6e  ete-keys */.  in
14740 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14760 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
14770 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
14780 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
14790 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
147a0 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
147b0 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a  to (or NULL/0) *
147c0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
147f0 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20  iterate (-1 for 
14800 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  all) */.  int nS
14810 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20  egment,         
14820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14830 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
14840 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c  to merge (iLevel
14850 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 4d 75  >=0) */.  Fts5Mu
14860 6c 74 69 53 65 67 49 74 65 72 20 2a 2a 70 70 4f  ltiSegIter **ppO
14870 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77  ut        /* New
14880 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
14890 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
148c0 6d 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73  ment-iters in us
148d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  e */.  int nSlot
148e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
148f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20         /* Power 
14900 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a  of two >= nSeg *
14910 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20  /.  int iIter = 
14920 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14930 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20      /* */.  int 
14940 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
14950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
14960 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
14970 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
14980 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
14990 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
149a0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
149b0 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65  r *pNew;..  asse
149c0 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20 26 26  rt( (pTerm==0 &&
149d0 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c   nTerm==0) || iL
149e0 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20  evel<0 );..  /* 
149f0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
14a00 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c 74 69  or the new multi
14a10 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a  -seg-iterator. *
14a20 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  /.  if( p->rc==S
14a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14a40 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a  if( iLevel<0 ){.
14a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
14a60 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d  truct->nSegment=
14a70 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f  =fts5StructureCo
14a80 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72  untSegments(pStr
14a90 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e 53  uct) );.      nS
14aa0 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53  eg = pStruct->nS
14ab0 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20 6e 53  egment;.      nS
14ac0 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73 68 20  eg += (p->pHash 
14ad0 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d 65  ? 1 : 0);.    }e
14ae0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65 67 20  lse{.      nSeg 
14af0 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e 61  = MIN(pStruct->a
14b00 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53  Level[iLevel].nS
14b10 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20  eg, nSegment);. 
14b20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6e 53 6c     }.    for(nSl
14b30 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67  ot=2; nSlot<nSeg
14b40 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29  ; nSlot=nSlot*2)
14b50 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20  ;.  }..  *ppOut 
14b60 3d 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78  = pNew = fts5Idx
14b70 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20  Malloc(p, .     
14b80 20 73 69 7a 65 6f 66 28 46 74 73 35 4d 75 6c 74   sizeof(Fts5Mult
14b90 69 53 65 67 49 74 65 72 29 20 2b 20 20 20 20 20  iSegIter) +     
14ba0 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a       /* pNew */.
14bb0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
14bc0 35 53 65 67 49 74 65 72 29 20 2a 20 6e 53 6c 6f  5SegIter) * nSlo
14bd0 74 20 2b 20 20 20 20 20 20 20 2f 2a 20 70 4e 65  t +       /* pNe
14be0 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20  w->aSeg[] */.   
14bf0 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52     sizeof(Fts5CR
14c00 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20  esult) * nSlot  
14c10 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e         /* pNew->
14c20 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b  aFirst[] */.  );
14c30 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
14c40 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d   return;.  pNew-
14c50 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20  >nSeg = nSlot;. 
14c60 20 70 4e 65 77 2d 3e 61 53 65 67 20 3d 20 28 46   pNew->aSeg = (F
14c70 74 73 35 53 65 67 49 74 65 72 2a 29 26 70 4e 65  ts5SegIter*)&pNe
14c80 77 5b 31 5d 3b 0a 20 20 70 4e 65 77 2d 3e 61 46  w[1];.  pNew->aF
14c90 69 72 73 74 20 3d 20 28 46 74 73 35 43 52 65 73  irst = (Fts5CRes
14ca0 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65 67  ult*)&pNew->aSeg
14cb0 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 70 4e 65 77 2d  [nSlot];.  pNew-
14cc0 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61  >bRev = (0!=(fla
14cd0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
14ce0 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70  UERY_DESC));.  p
14cf0 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
14d00 3d 20 62 53 6b 69 70 45 6d 70 74 79 3b 0a 0a 20  = bSkipEmpty;.. 
14d10 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65   /* Initialize e
14d20 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  ach of the compo
14d30 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65  nent segment ite
14d40 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28  rators. */.  if(
14d50 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
14d60 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
14d70 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74  vel *pEnd = &pSt
14d80 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  ruct->aLevel[pSt
14d90 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
14da0 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20     if( p->pHash 
14db0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  ){.      /* Add 
14dc0 61 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  a segment iterat
14dd0 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  or for the curre
14de0 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
14df0 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a  he hash table. *
14e00 2f 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  /.      Fts5SegI
14e10 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
14e20 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
14e30 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ];.      fts5Seg
14e40 49 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c 20  IterHashInit(p, 
14e50 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c  pTerm, nTerm, fl
14e60 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  ags, pIter);.   
14e70 20 7d 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d   }.    for(pLvl=
14e80 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
14e90 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20  [0]; pLvl<pEnd; 
14ea0 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66  pLvl++){.      f
14eb0 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53  or(iSeg=pLvl->nS
14ec0 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
14ed0 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Seg--){.        
14ee0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
14ef0 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
14f00 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
14f10 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
14f20 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
14f30 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
14f40 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
14f50 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Term==0 ){.     
14f60 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14f70 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70 49  Init(p, pSeg, pI
14f80 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ter);.        }e
14f90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
14fa0 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
14fb0 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65  it(p, pTerm, nTe
14fc0 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c  rm, flags, pSeg,
14fd0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
14fe0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14ff0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
15000 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
15010 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20  Level[iLevel];. 
15020 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67     for(iSeg=nSeg
15030 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65  -1; iSeg>=0; iSe
15040 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73 35  g--){.      fts5
15050 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 26  SegIterInit(p, &
15060 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
15070 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  , &pNew->aSeg[iI
15080 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20  ter++]);.    }. 
15090 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 49 74   }.  assert( iIt
150a0 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f  er==nSeg );..  /
150b0 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 77  * If the above w
150c0 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65  as successful, e
150d0 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74  ach component it
150e0 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e  erators now poin
150f0 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ts .  ** to the 
15100 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69  first entry in i
15110 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74  ts segment. In t
15120 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c  his case initial
15130 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46  ize the .  ** aF
15140 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72  irst[] array. Or
15150 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  , if an error ha
15160 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65  s occurred, free
15170 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20   the iterator.  
15180 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65  ** object and se
15190 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
151a0 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20  iable to NULL.  
151b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
151c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
151d0 20 66 6f 72 28 69 49 74 65 72 3d 6e 53 6c 6f 74   for(iIter=nSlot
151e0 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74  -1; iIter>0; iIt
151f0 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74  er--){.      int
15200 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20   iEq;.      if( 
15210 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
15220 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e  IterDoCompare(pN
15230 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20  ew, iIter)) ){. 
15240 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
15250 65 72 4e 65 78 74 28 70 2c 20 26 70 4e 65 77 2d  erNext(p, &pNew-
15260 3e 61 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a  >aSeg[iEq], 0);.
15270 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
15280 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c  iIterAdvanced(p,
15290 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65   pNew, iEq, iIte
152a0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
152b0 7d 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74  }.    fts5Assert
152c0 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70  MultiIterSetup(p
152d0 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66  , pNew);..    if
152e0 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70  ( pNew->bSkipEmp
152f0 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49  ty && fts5MultiI
15300 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e  terIsEmpty(p, pN
15310 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ew) ){.      fts
15320 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
15330 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20  , pNew, 0, 0);. 
15340 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
15350 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
15360 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ree(p, pNew);.  
15370 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20    *ppOut = 0;.  
15380 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
15390 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
153a0 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46  erator is at EOF
153b0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
153c0 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a  has occurred. .*
153d0 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73  * False otherwis
153e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
153f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
15400 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  f(Fts5Index *p, 
15410 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
15420 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
15430 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74  rn (p->rc || pIt
15440 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
15450 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15460 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d  t ].pLeaf==0);.}
15470 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
15480 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
15490 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69  entry that the i
154a0 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c  terator currentl
154b0 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20  y points.** to. 
154c0 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
154d0 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68  points to EOF wh
154e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
154f0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a   is called the.*
15500 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  * results are un
15510 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
15520 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69  ic i64 fts5Multi
15530 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 4d 75  IterRowid(Fts5Mu
15540 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
15550 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  r){.  assert( pI
15560 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
15570 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
15580 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20  st ].pLeaf );.  
15590 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 53  return pIter->aS
155a0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
155b0 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52  t[1].iFirst ].iR
155c0 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  owid;.}../*.** M
155d0 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ove the iterator
155e0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
155f0 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69  ry at or followi
15600 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74  ng iMatch..*/.st
15610 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
15620 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ltiIterNextFrom(
15630 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
15640 20 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67   .  Fts5MultiSeg
15650 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
15660 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20  i64 iMatch.){.  
15670 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
15680 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
15690 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
156a0 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69  t(p, pIter, 1, i
156b0 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20  Match);.    if( 
156c0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
156d0 28 70 2c 20 70 49 74 65 72 29 20 29 20 62 72 65  (p, pIter) ) bre
156e0 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d  ak;.    iRowid =
156f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
15700 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20  wid(pIter);.    
15710 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d  if( pIter->bRev=
15720 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d  =0 && iRowid>=iM
15730 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
15740 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65    if( pIter->bRe
15750 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d  v!=0 && iRowid<=
15760 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
15770 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
15780 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
15790 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
157a0 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73  ning the term as
157b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
157c0 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74  e .** entry that
157d0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75   the iterator cu
157e0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
157f0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  o..*/.static con
15800 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69  st u8 *fts5Multi
15810 49 74 65 72 54 65 72 6d 28 46 74 73 35 4d 75 6c  IterTerm(Fts5Mul
15820 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
15830 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74  , int *pn){.  Ft
15840 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26  s5SegIter *p = &
15850 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
15860 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
15870 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20  irst ];.  *pn = 
15880 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74  p->term.n;.  ret
15890 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d  urn p->term.p;.}
158a0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
158b0 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a  s5ChunkIterate(.
158c0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63    /* Index objec
158f0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
15900 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20  er *pSeg,       
15910 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73         /* Poslis
15920 74 20 6f 66 20 74 68 69 73 20 69 74 65 72 61 74  t of this iterat
15930 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  or */.  void *pC
15940 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
15950 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
15960 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78  xt pointer for x
15970 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a  Chunk callback *
15980 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e  /.  void (*xChun
15990 6b 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76  k)(Fts5Index*, v
159a0 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c  oid*, const u8*,
159b0 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e   int).){.  int n
159c0 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  Rem = pSeg->nPos
159d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
159e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 73 74  mber of bytes st
159f0 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20  ill to come */. 
15a00 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
15a10 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75   = 0;.  u8 *pChu
15a20 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61  nk = &pSeg->pLea
15a30 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
15a40 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e  Offset];.  int n
15a50 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d  Chunk = MIN(nRem
15a60 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 6e  , pSeg->pLeaf->n
15a70 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66   - pSeg->iLeafOf
15a80 66 73 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e  fset);.  int pgn
15a90 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50  o = pSeg->iLeafP
15aa0 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53  gno;.  int pgnoS
15ab0 61 76 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ave = 0;..  if( 
15ac0 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46  (pSeg->flags & F
15ad0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
15ae0 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  RSE)==0 ){.    p
15af0 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31  gnoSave = pgno+1
15b00 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
15b10 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28  1 ){.    xChunk(
15b20 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c  p, pCtx, pChunk,
15b30 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52   nChunk);.    nR
15b40 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20  em -= nChunk;.  
15b50 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
15b60 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66  e(pData);.    if
15b70 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20  ( nRem<=0 ){.   
15b80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
15b90 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b  lse{.      pgno+
15ba0 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d  +;.      pData =
15bb0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
15bc0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
15bd0 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e  WID(pSeg->pSeg->
15be0 69 53 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f 29  iSegid, 0, pgno)
15bf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  );.      if( pDa
15c00 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ta==0 ) break;. 
15c10 20 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70       pChunk = &p
15c20 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20  Data->p[4];.    
15c30 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e    nChunk = MIN(n
15c40 52 65 6d 2c 20 70 44 61 74 61 2d 3e 6e 20 2d 20  Rem, pData->n - 
15c50 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  4);.      if( pg
15c60 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b 0a  no==pgnoSave ){.
15c70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15c80 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 3d  pSeg->pNextLeaf=
15c90 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
15ca0 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20  eg->pNextLeaf = 
15cb0 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70  pData;.        p
15cc0 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  Data = 0;.      
15cd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
15ce0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
15cf0 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
15d00 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
15d10 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 65 20  re pStruct. The 
15d20 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69  new segment.** i
15d30 64 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  d must be betwee
15d40 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e  n 1 and 65335 in
15d50 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73  clusive, and mus
15d60 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79  t not be used by
15d70 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74   .** any current
15d80 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d  ly existing segm
15d90 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65 20 73  ent. If a free s
15da0 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74  egment id cannot
15db0 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51   be found,.** SQ
15dc0 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74  LITE_FULL is ret
15dd0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
15de0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
15df0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
15e00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15e10 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a  a no-op. 0 is .*
15e20 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  * returned in th
15e30 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
15e40 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63  ic int fts5Alloc
15e50 61 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64  ateSegid(Fts5Ind
15e60 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
15e70 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
15e80 20 20 75 33 32 20 69 53 65 67 69 64 20 3d 20 30    u32 iSegid = 0
15e90 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
15ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15eb0 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53   if( pStruct->nS
15ec0 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58  egment>=FTS5_MAX
15ed0 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20  _SEGMENT ){.    
15ee0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
15ef0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _FULL;.    }else
15f00 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
15f10 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
15f20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
15f30 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
15f40 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
15f50 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76 6f 69  izeof(u32), (voi
15f60 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20 20 20  d*)&iSegid);.   
15f70 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 28 69       iSegid = (i
15f80 53 65 67 69 64 20 25 20 28 28 31 20 3c 3c 20 46  Segid % ((1 << F
15f90 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d  TS5_DATA_ID_B) -
15fa0 20 32 29 29 20 2b 20 31 3b 0a 20 20 20 20 20 20   2)) + 1;.      
15fb0 20 20 61 73 73 65 72 74 28 20 69 53 65 67 69 64    assert( iSegid
15fc0 3e 30 20 26 26 20 69 53 65 67 69 64 3c 3d 36 35  >0 && iSegid<=65
15fd0 35 33 35 20 29 3b 0a 20 20 20 20 20 20 20 20 66  535 );.        f
15fe0 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
15ff0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
16000 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
16010 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
16020 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
16030 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
16040 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
16050 20 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64        if( iSegid
16060 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ==pStruct->aLeve
16070 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
16080 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20  g].iSegid ){.   
16090 20 20 20 20 20 20 20 20 20 20 20 69 53 65 67 69             iSegi
160a0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
160b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
160c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
160d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
160e0 72 65 74 75 72 6e 20 28 69 6e 74 29 69 53 65 67  return (int)iSeg
160f0 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  id;.}../*.** Dis
16100 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75  card all data cu
16110 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69  rrently cached i
16120 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
16130 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
16140 64 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61  d fts5IndexDisca
16150 72 64 44 61 74 61 28 46 74 73 35 49 6e 64 65 78  rdData(Fts5Index
16160 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
16170 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e  p->pHash || p->n
16180 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29  PendingData==0 )
16190 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68  ;.  if( p->pHash
161a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   ){.    sqlite3F
161b0 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e  ts5HashClear(p->
161c0 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e  pHash);.    p->n
161d0 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b  PendingData = 0;
161e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
161f0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
16200 20 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20   the prefix, in 
16210 62 79 74 65 73 2c 20 74 68 61 74 20 62 75 66 66  bytes, that buff
16220 65 72 20 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73  er (nNew/pNew) s
16230 68 61 72 65 73 0a 2a 2a 20 77 69 74 68 20 62 75  hares.** with bu
16240 66 66 65 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29  ffer (nOld/pOld)
16250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16260 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
16270 73 73 28 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20  ss(.  int nOld, 
16280 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a  const u8 *pOld,.
16290 20 20 69 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73    int nNew, cons
162a0 74 20 75 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20  t u8 *pNew.){.  
162b0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
162c0 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65   fts5BlobCompare
162d0 28 70 4f 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e 65  (pOld, nOld, pNe
162e0 77 2c 20 6e 4e 65 77 29 3c 30 20 29 3b 0a 20 20  w, nNew)<0 );.  
162f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
16300 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
16310 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20  Old[i]!=pNew[i] 
16320 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
16330 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74  eturn i;.}..stat
16340 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
16350 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46  eDlidxClear(.  F
16360 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
16370 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
16380 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46  Writer,.  int bF
16390 6c 75 73 68 20 20 20 20 20 20 20 20 20 20 20 20  lush            
163a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
163b0 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64  true, write dlid
163c0 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a  x to disk */.){.
163d0 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
163e0 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20  t( bFlush==0 || 
163f0 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  (pWriter->nDlidx
16400 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  >0 && pWriter->a
16410 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
16420 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
16430 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
16440 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  x; i++){.    Fts
16450 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
16460 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
16470 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20  >aDlidx[i];.    
16480 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  if( pDlidx->buf.
16490 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  n==0 ) break;.  
164a0 20 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a    if( bFlush ){.
164b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
164c0 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b  lidx->pgno!=0 );
164d0 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
164e0 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
164f0 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
16500 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
16510 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e  gid, i, pDlidx->
16520 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  pgno),.         
16530 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20   pDlidx->buf.p, 
16540 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20  pDlidx->buf.n.  
16550 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
16560 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
16570 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e  erZero(&pDlidx->
16580 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78  buf);.    pDlidx
16590 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30  ->bPrevValid = 0
165a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
165b0 72 6f 77 20 74 68 65 20 70 57 72 69 74 65 72 2d  row the pWriter-
165c0 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20  >aDlidx[] array 
165d0 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c  to at least nLvl
165e0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a   elements in siz
165f0 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72  e..** Any new ar
16600 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  ray elements are
16610 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72   zeroed before r
16620 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
16630 74 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74  tic int fts5Writ
16640 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74  eDlidxGrow(.  Ft
16650 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
16660 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
16670 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c  iter,.  int nLvl
16680 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
16690 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c  =SQLITE_OK && nL
166a0 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c  vl>=pWriter->nDl
166b0 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
166c0 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69  lidxWriter *aDli
166d0 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57  dx = (Fts5DlidxW
166e0 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72  riter*)sqlite3_r
166f0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
16700 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c  pWriter->aDlidx,
16710 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
16720 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a  xWriter) * nLvl.
16730 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61      );.    if( a
16740 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Dlidx==0 ){.    
16750 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16760 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
16770 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  e{.      int nBy
16780 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
16790 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 28  DlidxWriter) * (
167a0 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e  nLvl - pWriter->
167b0 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d  nDlidx);.      m
167c0 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57  emset(&aDlidx[pW
167d0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20  riter->nDlidx], 
167e0 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
167f0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
16800 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20   = aDlidx;.     
16810 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
16820 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20   = nLvl;.    }. 
16830 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72   }.  return p->r
16840 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  c;.}../*.** If a
16850 6e 20 22 6e 45 6d 70 74 79 22 20 72 65 63 6f 72  n "nEmpty" recor
16860 64 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  d must be writte
16870 6e 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  n to the b-tree 
16880 62 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 0a  before the next.
16890 2a 2a 20 74 65 72 6d 2c 20 77 72 69 74 65 20 69  ** term, write i
168a0 74 20 6e 6f 77 2e 20 0a 2a 2f 0a 73 74 61 74 69  t now. .*/.stati
168b0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
168c0 42 74 72 65 65 4e 45 6d 70 74 79 28 46 74 73 35  BtreeNEmpty(Fts5
168d0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
168e0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
168f0 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ){.  if( pWriter
16900 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20  ->nEmpty ){.    
16910 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20  int bFlag = 0;. 
16920 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
16930 72 20 2a 70 50 67 3b 0a 20 20 20 20 70 50 67 20  r *pPg;.    pPg 
16940 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
16950 74 65 72 5b 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20  ter[1];..    /* 
16960 49 66 20 74 68 65 72 65 20 77 65 72 65 20 46 54  If there were FT
16970 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
16980 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20  E or more empty 
16990 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74  leaf pages writt
169a0 65 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  en.    ** to the
169b0 20 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20   database, also 
169c0 77 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73  write the doclis
169d0 74 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e  t-index to disk.
169e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72    */.    if( pWr
169f0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
16a00 62 75 66 2e 6e 3e 30 20 26 26 20 70 57 72 69 74  buf.n>0 && pWrit
16a10 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35  er->nEmpty>=FTS5
16a20 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
16a30 29 7b 0a 20 20 20 20 20 20 62 46 6c 61 67 20 3d  ){.      bFlag =
16a40 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74   1;.    }.    ft
16a50 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61  s5WriteDlidxClea
16a60 72 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46  r(p, pWriter, bF
16a70 6c 61 67 29 3b 0a 20 20 20 20 66 74 73 35 42 75  lag);.    fts5Bu
16a80 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
16a90 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62  (&p->rc, &pPg->b
16aa0 75 66 2c 20 62 46 6c 61 67 29 3b 0a 20 20 20 20  uf, bFlag);.    
16ab0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
16ac0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
16ad0 70 50 67 2d 3e 62 75 66 2c 20 70 57 72 69 74 65  pPg->buf, pWrite
16ae0 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20  r->nEmpty);.    
16af0 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20  pWriter->nEmpty 
16b00 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
16b10 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
16b20 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65 72  Clear(p, pWriter
16b30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  , 0);.  }..  ass
16b40 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 6e 44  ert( pWriter->nD
16b50 6c 69 64 78 3d 3d 30 20 7c 7c 20 70 57 72 69 74  lidx==0 || pWrit
16b60 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
16b70 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  f.n==0 );.  asse
16b80 72 74 28 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c  rt( pWriter->nDl
16b90 69 64 78 3d 3d 30 20 7c 7c 20 70 57 72 69 74 65  idx==0 || pWrite
16ba0 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 50 72  r->aDlidx[0].bPr
16bb0 65 76 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 7d 0a  evValid==0 );.}.
16bc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16bd0 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28  5WriteBtreeGrow(
16be0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
16bf0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
16c00 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  iter){.  if( p->
16c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16c20 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69  .    Fts5PageWri
16c30 74 65 72 20 2a 61 4e 65 77 3b 0a 20 20 20 20 46  ter *aNew;.    F
16c40 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
16c50 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65  New;.    int nNe
16c60 77 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 50  w = sizeof(Fts5P
16c70 61 67 65 57 72 69 74 65 72 29 20 2a 20 28 70 57  ageWriter) * (pW
16c80 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 2b 31  riter->nWriter+1
16c90 29 3b 0a 0a 20 20 20 20 61 4e 65 77 20 3d 20 28  );..    aNew = (
16ca0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29  Fts5PageWriter*)
16cb0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
16cc0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
16cd0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , nNew);.    if(
16ce0 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
16cf0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16d00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65  _NOMEM;.      re
16d10 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
16d20 20 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 57   pNew = &aNew[pW
16d30 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 5d 3b  riter->nWriter];
16d40 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
16d50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
16d60 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20 20  PageWriter));.  
16d70 20 20 70 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20 31    pNew->pgno = 1
16d80 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
16d90 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
16da0 3e 72 63 2c 20 26 70 4e 65 77 2d 3e 62 75 66 2c  >rc, &pNew->buf,
16db0 20 31 29 3b 0a 0a 20 20 20 20 70 57 72 69 74 65   1);..    pWrite
16dc0 72 2d 3e 6e 57 72 69 74 65 72 2b 2b 3b 0a 20 20  r->nWriter++;.  
16dd0 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74    pWriter->aWrit
16de0 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d  er = aNew;.  }.}
16df0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
16e00 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
16e10 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 65  each leaf page e
16e20 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74 20  xcept the first 
16e30 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
16e40 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65   at least one te
16e50 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e 54  rm. Argument (nT
16e60 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74 68  erm/pTerm) is th
16e70 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20  e split-key - a 
16e80 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20  term that.** is 
16e90 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
16ea0 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f  terms written to
16eb0 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73 2c   earlier leaves,
16ec0 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f 72   and equal to or
16ed0 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  .** smaller than
16ee0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
16ef0 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66 2e  on the new leaf.
16f00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
16f10 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
16f20 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
16f30 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
16f40 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  . If an error.**
16f50 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
16f60 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
16f70 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
16f80 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
16f90 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
16fa0 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
16fb0 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
16fc0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
16fd0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
16fe0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
16ff0 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
17000 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
17010 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
17020 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ject */.  int nT
17030 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  erm, const u8 *p
17040 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69 72  Term      /* Fir
17050 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70  st term on new p
17060 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
17070 69 48 65 69 67 68 74 3b 0a 20 20 66 6f 72 28 69  iHeight;.  for(i
17080 48 65 69 67 68 74 3d 31 3b 20 31 3b 20 69 48 65  Height=1; 1; iHe
17090 69 67 68 74 2b 2b 29 7b 0a 20 20 20 20 46 74 73  ight++){.    Fts
170a0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
170b0 67 65 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65  ge;..    if( iHe
170c0 69 67 68 74 3e 3d 70 57 72 69 74 65 72 2d 3e 6e  ight>=pWriter->n
170d0 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Writer ){.      
170e0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 47 72  fts5WriteBtreeGr
170f0 6f 77 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ow(p, pWriter);.
17100 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
17110 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ) return;.    }.
17120 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72      pPage = &pWr
17130 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 48  iter->aWriter[iH
17140 65 69 67 68 74 5d 3b 0a 0a 20 20 20 20 66 74 73  eight];..    fts
17150 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74  5WriteBtreeNEmpt
17160 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a  y(p, pWriter);..
17170 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62      if( pPage->b
17180 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  uf.n>=p->pConfig
17190 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  ->pgsz ){.      
171a0 2f 2a 20 70 50 61 67 65 20 77 69 6c 6c 20 62 65  /* pPage will be
171b0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
171c0 2e 20 54 68 65 20 74 65 72 6d 20 77 69 6c 6c 20  . The term will 
171d0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
171e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  the.      ** par
171f0 65 6e 74 20 6f 66 20 70 50 61 67 65 2e 20 20 2a  ent of pPage.  *
17200 2f 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  /.      i64 iRow
17210 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
17220 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  T_ROWID(pWriter-
17230 3e 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74  >iSegid, iHeight
17240 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
17250 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
17260 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70  ite(p, iRowid, p
17270 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
17280 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20  ge->buf.n);.    
17290 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
172a0 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20  (&pPage->buf);. 
172b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
172c0 65 72 6f 28 26 70 50 61 67 65 2d 3e 74 65 72 6d  ero(&pPage->term
172d0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
172e0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
172f0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
17300 62 75 66 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70  buf, pPage[-1].p
17310 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50 61 67  gno);.      pPag
17320 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d  e->pgno++;.    }
17330 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
17340 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65 66 69  nPre = fts5Prefi
17350 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
17360 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
17370 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
17380 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73  Term);.      fts
17390 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
173a0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
173b0 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29  ge->buf, nPre+2)
173c0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
173d0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
173e0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
173f0 75 66 2c 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b  uf, nTerm-nPre);
17400 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
17410 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
17420 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
17430 20 6e 54 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65   nTerm-nPre, pTe
17440 72 6d 2b 6e 50 72 65 29 3b 0a 20 20 20 20 20 20  rm+nPre);.      
17450 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
17460 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65  ->rc, &pPage->te
17470 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
17480 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17490 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
174a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
174b0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
174c0 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20  flushing a leaf 
174d0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
174e0 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61  ns no.** terms a
174f0 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a  t all to disk..*
17500 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
17510 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
17520 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rm(.  Fts5Index 
17530 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17540 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
17550 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
17560 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
17570 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20  *pWriter        
17580 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
17590 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  ct */.){.  /* If
175a0 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72   there were no r
175b0 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61  owids on the lea
175c0 66 20 70 61 67 65 20 65 69 74 68 65 72 20 61 6e  f page either an
175d0 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  d the doclist-in
175e0 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72  dex.  ** has alr
175f0 65 61 64 79 20 62 65 65 6e 20 73 74 61 72 74 65  eady been starte
17600 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30  d, append an 0x0
17610 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a  0 byte to it.  *
17620 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
17630 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
17640 67 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  ge && pWriter->a
17650 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
17660 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64   ){.    Fts5Dlid
17670 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
17680 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
17690 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  dx[0];.    asser
176a0 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76  t( pDlidx->bPrev
176b0 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c  Valid );.    sql
176c0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
176d0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
176e0 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
176f0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
17700 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75  ncrement the "nu
17710 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69  mber of sequenti
17720 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75  al leaves withou
17730 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65  t a term" counte
17740 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  r. */.  pWriter-
17750 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74  >nEmpty++;.}..st
17760 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69  atic i64 fts5Dli
17770 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
17780 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a  wid(Fts5Buffer *
17790 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f  pBuf){.  i64 iRo
177a0 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  wid;.  int iOff;
177b0 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 67  ..  iOff = 1 + g
177c0 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
177d0 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  p[1], (u64*)&iRo
177e0 77 69 64 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  wid);.  getVarin
177f0 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d  t(&pBuf->p[iOff]
17800 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29  , (u64*)&iRowid)
17810 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69  ;.  return iRowi
17820 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69  d;.}../*.** Rowi
17830 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73  d iRowid has jus
17840 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20  t been appended 
17850 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  to the current l
17860 65 61 66 20 70 61 67 65 2e 20 49 74 20 69 73 20  eaf page. It is 
17870 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20  the.** first on 
17880 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  the page. This f
17890 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
178a0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
178b0 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75 72 72  ntry to the curr
178c0 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69  ent.** doclist-i
178d0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
178e0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c  void fts5WriteDl
178f0 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73  idxAppend(.  Fts
17900 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
17910 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
17920 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f  iter, .  i64 iRo
17930 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  wid.){.  int i;.
17940 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
17950 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e  ..  for(i=0; p->
17960 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17970 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b   bDone==0; i++){
17980 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20  .    i64 iVal;. 
17990 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
179a0 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57  er *pDlidx = &pW
179b0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
179c0 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64  ;..    if( pDlid
179d0 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f  x->buf.n>=p->pCo
179e0 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
179f0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
17a00 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  nt doclist-index
17a10 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57   page is full. W
17a20 72 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20  rite it to disk 
17a30 61 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a  and push.      *
17a40 2a 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77  * a copy of iRow
17a50 69 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  id (which will b
17a60 65 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20  ecome the first 
17a70 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78  rowid on the nex
17a80 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69  t.      ** docli
17a90 73 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st-index leaf pa
17aa0 67 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20  ge) up into the 
17ab0 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68  next level of th
17ac0 65 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20  e b-tree .      
17ad0 2a 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49 66  ** hierarchy. If
17ae0 20 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20   the node being 
17af0 66 6c 75 73 68 65 64 20 69 73 20 63 75 72 72 65  flushed is curre
17b00 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f  ntly the root no
17b10 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73  de,.      ** als
17b20 6f 20 70 75 73 68 20 69 74 73 20 66 69 72 73 74  o push its first
17b30 20 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20   rowid upwards. 
17b40 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  */.      pDlidx-
17b50 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31  >buf.p[0] = 0x01
17b60 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20  ;    /* Not the 
17b70 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20  root node */.   
17b80 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
17b90 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
17ba0 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
17bb0 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
17bc0 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f   i, pDlidx->pgno
17bd0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c  ),.          pDl
17be0 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69  idx->buf.p, pDli
17bf0 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20  dx->buf.n.      
17c00 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  );.      fts5Wri
17c10 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70  teDlidxGrow(p, p
17c20 57 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20  Writer, i+2);.  
17c30 20 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57      pDlidx = &pW
17c40 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
17c50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
17c60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17c70 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d  pDlidx[1].buf.n=
17c80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  =0 ){.        i6
17c90 34 20 69 46 69 72 73 74 20 3d 20 66 74 73 35 44  4 iFirst = fts5D
17ca0 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74  lidxExtractFirst
17cb0 52 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62  Rowid(&pDlidx->b
17cc0 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  uf);..        /*
17cd0 20 54 68 69 73 20 77 61 73 20 74 68 65 20 72 6f   This was the ro
17ce0 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74  ot node. Push it
17cf0 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70  s first rowid up
17d00 20 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   to the new root
17d10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c  . */.        pDl
17d20 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44  idx[1].pgno = pD
17d30 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  lidx->pgno;.    
17d40 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
17d50 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
17d60 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
17d70 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20  x[1].buf, 0);.  
17d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
17d90 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
17da0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
17db0 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69  idx[1].buf, pDli
17dc0 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  dx->pgno);.     
17dd0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
17de0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
17df0 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
17e00 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29  [1].buf, iFirst)
17e10 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  ;.        pDlidx
17e20 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d  [1].bPrevValid =
17e30 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69   1;.        pDli
17e40 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46  dx[1].iPrev = iF
17e50 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  irst;.      }.. 
17e60 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
17e70 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69  BufferZero(&pDli
17e80 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20  dx->buf);.      
17e90 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
17ea0 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44  id = 0;.      pD
17eb0 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20  lidx->pgno++;.  
17ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
17ed0 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Done = 1;.    }.
17ee0 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
17ef0 3e 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20  >bPrevValid ){. 
17f00 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77       iVal = iRow
17f10 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72  id - pDlidx->iPr
17f20 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ev;.    }else{. 
17f30 20 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d       i64 iPgno =
17f40 20 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72   (i==0 ? pWriter
17f50 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
17f60 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70  o : pDlidx[-1].p
17f70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  gno);.      asse
17f80 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  rt( pDlidx->buf.
17f90 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  n==0 );.      sq
17fa0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
17fb0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
17fc0 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
17fd0 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20  , !bDone);.     
17fe0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
17ff0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
18000 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
18010 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20  buf, iPgno);.   
18020 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
18030 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
18040 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
18050 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
18060 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
18070 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69   iVal);.    pDli
18080 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
18090 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e   1;.    pDlidx->
180a0 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a  iPrev = iRowid;.
180b0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
180c0 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  id fts5WriteFlus
180d0 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20  hLeaf(Fts5Index 
180e0 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
180f0 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73  r *pWriter){.  s
18100 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
18110 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20  ero[] = { 0x00, 
18120 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
18130 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72   };.  Fts5PageWr
18140 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
18150 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
18160 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  0];.  i64 iRowid
18170 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ;..  if( pWriter
18180 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
18190 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  ge ){.    /* No 
181a0 74 65 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e  term was written
181b0 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a   to this page. *
181c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d  /.    assert( 0=
181d0 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61  =fts5GetU16(&pPa
181e0 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b  ge->buf.p[2]) );
181f0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74  .    fts5WriteBt
18200 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72  reeNoTerm(p, pWr
18210 69 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iter);.  }..  /*
18220 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
18230 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  nt page to the d
18240 62 2e 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d  b. */.  iRowid =
18250 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
18260 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
18270 67 69 64 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  gid, 0, pPage->p
18280 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61  gno);.  fts5Data
18290 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c  Write(p, iRowid,
182a0 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70   pPage->buf.p, p
182b0 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20  Page->buf.n);.. 
182c0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
182d0 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f  he next page. */
182e0 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
182f0 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a  o(&pPage->buf);.
18300 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
18310 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
18320 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a  pPage->buf, 4, z
18330 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  ero);.  pPage->p
18340 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63  gno++;..  /* Inc
18350 72 65 61 73 65 20 74 68 65 20 6c 65 61 76 65 73  rease the leaves
18360 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72   written counter
18370 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e   */.  pWriter->n
18380 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a  LeafWritten++;..
18390 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61    /* The new lea
183a0 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73  f holds no terms
183b0 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20   or rowids */.  
183c0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
183d0 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
183e0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
183f0 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
18400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
18410 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
18420 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  m to the segment
18430 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62   being written b
18440 79 20 74 68 65 20 77 72 69 74 65 72 20 70 61 73  y the writer pas
18450 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65  sed.** as the se
18460 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
18470 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
18480 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
18490 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
184a0 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
184b0 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
184c0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
184d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
184e0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
184f0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
18500 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20  teAppendTerm(.  
18510 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
18520 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
18530 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e  pWriter,.  int n
18540 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a  Term, const u8 *
18550 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20  pTerm .){.  int 
18560 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  nPrefix;        
18570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
18580 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63  ytes of prefix c
18590 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  ompression for t
185a0 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67  erm */.  Fts5Pag
185b0 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
185c0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
185d0 65 72 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74  er[0];..  assert
185e0 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d  ( pPage->buf.n==
185f0 30 20 7c 7c 20 70 50 61 67 65 2d 3e 62 75 66 2e  0 || pPage->buf.
18600 6e 3e 34 20 29 3b 0a 20 20 69 66 28 20 70 50 61  n>4 );.  if( pPa
18610 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a  ge->buf.n==0 ){.
18620 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20      /* Zero the 
18630 66 69 72 73 74 20 74 65 72 6d 20 61 6e 64 20 66  first term and f
18640 69 72 73 74 20 64 6f 63 69 64 20 66 69 65 6c 64  irst docid field
18650 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  s */.    static 
18660 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20  const u8 zero[] 
18670 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20  = { 0x00, 0x00, 
18680 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x00, 0x00 };.  
18690 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
186a0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
186b0 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a  pPage->buf, 4, z
186c0 65 72 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ero);.    assert
186d0 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
186e0 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 20  tTermInPage );. 
186f0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29   }.  if( p->rc )
18700 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66   return;.  .  if
18710 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
18720 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
18730 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
18740 20 22 66 69 72 73 74 20 74 65 72 6d 22 20 66 69   "first term" fi
18750 65 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  eld of the page 
18760 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 61  header. */.    a
18770 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
18780 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20 70 50 61  f.p[2]==0 && pPa
18790 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d 3d 30 20  ge->buf.p[3]==0 
187a0 29 3b 0a 20 20 20 20 66 74 73 35 50 75 74 55 31  );.    fts5PutU1
187b0 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
187c0 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  2], pPage->buf.n
187d0 29 3b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  );.    nPrefix =
187e0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
187f0 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20  e->pgno!=1 ){.  
18800 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
18810 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
18820 20 61 20 6c 65 61 66 20 74 68 61 74 20 69 73 20   a leaf that is 
18830 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74  not the leftmost
18840 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a   leaf in.      *
18850 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d  * the segment b-
18860 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  tree. In this ca
18870 73 65 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  se it is necessa
18880 72 79 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d  ry to add a term
18890 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
188a0 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
188b0 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6c 61  y that is (a) la
188c0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
188d0 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20  rgest term .    
188e0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69    ** already wri
188f0 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d  tten to the segm
18900 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c  ent and (b) smal
18910 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ler than or equa
18920 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  l to.      ** th
18930 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65  is term. In othe
18940 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69  r words, a prefi
18950 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  x of (pTerm/nTer
18960 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20  m) that is one. 
18970 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e       ** byte lon
18980 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e  ger than the lon
18990 67 65 73 74 20 70 72 65 66 69 78 20 28 70 54 65  gest prefix (pTe
189a0 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73  rm/nTerm) shares
189b0 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20   with the.      
189c0 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ** previous term
189d0 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
189e0 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68    ** Usually, th
189f0 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  e previous term 
18a00 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
18a10 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65  pPage->term. The
18a20 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
18a30 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20 69   ** is if this i
18a40 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
18a50 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69   written in an i
18a60 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
18a70 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20   step..      ** 
18a80 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
18a90 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69   previous term i
18aa0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
18ab0 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61   so just write a
18ac0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
18ad0 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  f (pTerm/nTerm) 
18ae0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
18af0 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c  node. This is sl
18b00 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  ightly.      ** 
18b10 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74  inefficient, but
18b20 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20   still correct. 
18b30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
18b40 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  = nTerm;.      i
18b50 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  f( pPage->term.n
18b60 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   ){.        n = 
18b70 31 20 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f  1 + fts5PrefixCo
18b80 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
18b90 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
18ba0 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
18bb0 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
18bc0 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
18bd0 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c  Term(p, pWriter,
18be0 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20   n, pTerm);.    
18bf0 20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74    pPage = &pWrit
18c00 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a  er->aWriter[0];.
18c10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
18c20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73     nPrefix = fts
18c30 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
18c40 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70  pPage->term.n, p
18c50 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54  Page->term.p, nT
18c60 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
18c70 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
18c80 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
18c90 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72  &pPage->buf, nPr
18ca0 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  efix);.  }..  /*
18cb0 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62   Append the numb
18cc0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e  er of bytes of n
18cd0 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68  ew data, then th
18ce0 65 20 74 65 72 6d 20 64 61 74 61 20 69 74 73 65  e term data itse
18cf0 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70  lf.  ** to the p
18d00 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
18d10 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
18d20 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
18d30 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50  >buf, nTerm - nP
18d40 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75  refix);.  fts5Bu
18d50 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
18d60 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
18d70 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65  uf, nTerm - nPre
18d80 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65  fix, &pTerm[nPre
18d90 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64  fix]);..  /* Upd
18da0 61 74 65 20 74 68 65 20 46 74 73 35 50 61 67 65  ate the Fts5Page
18db0 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c  Writer.term fiel
18dc0 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  d. */.  fts5Buff
18dd0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
18de0 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72  Page->term, nTer
18df0 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72  m, pTerm);.  pWr
18e00 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
18e10 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70  InPage = 0;..  p
18e20 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
18e30 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20  widInPage = 0;. 
18e40 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
18e50 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d  RowidInDoclist =
18e60 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   1;..  assert( p
18e70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72  ->rc || (pWriter
18e80 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57  ->nDlidx>0 && pW
18e90 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
18ea0 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20  .buf.n==0) );.  
18eb0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
18ec0 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  0].pgno = pPage-
18ed0 3e 70 67 6e 6f 3b 0a 0a 20 20 2f 2a 20 49 66 20  >pgno;..  /* If 
18ee0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
18ef0 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66   page is full, f
18f00 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e  lush it to disk.
18f10 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
18f20 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
18f30 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
18f40 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
18f50 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
18f60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70    }.}../*.** App
18f70 65 6e 64 20 61 20 64 6f 63 69 64 20 61 6e 64 20  end a docid and 
18f80 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
18f90 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  ze field to the 
18fa0 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
18fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18fc0 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
18fd0 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
18fe0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
18ff0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
19000 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20  .  i64 iRowid,. 
19010 20 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20 20 69   int nPos.){.  i
19020 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19030 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50  _OK ){.    Fts5P
19040 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
19050 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
19060 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a  iter[0];..    /*
19070 20 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62   If this is to b
19080 65 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69  e the first doci
19090 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
190a0 20 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a   page, set the .
190b0 20 20 20 20 2a 2a 20 64 6f 63 69 64 2d 70 6f 69      ** docid-poi
190c0 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
190d0 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70  -header. Also ap
190e0 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20  pend a value to 
190f0 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a  the dlidx.    **
19100 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65   buffer, in case
19110 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
19120 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
19130 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  /.    if( pWrite
19140 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
19150 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
19160 73 35 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e  s5PutU16(pPage->
19170 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75  buf.p, pPage->bu
19180 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35  f.n);.      fts5
19190 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
191a0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f  (p, pWriter, iRo
191b0 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  wid);.    }..   
191c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f   /* Write the do
191d0 63 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  cid. */.    if( 
191e0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
191f0 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c  owidInDoclist ||
19200 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
19210 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
19220 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
19230 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
19240 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
19250 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65   iRowid);.    }e
19260 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
19270 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77  t( p->rc || iRow
19280 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72 65  id>pWriter->iPre
19290 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  vRowid );.      
192a0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
192b0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
192c0 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77  pPage->buf, iRow
192d0 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50  id - pWriter->iP
192e0 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  revRowid);.    }
192f0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50  .    pWriter->iP
19300 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  revRowid = iRowi
19310 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  d;.    pWriter->
19320 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
19330 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57  list = 0;.    pW
19340 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
19350 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20  idInPage = 0;.. 
19360 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
19370 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
19380 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
19390 50 6f 73 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  Pos);..    if( p
193a0 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e  Page->buf.n>=p->
193b0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
193c0 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
193d0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
193e0 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  iter);.    }.  }
193f0 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63  .}..#if 0.static
19400 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
19410 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28  ppendPoslistInt(
19420 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
19430 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
19440 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
19450 74 20 69 56 61 6c 0a 29 7b 0a 20 20 69 66 28 20  t iVal.){.  if( 
19460 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19470 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65   ){.    Fts5Page
19480 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
19490 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
194a0 72 5b 30 5d 3b 0a 20 20 20 20 66 74 73 35 42 75  r[0];.    fts5Bu
194b0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
194c0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
194d0 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20  >buf, iVal);.   
194e0 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
194f0 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
19500 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gsz ){.      fts
19510 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
19520 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
19530 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
19540 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19550 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
19560 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35 49  istData(.  Fts5I
19570 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
19580 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
19590 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  er, .  const u8 
195a0 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e  *aData, .  int n
195b0 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50 61  Data.){.  Fts5Pa
195c0 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
195d0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
195e0 74 65 72 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74 20  ter[0];.  const 
195f0 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20  u8 *a = aData;. 
19600 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a   int n = nData;.
19610 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e    .  assert( p->
19620 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20  pConfig->pgsz>0 
19630 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
19640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19650 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20  (pPage->buf.n + 
19660 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  n)>=p->pConfig->
19670 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 6e 74 20  pgsz ){.    int 
19680 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nReq = p->pConfi
19690 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d  g->pgsz - pPage-
196a0 3e 62 75 66 2e 6e 3b 0a 20 20 20 20 69 6e 74 20  >buf.n;.    int 
196b0 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77  nCopy = 0;.    w
196c0 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71  hile( nCopy<nReq
196d0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75   ){.      i64 du
196e0 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79  mmy;.      nCopy
196f0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61   += getVarint(&a
19700 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26  [nCopy], (u64*)&
19710 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20  dummy);.    }.  
19720 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
19730 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
19740 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70  pPage->buf, nCop
19750 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20  y, a);.    a += 
19760 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20  nCopy;.    n -= 
19770 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57  nCopy;.    fts5W
19780 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
19790 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20   pWriter);.  }. 
197a0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
197b0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
197c0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
197d0 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b  age->buf, n, a);
197e0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
197f0 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
19800 65 6e 64 5a 65 72 6f 62 79 74 65 28 46 74 73 35  endZerobyte(Fts5
19810 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
19820 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
19830 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  ){.  fts5BufferA
19840 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
19850 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 61 57  rc, &pWriter->aW
19860 72 69 74 65 72 5b 30 5d 2e 62 75 66 2c 20 30 29  riter[0].buf, 0)
19870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
19880 20 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64   any data cached
19890 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f   by the writer o
198a0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74  bject to the dat
198b0 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a  abase. Free any.
198c0 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ** allocations a
198d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
198e0 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74  he writer..*/.st
198f0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
19900 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73  iteFinish(.  Fts
19910 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
19920 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
19930 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  iter,         /*
19940 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
19950 2f 0a 20 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  /.  int *pnHeigh
19960 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
19970 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67      /* OUT: Heig
19980 68 74 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ht of the b-tree
19990 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61   */.  int *pnLea
199a0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
199b0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
199c0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
199d0 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a  es in b-tree */.
199e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
199f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19a00 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61  OK ){.    Fts5Pa
19a10 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20  geWriter *pLeaf 
19a20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
19a30 74 65 72 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ter[0];.    if( 
19a40 70 4c 65 61 66 2d 3e 70 67 6e 6f 3d 3d 31 20 26  pLeaf->pgno==1 &
19a50 26 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3d 3d  & pLeaf->buf.n==
19a60 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 4c 65  0 ){.      *pnLe
19a70 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70  af = 0;.      *p
19a80 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  nHeight = 0;.   
19a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
19aa0 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e 34  ( pLeaf->buf.n>4
19ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
19ac0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
19ad0 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
19ae0 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 4c 65 61    }.      *pnLea
19af0 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d  f = pLeaf->pgno-
19b00 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 72  1;.      if( pWr
19b10 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3d 3d 31  iter->nWriter==1
19b20 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d   && pWriter->nEm
19b30 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c  pty>=FTS5_MIN_DL
19b40 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  IDX_SIZE ){.    
19b50 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
19b60 65 65 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  eeGrow(p, pWrite
19b70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
19b80 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
19b90 57 72 69 74 65 72 3e 31 20 29 7b 0a 20 20 20 20  Writer>1 ){.    
19ba0 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
19bb0 65 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72 69  eeNEmpty(p, pWri
19bc0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
19bd0 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
19be0 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
19bf0 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  ;..      for(i=1
19c00 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72  ; i<pWriter->nWr
19c10 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iter; i++){.    
19c20 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
19c30 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74  er *pPg = &pWrit
19c40 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a  er->aWriter[i];.
19c50 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
19c60 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20  Write(p, .      
19c70 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45        FTS5_SEGME
19c80 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
19c90 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 50 67  ->iSegid, i, pPg
19ca0 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20 20 20 20 20  ->pgno), .      
19cb0 20 20 20 20 20 20 70 50 67 2d 3e 62 75 66 2e 70        pPg->buf.p
19cc0 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 0a 20 20 20  , pPg->buf.n.   
19cd0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
19ce0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
19cf0 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
19d00 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nWriter; i++){. 
19d10 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
19d20 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65  r *pPg = &pWrite
19d30 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20  r->aWriter[i];. 
19d40 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
19d50 65 28 26 70 50 67 2d 3e 74 65 72 6d 29 3b 0a 20  e(&pPg->term);. 
19d60 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
19d70 65 28 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20 20  e(&pPg->buf);.  
19d80 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
19d90 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  (pWriter->aWrite
19da0 72 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  r);..  for(i=0; 
19db0 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
19dc0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  x; i++){.    sql
19dd0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
19de0 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c  ee(&pWriter->aDl
19df0 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d  idx[i].buf);.  }
19e00 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19e10 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29  pWriter->aDlidx)
19e20 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
19e30 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a   fts5WriteInit(.
19e40 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
19e50 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
19e60 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e   *pWriter, .  in
19e70 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 6d 65  t iSegid.){.  me
19e80 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c  mset(pWriter, 0,
19e90 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
19ea0 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74  riter));.  pWrit
19eb0 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  er->iSegid = iSe
19ec0 67 69 64 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d  gid;..  pWriter-
19ed0 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74 73 35  >aWriter = (Fts5
19ee0 50 61 67 65 57 72 69 74 65 72 2a 29 66 74 73 35  PageWriter*)fts5
19ef0 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
19f00 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
19f10 65 72 29 29 3b 0a 20 20 69 66 28 20 66 74 73 35  er));.  if( fts5
19f20 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70  WriteDlidxGrow(p
19f30 2c 20 70 57 72 69 74 65 72 2c 20 31 29 20 29 20  , pWriter, 1) ) 
19f40 72 65 74 75 72 6e 3b 0a 20 20 70 57 72 69 74 65  return;.  pWrite
19f50 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20 31 3b 0a  r->nWriter = 1;.
19f60 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64    pWriter->nDlid
19f70 78 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  x = 1;.  pWriter
19f80 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
19f90 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  o = 1;.  pWriter
19fa0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
19fb0 67 65 20 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69  ge = 1;.}..stati
19fc0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
19fd0 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28 0a 20  InitForAppend(. 
19fe0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1a010 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1a020 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1a030 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
1a040 57 72 69 74 65 72 20 74 6f 20 69 6e 69 74 69 61  Writer to initia
1a050 6c 69 7a 65 20 2a 2f 0a 20 20 46 74 73 35 53 74  lize */.  Fts5St
1a060 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1a070 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
1a080 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f 20 61  ment object to a
1a090 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  ppend to */.){. 
1a0a0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70 53 65   int nByte = pSe
1a0b0 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73 69 7a  g->nHeight * siz
1a0c0 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
1a0d0 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 57  er);.  memset(pW
1a0e0 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
1a0f0 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
1a100 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65  ;.  pWriter->iSe
1a110 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67  gid = pSeg->iSeg
1a120 69 64 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61  id;.  pWriter->a
1a130 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 50 61  Writer = (Fts5Pa
1a140 67 65 57 72 69 74 65 72 2a 29 66 74 73 35 49 64  geWriter*)fts5Id
1a150 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65  xMalloc(p, nByte
1a160 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44  );.  pWriter->aD
1a170 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64  lidx = (Fts5Dlid
1a180 78 57 72 69 74 65 72 2a 29 66 74 73 35 49 64 78  xWriter*)fts5Idx
1a190 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
1a1a0 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
1a1b0 29 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  ));..  if( p->rc
1a1c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a1d0 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 31 3b     int pgno = 1;
1a1e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1a1f0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20  pWriter->nDlidx 
1a200 3d 20 31 3b 0a 20 20 20 20 70 57 72 69 74 65 72  = 1;.    pWriter
1a210 2d 3e 6e 57 72 69 74 65 72 20 3d 20 70 53 65 67  ->nWriter = pSeg
1a220 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 70  ->nHeight;.    p
1a230 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
1a240 30 5d 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  0].pgno = pSeg->
1a250 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20  pgnoLast+1;.    
1a260 66 6f 72 28 69 3d 70 53 65 67 2d 3e 6e 48 65 69  for(i=pSeg->nHei
1a270 67 68 74 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  ght-1; i>0; i--)
1a280 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
1a290 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1a2a0 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  T_ROWID(pWriter-
1a2b0 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 67 6e 6f  >iSegid, i, pgno
1a2c0 29 3b 0a 20 20 20 20 20 20 46 74 73 35 50 61 67  );.      Fts5Pag
1a2d0 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26  eWriter *pPg = &
1a2e0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
1a2f0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  [i];.      pPg->
1a300 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
1a310 20 20 20 66 74 73 35 44 61 74 61 42 75 66 66 65     fts5DataBuffe
1a320 72 28 70 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20  r(p, &pPg->buf, 
1a330 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
1a340 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 46  _OK ){.        F
1a360 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a  ts5NodeIter ss;.
1a370 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65          fts5Node
1a380 49 74 65 72 49 6e 69 74 28 70 50 67 2d 3e 62 75  IterInit(pPg->bu
1a390 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 2c  f.p, pPg->buf.n,
1a3a0 20 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20 77   &ss);.        w
1a3b0 68 69 6c 65 28 20 73 73 2e 61 44 61 74 61 20 29  hile( ss.aData )
1a3c0 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
1a3d0 74 28 26 70 2d 3e 72 63 2c 20 26 73 73 29 3b 0a  t(&p->rc, &ss);.
1a3e0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a3f0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1a400 50 67 2d 3e 74 65 72 6d 2c 20 73 73 2e 74 65 72  Pg->term, ss.ter
1a410 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 29 3b  m.n, ss.term.p);
1a420 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  .        pgno = 
1a430 73 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 20  ss.iChild;.     
1a440 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46     fts5NodeIterF
1a450 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 20 20  ree(&ss);.      
1a460 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1a470 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
1a480 45 5f 4f 4b 20 7c 7c 20 28 70 67 6e 6f 2b 70 57  E_OK || (pgno+pW
1a490 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3d 3d  riter->nEmpty)==
1a4a0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
1a4b0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
1a4c0 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
1a4d0 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 1;.    assert(
1a4e0 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
1a4f0 72 5b 30 5d 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29  r[0].term.n==0 )
1a500 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1a510 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77 61  terator pIter wa
1a520 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
1a530 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  e through the in
1a540 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  put segments of 
1a550 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65  on an.** increme
1a560 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61  ntal merge opera
1a570 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  tion. This funct
1a580 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66  ion is called if
1a590 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1a5a0 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68  .** merge step h
1a5b0 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74 20  as finished but 
1a5c0 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f  the input has no
1a5d0 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c  t been completel
1a5e0 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a  y exhausted..*/.
1a5f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1a600 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73  TrimSegments(Fts
1a610 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d  5Index *p, Fts5M
1a620 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
1a630 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
1a640 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a  Fts5Buffer buf;.
1a650 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
1a660 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1a670 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  fer));.  for(i=0
1a680 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
1a690 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53   i++){.    Fts5S
1a6a0 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
1a6b0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a  pIter->aSeg[i];.
1a6c0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53      if( pSeg->pS
1a6d0 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  eg==0 ){.      /
1a6e0 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d  * no-op */.    }
1a6f0 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70  else if( pSeg->p
1a700 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
1a710 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f   /* All keys fro
1a720 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 65 67  m this input seg
1a730 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74  ment have been t
1a740 72 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65  ransfered to the
1a750 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
1a760 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65 20 66  * Set both the f
1a770 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61  irst and last pa
1a780 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20  ge-numbers to 0 
1a790 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1a7a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
1a7b0 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70  gment is now emp
1a7c0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65  ty. */.      pSe
1a7d0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  g->pSeg->pgnoLas
1a7e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  t = 0;.      pSe
1a7f0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  g->pSeg->pgnoFir
1a800 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
1a810 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  e{.      int iOf
1a820 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  f = pSeg->iTermL
1a830 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f  eafOffset;     /
1a840 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20  * Offset on new 
1a850 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  first leaf page 
1a860 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65  */.      i64 iLe
1a870 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46  afRowid;.      F
1a880 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
1a890 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20        int iId = 
1a8a0 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67  pSeg->pSeg->iSeg
1a8b0 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64  id;.      u8 aHd
1a8c0 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78  r[4] = {0x00, 0x
1a8d0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 34 7d 3b  00, 0x00, 0x04};
1a8e0 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77  ..      iLeafRow
1a8f0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1a900 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 30 2c 20  T_ROWID(iId, 0, 
1a910 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50  pSeg->iTermLeafP
1a920 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74  gno);.      pDat
1a930 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
1a940 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b  (p, iLeafRowid);
1a950 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
1a960 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
1a970 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29  BufferZero(&buf)
1a980 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1a990 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1a9a0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a  p->rc, &buf, siz
1a9b0 65 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72 29  eof(aHdr), aHdr)
1a9c0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1a9d0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1a9e0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1a9f0 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20  Seg->term.n);.  
1aa00 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1aa10 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1aa20 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74  c, &buf, pSeg->t
1aa30 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72  erm.n, pSeg->ter
1aa40 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74  m.p);.        ft
1aa50 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1aa60 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1aa70 20 70 44 61 74 61 2d 3e 6e 20 2d 20 69 4f 66 66   pData->n - iOff
1aa80 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  , &pData->p[iOff
1aa90 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ]);.        fts5
1aaa0 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
1aab0 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67  a);.        pSeg
1aac0 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
1aad0 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  t = pSeg->iTermL
1aae0 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20  eafPgno;.       
1aaf0 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
1ab00 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
1ab10 52 4f 57 49 44 28 69 49 64 2c 20 30 2c 20 31 29  ROWID(iId, 0, 1)
1ab20 2c 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20  ,iLeafRowid);.  
1ab30 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
1ab40 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
1ab50 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
1ab60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ab70 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1ab80 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73  Free(&buf);.}..s
1ab90 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1aba0 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63  ergeChunkCallbac
1abb0 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
1abc0 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  p, .  void *pCtx
1abd0 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
1abe0 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
1abf0 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72  k.){.  Fts5SegWr
1ac00 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20  iter *pWriter = 
1ac10 28 46 74 73 35 53 65 67 57 72 69 74 65 72 2a 29  (Fts5SegWriter*)
1ac20 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74  pCtx;.  fts5Writ
1ac30 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
1ac40 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70  ta(p, pWriter, p
1ac50 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
1ac60 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
1ac70 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1ac80 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46  xMergeLevel(.  F
1ac90 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1acb0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1acc0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1acd0 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1ace0 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
1acf0 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
1ad00 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
1ad10 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad30 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  Level to read in
1ad40 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  put from */.  in
1ad50 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ad70 20 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69   Write up to thi
1ad80 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65  s many output le
1ad90 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  aves */.){.  Fts
1ada0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1adb0 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
1adc0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1add0 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1ade0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1adf0 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75  Lvl];.  Fts5Stru
1ae00 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1ae10 4f 75 74 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69  Out;.  Fts5Multi
1ae20 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
1ae30 20 30 3b 20 20 20 20 2f 2a 20 49 74 65 72 61 74   0;    /* Iterat
1ae40 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  or to read input
1ae50 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
1ae60 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70  Rem = pnRem ? *p
1ae70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75  nRem : 0;  /* Ou
1ae80 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20  tput leaf pages 
1ae90 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
1aea0 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20  .  int nInput;  
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aec0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1aed0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
1aee0 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
1aef0 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20  r writer;       
1af00 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
1af10 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1af20 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1af30 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74  pSeg;     /* Out
1af40 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
1af50 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
1af60 3b 0a 20 20 69 6e 74 20 62 52 65 71 75 69 72 65  ;.  int bRequire
1af70 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 30 3b  DoclistTerm = 0;
1af80 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74      /* Doclist t
1af90 65 72 6d 69 6e 61 74 6f 72 20 28 30 78 30 30 29  erminator (0x00)
1afa0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
1afb0 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20  nt bOldest;     
1afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1afd0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75  * True if the ou
1afe0 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20  tput segment is 
1aff0 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 0a 20  the oldest */.. 
1b000 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53   assert( iLvl<pS
1b010 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b  truct->nLevel );
1b020 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d  .  assert( pLvl-
1b030 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
1b040 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  Seg );..  memset
1b050 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
1b060 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
1b070 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74  r));.  memset(&t
1b080 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
1b090 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
1b0a0 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
1b0b0 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d  ){.    pLvlOut =
1b0c0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1b0d0 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61  l[iLvl+1];.    a
1b0e0 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e  ssert( pLvlOut->
1b0f0 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49  nSeg>0 );.    nI
1b100 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65  nput = pLvl->nMe
1b110 72 67 65 3b 0a 20 20 20 20 66 74 73 35 57 72 69  rge;.    fts5Wri
1b120 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28  teInitForAppend(
1b130 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 4c 76  p, &writer, &pLv
1b140 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
1b150 75 74 2d 3e 6e 53 65 67 2d 31 5d 29 3b 0a 20 20  ut->nSeg-1]);.  
1b160 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
1b170 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
1b180 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20 7d 65 6c 73  >nSeg-1];.  }els
1b190 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  e{.    int iSegi
1b1a0 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
1b1b0 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
1b1c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e  );..    /* Exten
1b1d0 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74  d the Fts5Struct
1b1e0 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65  ure object as re
1b1f0 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65  quired to ensure
1b200 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
1b210 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74  ** segment exist
1b220 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c  s. */.    if( iL
1b230 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65  vl==pStruct->nLe
1b240 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  vel-1 ){.      f
1b250 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
1b260 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53  evel(&p->rc, ppS
1b270 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
1b280 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1b290 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  t;.    }.    fts
1b2a0 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
1b2b0 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53  Level(&p->rc, pS
1b2c0 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31  truct, iLvl+1, 1
1b2d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
1b2e0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
1b2f0 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
1b300 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
1b310 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26  .    pLvlOut = &
1b320 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1b330 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74  iLvl+1];..    ft
1b340 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
1b350 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b  writer, iSegid);
1b360 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
1b370 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20   new segment to 
1b380 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c  the output level
1b390 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26   */.    pSeg = &
1b3a0 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
1b3b0 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20  vlOut->nSeg];.  
1b3c0 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b    pLvlOut->nSeg+
1b3d0 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  +;.    pSeg->pgn
1b3e0 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
1b3f0 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
1b400 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75  Segid;.    pStru
1b410 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a  ct->nSegment++;.
1b420 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70  .    /* Read inp
1b430 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d  ut from all segm
1b440 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ents in the inpu
1b450 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e  t level */.    n
1b460 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  Input = pLvl->nS
1b470 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73  eg;.  }.  bOldes
1b480 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53  t = (pLvlOut->nS
1b490 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74  eg==1 && pStruct
1b4a0 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32  ->nLevel==iLvl+2
1b4b0 29 3b 0a 0a 23 69 66 20 30 0a 66 70 72 69 6e 74  );..#if 0.fprint
1b4c0 66 28 73 74 64 6f 75 74 2c 20 22 6d 65 72 67 69  f(stdout, "mergi
1b4d0 6e 67 20 25 64 20 73 65 67 6d 65 6e 74 73 20 66  ng %d segments f
1b4e0 72 6f 6d 20 6c 65 76 65 6c 20 25 64 21 22 2c 20  rom level %d!", 
1b4f0 6e 49 6e 70 75 74 2c 20 69 4c 76 6c 29 3b 0a 66  nInput, iLvl);.f
1b500 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 23  flush(stdout);.#
1b510 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1b520 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f   iLvl>=0 );.  fo
1b530 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
1b540 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30  ew(p, pStruct, 0
1b550 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c  , 0, 0, 0, iLvl,
1b560 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29   nInput, &pIter)
1b570 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
1b580 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
1b590 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  r)==0;.      fts
1b5a0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
1b5b0 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20  , pIter, 0, 0). 
1b5c0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
1b5d0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
1b5e0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
1b5f0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
1b600 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f  t ];.    int nPo
1b610 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1b620 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69         /* positi
1b630 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
1b640 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  ld value */.    
1b650 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63  int nTerm;.    c
1b660 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a  onst u8 *pTerm;.
1b670 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
1b680 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69  r key annihilati
1b690 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  on. */.    if( p
1b6a0 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20  Seg->nPos==0 && 
1b6b0 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67  (bOldest || pSeg
1b6c0 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e  ->bDel==0) ) con
1b6d0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 54 65 72  tinue;..    pTer
1b6e0 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  m = fts5MultiIte
1b6f0 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54  rTerm(pIter, &nT
1b700 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 54  erm);.    if( nT
1b710 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d  erm!=term.n || m
1b720 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72  emcmp(pTerm, ter
1b730 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20  m.p, nTerm) ){. 
1b740 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26       if( pnRem &
1b750 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72  & writer.nLeafWr
1b760 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20  itten>nRem ){.  
1b770 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b780 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
1b790 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72  his is a new ter
1b7a0 6d 2e 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d  m. Append a term
1b7b0 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73   to the output s
1b7c0 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  egment. */.     
1b7d0 20 69 66 28 20 62 52 65 71 75 69 72 65 44 6f 63   if( bRequireDoc
1b7e0 6c 69 73 74 54 65 72 6d 20 29 7b 0a 20 20 20 20  listTerm ){.    
1b7f0 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
1b800 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2c 20 26  endZerobyte(p, &
1b810 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  writer);.      }
1b820 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1b830 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77  AppendTerm(p, &w
1b840 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54  riter, nTerm, pT
1b850 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35  erm);.      fts5
1b860 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1b870 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , &term, nTerm, 
1b880 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62 52  pTerm);.      bR
1b890 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72  equireDoclistTer
1b8a0 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  m = 1;.    }..  
1b8b0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1b8c0 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74  rowid to the out
1b8d0 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52  put */.    /* WR
1b8e0 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
1b8f0 2f 0a 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65  /.    nPos = pSe
1b900 67 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 53 65 67  g->nPos*2 + pSeg
1b910 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 66 74 73 35  ->bDel;.    fts5
1b920 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64  WriteAppendRowid
1b930 28 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73  (p, &writer, fts
1b940 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
1b950 70 49 74 65 72 29 2c 20 6e 50 6f 73 29 3b 0a 0a  pIter), nPos);..
1b960 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
1b970 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
1b980 64 61 74 61 20 74 6f 20 74 68 65 20 6f 75 74 70  data to the outp
1b990 75 74 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68  ut */.    fts5Ch
1b9a0 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53  unkIterate(p, pS
1b9b0 65 67 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74  eg, (void*)&writ
1b9c0 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75  er, fts5MergeChu
1b9d0 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d  nkCallback);.  }
1b9e0 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
1b9f0 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
1ba00 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65  to disk. Set the
1ba10 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
1ba20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20  b-tree height.  
1ba30 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66  ** and last leaf
1ba40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20   page number at 
1ba50 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
1ba60 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69  */.  fts5WriteFi
1ba70 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
1ba80 20 26 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c   &pSeg->nHeight,
1ba90 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74   &pSeg->pgnoLast
1baa0 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75  );..  if( fts5Mu
1bab0 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
1bac0 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ter) ){.    int 
1bad0 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  i;..    /* Remov
1bae0 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
1baf0 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
1bb00 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  e %_data table *
1bb10 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1bb20 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20  <nInput; i++){. 
1bb30 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d       fts5DataRem
1bb40 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c  oveSegment(p, pL
1bb50 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67  vl->aSeg[i].iSeg
1bb60 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
1bb70 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65  /* Remove the re
1bb80 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73  dundant segments
1bb90 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
1bba0 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28  level */.    if(
1bbb0 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e   pLvl->nSeg!=nIn
1bbc0 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  put ){.      int
1bbd0 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e   nMove = (pLvl->
1bbe0 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a  nSeg - nInput) *
1bbf0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1bc00 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
1bc10 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76       memmove(pLv
1bc20 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  l->aSeg, &pLvl->
1bc30 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d  aSeg[nInput], nM
1bc40 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ove);.    }.    
1bc50 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1bc60 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20  t -= nInput;.   
1bc70 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e   pLvl->nSeg -= n
1bc80 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
1bc90 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20  >nMerge = 0;.   
1bca0 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   if( pSeg->pgnoL
1bcb0 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
1bcc0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b  pLvlOut->nSeg--;
1bcd0 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
1bce0 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  nSegment--;.    
1bcf0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
1bd00 73 73 65 72 74 28 20 70 53 65 67 2d 3e 6e 48 65  ssert( pSeg->nHe
1bd10 69 67 68 74 3e 30 20 26 26 20 70 53 65 67 2d 3e  ight>0 && pSeg->
1bd20 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20  pgnoLast>0 );.  
1bd30 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e    fts5TrimSegmen
1bd40 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ts(p, pIter);.  
1bd50 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d    pLvl->nMerge =
1bd60 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20   nInput;.  }..  
1bd70 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
1bd80 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66  e(p, pIter);.  f
1bd90 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
1bda0 65 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65  erm);.  if( pnRe
1bdb0 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72  m ) *pnRem -= wr
1bdc0 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65  iter.nLeafWritte
1bdd0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75  n;.}../*.** Do u
1bde0 70 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f  p to nPg pages o
1bdf0 66 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b  f automerge work
1be00 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   on the index..*
1be10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1be20 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20  s5IndexMerge(.  
1be30 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be50 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1be60 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
1be70 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
1be80 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
1be90 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
1bea0 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
1beb0 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20  x */.  int nPg  
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bed0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
1bee0 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f  of work to do */
1bef0 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d  .){.  int nRem =
1bf00 20 6e 50 67 3b 0a 20 20 46 74 73 35 53 74 72 75   nPg;.  Fts5Stru
1bf10 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
1bf20 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68   *ppStruct;.  wh
1bf30 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70  ile( nRem>0 && p
1bf40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1bf50 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65     /* To iterate
1bf80 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
1bf90 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74  */.    int iBest
1bfa0 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Lvl = 0;        
1bfb0 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65     /* Level offe
1bfc0 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e  ring the most in
1bfd0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
1bfe0 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20      int nBest = 
1bff0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1c000 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
1c010 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62  ut segments on b
1c020 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20  est level */..  
1c030 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76    /* Set iBestLv
1c040 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74  l to the level t
1c050 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73 65 67  o read input seg
1c060 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20  ments from. */. 
1c070 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
1c080 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a  ct->nLevel>0 );.
1c090 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
1c0a0 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1c0b0 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
1c0c0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
1c0d0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
1c0e0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1c0f0 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66  [iLvl];.      if
1c100 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  ( pLvl->nMerge )
1c110 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  {.        if( pL
1c120 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74  vl->nMerge>nBest
1c130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42   ){.          iB
1c140 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20  estLvl = iLvl;. 
1c150 20 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d           nBest =
1c160 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20   pLvl->nMerge;. 
1c170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c180 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c190 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
1c1a0 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20  nSeg>nBest ){.  
1c1b0 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c        nBest = pL
1c1c0 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20  vl->nSeg;.      
1c1d0 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76    iBestLvl = iLv
1c1e0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
1c1f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73  ..    /* If nBes
1c200 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68  t is still 0, th
1c210 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73  en the index mus
1c220 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23  t be empty. */.#
1c230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c240 55 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  UG.    for(iLvl=
1c250 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69  0; nBest==0 && i
1c260 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
1c270 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
1c280 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
1c290 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1c2a0 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20  ].nSeg==0 );.   
1c2b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
1c2c0 66 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e  f( nBest<p->pCon
1c2d0 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20  fig->nAutomerge 
1c2e0 0a 20 20 20 20 20 20 20 20 26 26 20 70 53 74 72  .        && pStr
1c2f0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73  uct->aLevel[iBes
1c300 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20  tLvl].nMerge==0 
1c310 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1c320 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c330 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
1c340 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74  evel(p, &pStruct
1c350 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65  , iBestLvl, &nRe
1c360 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  m);.    if( p->r
1c370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c380 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1c390 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65  iBestLvl].nMerge
1c3a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
1c3b0 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
1c3c0 65 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c  e(p, iBestLvl+1,
1c3d0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d   pStruct);.    }
1c3e0 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74  .  }.  *ppStruct
1c3f0 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f   = pStruct;.}../
1c400 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
1c410 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73  nLeaf leaf pages
1c420 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73   of data has jus
1c430 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74  t been flushed t
1c440 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73  o a level-0.** s
1c450 65 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e  egment. This fun
1c460 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68  ction updates th
1c470 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20  e write-counter 
1c480 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c  accordingly and,
1c490 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   if.** necessary
1c4a0 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65  , performs incre
1c4b0 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72  mental merge wor
1c4c0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  k..**.** If an e
1c4d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
1c4e0 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72   the Fts5Index.r
1c4f0 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  c error code. If
1c500 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
1c510 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
1c520 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
1c530 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
1c540 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1c550 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28  5IndexAutomerge(
1c560 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1c590 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
1c5a0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1c5b0 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
1c5c0 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
1c5d0 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
1c5e0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ndex */.  int nL
1c5f0 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
1c600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c610 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65  ber of output le
1c620 61 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65  aves just writte
1c630 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  n */.){.  if( p-
1c640 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1c650 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  & p->pConfig->nA
1c660 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20  utomerge>0 ){.  
1c670 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1c680 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
1c690 72 75 63 74 3b 0a 20 20 20 20 69 36 34 20 6e 57  ruct;.    i64 nW
1c6a0 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1c6b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
1c6c0 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74  al value of writ
1c6d0 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  e-counter */.   
1c6e0 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20   int nWork;     
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c700 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b  * Number of work
1c710 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f  -quanta to perfo
1c720 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  rm */.    int nR
1c730 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
1c740 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c750 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
1c760 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
1c770 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
1c780 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65  the write-counte
1c790 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73  r. While doing s
1c7a0 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f  o, set nWork. */
1c7b0 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53  .    nWrite = pS
1c7c0 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75  truct->nWriteCou
1c7d0 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20  nter;.    nWork 
1c7e0 3d 20 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65  = ((nWrite + nLe
1c7f0 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  af) / p->nWorkUn
1c800 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20  it) - (nWrite / 
1c810 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 3b 0a 20  p->nWorkUnit);. 
1c820 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69     pStruct->nWri
1c830 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65  teCounter += nLe
1c840 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 70  af;.    nRem = p
1c850 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57  ->nWorkUnit * nW
1c860 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e  ork * pStruct->n
1c870 4c 65 76 65 6c 3b 0a 0a 20 20 20 20 66 74 73 35  Level;..    fts5
1c880 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 70 70  IndexMerge(p, pp
1c890 53 74 72 75 63 74 2c 20 6e 52 65 6d 29 3b 0a 20  Struct, nRem);. 
1c8a0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1c8b0 64 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69  d fts5IndexCrisi
1c8c0 73 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  smerge(.  Fts5In
1c8d0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1c8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1c8f0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1c900 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1c910 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20  ure **ppStruct  
1c920 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1c930 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
1c940 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29  re of index */.)
1c950 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43  {.  const int nC
1c960 72 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66  risis = p->pConf
1c970 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65  ig->nCrisisMerge
1c980 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
1c990 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
1c9a0 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c  Struct;.  int iL
1c9b0 76 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  vl = 0;..  asser
1c9c0 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
1c9d0 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e  _OK || pStruct->
1c9e0 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68  nLevel>0 );.  wh
1c9f0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1ca00 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74  TE_OK && pStruct
1ca10 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
1ca20 53 65 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a  Seg>=nCrisis ){.
1ca30 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
1ca40 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72  geLevel(p, &pStr
1ca50 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20  uct, iLvl, 0);. 
1ca60 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1ca70 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b  Promote(p, iLvl+
1ca80 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  1, pStruct);.   
1ca90 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a   iLvl++;.  }.  *
1caa0 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
1cab0 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ct;.}..static in
1cac0 74 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  t fts5IndexRetur
1cad0 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  n(Fts5Index *p){
1cae0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
1caf0 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  c;.  p->rc = SQL
1cb00 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
1cb10 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20   rc;.}..typedef 
1cb20 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68  struct Fts5Flush
1cb30 43 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78  Ctx Fts5FlushCtx
1cb40 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  ;.struct Fts5Flu
1cb50 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e  shCtx {.  Fts5In
1cb60 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73  dex *pIdx;.  Fts
1cb70 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
1cb80 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75  r; .};../*.** Bu
1cb90 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74  ffer aBuf[] cont
1cba0 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76  ains a list of v
1cbb0 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c  arints, all smal
1cbc0 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a  l enough to fit.
1cbd0 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  ** in a 32-bit i
1cbe0 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74  nteger. Return t
1cbf0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c  he size of the l
1cc00 61 72 67 65 73 74 20 70 72 65 66 69 78 20 6f 66  argest prefix of
1cc10 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e   this .** list n
1cc20 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73  Max bytes or les
1cc30 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
1cc40 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73  atic int fts5Pos
1cc50 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74  listPrefix(const
1cc60 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e   u8 *aBuf, int n
1cc70 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b  Max){.  int ret;
1cc80 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20  .  u32 dummy;.  
1cc90 72 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  ret = fts5GetVar
1cca0 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d  int32(aBuf, dumm
1ccb0 79 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  y);.  while( 1 )
1ccc0 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74  {.    int i = ft
1ccd0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
1cce0 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29  Buf[ret], dummy)
1ccf0 3b 0a 20 20 20 20 69 66 28 20 28 72 65 74 20 2b  ;.    if( (ret +
1cd00 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65   i) > nMax ) bre
1cd10 61 6b 3b 0a 20 20 20 20 72 65 74 20 2b 3d 20 69  ak;.    ret += i
1cd20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cd30 65 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66  et;.}..#define f
1cd40 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1cd50 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 42  endBlob(pBuf, pB
1cd60 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 5c 0a  lob, nBlob) { \.
1cd70 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
1cd80 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 2d 3e 6e  nSpace>=(pBuf->n
1cd90 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20  +nBlob) );      
1cda0 20 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70         \.  memcp
1cdb0 79 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  y(&pBuf->p[pBuf-
1cdc0 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  >n], pBlob, nBlo
1cdd0 62 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  b);             
1cde0 5c 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e  \.  pBuf->n += n
1cdf0 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a           \.}../*
1ce20 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
1ce30 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d  ntents of in-mem
1ce40 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69  ory hash table i
1ce50 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65  Hash to a new le
1ce60 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e  vel-0 .** segmen
1ce70 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20  t on disk. Also 
1ce80 75 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65  update the corre
1ce90 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75  sponding structu
1cea0 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  re record..**.**
1ceb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1cec0 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
1ced0 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
1cee0 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
1cef0 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
1cf00 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1cf10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1cf20 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1cf30 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e  void fts5FlushOn
1cf40 65 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20  eHash(Fts5Index 
1cf50 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73 68 20  *p){.  Fts5Hash 
1cf60 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73  *pHash = p->pHas
1cf70 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  h;.  Fts5Structu
1cf80 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69  re *pStruct;.  i
1cf90 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74  nt iSegid;.  int
1cfa0 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20   pgnoLast = 0;  
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cfc0 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
1cfd0 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
1cfe0 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  nt */..  /* Obta
1cff0 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
1d000 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  o the index stru
1d010 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61  cture and alloca
1d020 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74  te a new segment
1d030 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  -id.  ** for the
1d040 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67   new level-0 seg
1d050 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72  ment.  */.  pStr
1d060 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1d070 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 53  ureRead(p);.  iS
1d080 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63  egid = fts5Alloc
1d090 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72  ateSegid(p, pStr
1d0a0 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  uct);..  if( iSe
1d0b0 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  gid ){.    const
1d0c0 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70   int pgsz = p->p
1d0d0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 0a 20  Config->pgsz;.. 
1d0e0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1d0f0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
1d100 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20   /* New segment 
1d110 77 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a  within pStruct *
1d120 2f 0a 20 20 20 20 69 6e 74 20 6e 48 65 69 67 68  /.    int nHeigh
1d130 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1d140 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66      /* Height of
1d150 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 62 2d 74   new segment b-t
1d160 72 65 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42  ree */.    Fts5B
1d170 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20  uffer *pBuf;    
1d180 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
1d190 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61  er in which to a
1d1a0 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67  ssemble leaf pag
1d1b0 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75  e */.    const u
1d1c0 38 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 0a 20  8 *zPrev = 0;.. 
1d1d0 20 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72     Fts5SegWriter
1d1e0 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73   writer;.    fts
1d1f0 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
1d200 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a  riter, iSegid);.
1d210 0a 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f  .    /* Pre-allo
1d220 63 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20  cate the buffer 
1d230 75 73 65 64 20 74 6f 20 61 73 73 65 6d 62 6c 65  used to assemble
1d240 20 6c 65 61 66 20 70 61 67 65 73 20 74 6f 20 74   leaf pages to t
1d250 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a  he target.    **
1d260 20 70 61 67 65 20 73 69 7a 65 2e 20 20 2a 2f 0a   page size.  */.
1d270 20 20 20 20 61 73 73 65 72 74 28 20 70 67 73 7a      assert( pgsz
1d280 3e 30 20 29 3b 0a 20 20 20 20 70 42 75 66 20 3d  >0 );.    pBuf =
1d290 20 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72   &writer.aWriter
1d2a0 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 66 74 73  [0].buf;.    fts
1d2b0 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1d2c0 72 63 2c 20 70 42 75 66 2c 20 70 67 73 7a 20 2b  rc, pBuf, pgsz +
1d2d0 20 32 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65   20);..    /* Be
1d2e0 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  gin scanning thr
1d2f0 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20  ough hash table 
1d300 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f  entries. This lo
1d310 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
1d320 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72   each.    ** ter
1d330 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e  m/doclist curren
1d340 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69  tly stored withi
1d350 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
1d360 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1d370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d380 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42  .      memset(pB
1d390 75 66 2d 3e 70 2c 20 30 2c 20 34 29 3b 0a 20 20  uf->p, 0, 4);.  
1d3a0 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 34 3b      pBuf->n = 4;
1d3b0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
1d3c0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
1d3d0 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c  anInit(pHash, 0,
1d3e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77   0);.    }.    w
1d3f0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1d400 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
1d410 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
1d420 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20  Eof(pHash) ){.  
1d430 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1d440 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  zTerm;          
1d450 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
1d460 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ning term */.   
1d470 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20     int nTerm;   
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d490 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20  * Size of zTerm 
1d4a0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
1d4b0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63    const u8 *pDoc
1d4c0 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  list;         /*
1d4d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   Pointer to docl
1d4e0 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72  ist for this ter
1d4f0 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  m */.      int n
1d500 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
1d510 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d520 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74  f doclist in byt
1d530 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
1d540 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20  nSuffix;        
1d550 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1d560 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20 2a  of term suffix *
1d570 2f 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  /..      sqlite3
1d580 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72  Fts5HashScanEntr
1d590 79 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  y(pHash, &zTerm,
1d5a0 20 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f   &pDoclist, &nDo
1d5b0 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 6e 54  clist);.      nT
1d5c0 65 72 6d 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65  erm = strlen(zTe
1d5d0 72 6d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  rm);..      /* D
1d5e0 65 63 69 64 65 20 69 66 20 74 68 65 20 74 65 72  ecide if the ter
1d5f0 6d 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  m will fit on th
1d600 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
1d610 49 66 20 69 74 20 77 69 6c 6c 20 6e 6f 74 2c 20  If it will not, 
1d620 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
1d630 74 68 65 20 6c 65 61 66 20 74 6f 20 64 69 73 6b  the leaf to disk
1d640 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20   here.  */.     
1d650 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
1d660 6e 54 65 72 6d 20 2b 20 32 29 20 3e 20 70 67 73  nTerm + 2) > pgs
1d670 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  z ){.        fts
1d680 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1d690 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
1d6a0 20 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69       pBuf = &wri
1d6b0 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e 62  ter.aWriter[0].b
1d6c0 75 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  uf;.        if( 
1d6d0 28 6e 54 65 72 6d 20 2b 20 33 32 29 20 3e 20 70  (nTerm + 32) > p
1d6e0 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20  Buf->nSpace ){. 
1d6f0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1d700 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
1d710 70 42 75 66 2c 20 6e 54 65 72 6d 20 2b 20 33 32  pBuf, nTerm + 32
1d720 20 2d 20 70 42 75 66 2d 3e 6e 29 3b 0a 20 20 20   - pBuf->n);.   
1d730 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1d740 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1d750 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1d760 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1d770 74 65 72 6d 20 74 6f 20 74 68 65 20 6c 65 61 66  term to the leaf
1d780 2e 20 41 6e 64 20 69 66 20 69 74 20 69 73 20 74  . And if it is t
1d790 68 65 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20  he first on the 
1d7a0 6c 65 61 66 2c 20 61 6e 64 0a 20 20 20 20 20 20  leaf, and.      
1d7b0 2a 2a 20 74 68 65 20 6c 65 61 66 20 69 73 20 6e  ** the leaf is n
1d7c0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 31  ot page number 1
1d7d0 2c 20 70 75 73 68 20 69 74 20 75 70 20 69 6e 74  , push it up int
1d7e0 6f 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  o the b-tree hie
1d7f0 72 61 72 63 68 79 20 0a 20 20 20 20 20 20 2a 2a  rarchy .      **
1d800 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
1d810 20 20 20 20 69 66 28 20 77 72 69 74 65 72 2e 62      if( writer.b
1d820 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 3d  FirstTermInPage=
1d830 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
1d840 74 20 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65  t nPre = fts5Pre
1d850 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 54 65 72  fixCompress(nTer
1d860 6d 2c 20 7a 50 72 65 76 2c 20 6e 54 65 72 6d 2c  m, zPrev, nTerm,
1d870 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72   (const u8*)zTer
1d880 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66  m);.        pBuf
1d890 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 50 75  ->n += sqlite3Pu
1d8a0 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
1d8b0 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e 50 72 65 29  [pBuf->n], nPre)
1d8c0 3b 0a 20 20 20 20 20 20 20 20 6e 53 75 66 66 69  ;.        nSuffi
1d8d0 78 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65  x = nTerm - nPre
1d8e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d8f0 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31         fts5PutU1
1d900 36 28 26 70 42 75 66 2d 3e 70 5b 32 5d 2c 20 70  6(&pBuf->p[2], p
1d910 42 75 66 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Buf->n);.       
1d920 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 54 65   writer.bFirstTe
1d930 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  rmInPage = 0;.  
1d940 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72        if( writer
1d950 2e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f  .aWriter[0].pgno
1d960 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=1 ){.         
1d970 20 69 6e 74 20 6e 50 72 65 20 3d 20 66 74 73 35   int nPre = fts5
1d980 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 6e  PrefixCompress(n
1d990 54 65 72 6d 2c 20 7a 50 72 65 76 2c 20 6e 54 65  Term, zPrev, nTe
1d9a0 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a  rm, (const u8*)z
1d9b0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  Term);.         
1d9c0 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54   fts5WriteBtreeT
1d9d0 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20  erm(p, &writer, 
1d9e0 6e 50 72 65 2b 31 2c 20 28 63 6f 6e 73 74 20 75  nPre+1, (const u
1d9f0 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
1da00 20 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69       pBuf = &wri
1da10 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e 62  ter.aWriter[0].b
1da20 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  uf;.          as
1da30 73 65 72 74 28 20 6e 50 72 65 3c 6e 54 65 72 6d  sert( nPre<nTerm
1da40 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
1da50 20 20 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20        nSuffix = 
1da60 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  nTerm;.      }. 
1da70 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20       pBuf->n += 
1da80 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74  sqlite3PutVarint
1da90 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
1daa0 6e 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  n], nSuffix);.  
1dab0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1dac0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
1dad0 66 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 7a  f, (const u8*)&z
1dae0 54 65 72 6d 5b 6e 54 65 72 6d 2d 6e 53 75 66 66  Term[nTerm-nSuff
1daf0 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 0a  ix], nSuffix);..
1db00 20 20 20 20 20 20 2f 2a 20 57 65 20 6a 75 73 74        /* We just
1db10 20 77 72 6f 74 65 20 61 20 74 65 72 6d 20 69 6e   wrote a term in
1db20 74 6f 20 70 61 67 65 20 77 72 69 74 65 72 2e 61  to page writer.a
1db30 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 2e 20  Writer[0].pgno. 
1db40 49 66 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 64  If a .      ** d
1db50 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20  oclist-index is 
1db60 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
1db70 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74  for this doclist
1db80 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  , it will be.   
1db90 20 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64     ** associated
1dba0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 2e   with this page.
1dbb0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1dbc0 28 20 77 72 69 74 65 72 2e 6e 44 6c 69 64 78 3e  ( writer.nDlidx>
1dbd0 30 20 26 26 20 77 72 69 74 65 72 2e 61 44 6c 69  0 && writer.aDli
1dbe0 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29  dx[0].buf.n==0 )
1dbf0 3b 0a 20 20 20 20 20 20 77 72 69 74 65 72 2e 61  ;.      writer.a
1dc00 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20  Dlidx[0].pgno = 
1dc10 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30  writer.aWriter[0
1dc20 5d 2e 70 67 6e 6f 3b 0a 0a 20 20 20 20 20 20 69  ].pgno;..      i
1dc30 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e  f( pgsz>=(pBuf->
1dc40 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31  n + nDoclist + 1
1dc50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1dc60 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  The entire docli
1dc70 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  st will fit on t
1dc80 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1dc90 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
1dca0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1dcb0 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c  Blob(pBuf, pDocl
1dcc0 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ist, nDoclist);.
1dcd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dce0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
1dcf0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
1dd00 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20   iDelta = 0;.   
1dd10 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
1dd20 30 3b 0a 0a 20 20 20 20 20 20 20 20 77 72 69 74  0;..        writ
1dd30 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
1dd40 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Page = 0;..     
1dd50 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
1dd60 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f   doclist will no
1dd70 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65  t fit on this le
1dd80 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  af. The followin
1dd90 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  g .        ** lo
1dda0 6f 70 20 69 74 65 72 61 74 65 73 20 74 68 72 6f  op iterates thro
1ddb0 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74 73  ugh the poslists
1ddc0 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
1ddd0 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 20  e current .     
1dde0 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20     ** doclist.  
1ddf0 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
1de00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1de10 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c  OK && iOff<nDocl
1de20 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
1de30 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
1de40 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a       int nCopy;.
1de50 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 44            int bD
1de60 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
1de70 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
1de80 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  t(&pDoclist[iOff
1de90 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
1dea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f  );.          nCo
1deb0 70 79 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  py = fts5GetPosl
1dec0 69 73 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73  istSize(&pDoclis
1ded0 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  t[iOff], &nPos, 
1dee0 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  &bDummy);.      
1def0 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f      nCopy += nPo
1df00 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  s;.          iRo
1df10 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  wid += iDelta;. 
1df20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
1df30 20 20 20 20 69 66 28 20 77 72 69 74 65 72 2e 62      if( writer.b
1df40 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1df50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1df60 66 74 73 35 50 75 74 55 31 36 28 26 70 42 75 66  fts5PutU16(&pBuf
1df70 2d 3e 70 5b 30 5d 2c 20 70 42 75 66 2d 3e 6e 29  ->p[0], pBuf->n)
1df80 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 64 6f 63  ;   /* first doc
1df90 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  id on page */.  
1dfa0 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
1dfb0 6e 20 2b 3d 20 73 71 6c 69 74 65 33 50 75 74 56  n += sqlite3PutV
1dfc0 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
1dfd0 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29  Buf->n], iRowid)
1dfe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72  ;.            wr
1dff0 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
1e000 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  InPage = 0;.    
1e010 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
1e020 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
1e030 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  &writer, iRowid)
1e040 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1e050 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
1e060 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
1e070 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66  3PutVarint(&pBuf
1e080 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44  ->p[pBuf->n], iD
1e090 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  elta);.         
1e0a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
1e0b0 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42  ert( pBuf->n<=pB
1e0c0 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20  uf->nSpace );.. 
1e0d0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42           if( (pB
1e0e0 75 66 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c  uf->n + nCopy) <
1e0f0 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  = pgsz ){.      
1e100 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
1e110 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c  ire poslist will
1e120 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72   fit on the curr
1e130 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70  ent leaf. So cop
1e140 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  y.            **
1e150 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a   it in one go. *
1e160 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  /.            ft
1e170 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1e180 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44  ndBlob(pBuf, &pD
1e190 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43  oclist[iOff], nC
1e1a0 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opy);.          
1e1b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e1c0 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
1e1d0 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f   poslist will no
1e1e0 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65  t fit on this le
1e1f0 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73 0a  af. So it needs.
1e200 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1e210 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f  o be broken into
1e220 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f   sections. The o
1e230 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f  nly qualificatio
1e240 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  n being.        
1e250 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68      ** that each
1e260 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20   varint must be 
1e270 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75  stored contiguou
1e280 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  sly.  */.       
1e290 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
1e2a0 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c  Poslist = &pDocl
1e2b0 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  ist[iOff];.     
1e2c0 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20         int iPos 
1e2d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
1e2e0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1e2f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e300 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53            int nS
1e310 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42  pace = pgsz - pB
1e320 75 66 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20  uf->n;.         
1e330 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1e350 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29  ( (nCopy - iPos)
1e360 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20  <=nSpace ){.    
1e370 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
1e380 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20  nCopy - iPos;.  
1e390 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1e3a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1e3b0 20 20 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69     n = fts5Posli
1e3c0 73 74 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69  stPrefix(&pPosli
1e3d0 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65  st[iPos], nSpace
1e3e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1e3f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1e400 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
1e420 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1e430 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50  ndBlob(pBuf, &pP
1e440 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29  oslist[iPos], n)
1e450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e460 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  iPos += n;.     
1e470 20 20 20 20 20 20 20 20 20 69 66 28 20 70 42 75           if( pBu
1e480 66 2d 3e 6e 3e 3d 70 67 73 7a 20 29 7b 0a 20 20  f->n>=pgsz ){.  
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
1e4a0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1e4b0 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20  (p, &writer);.  
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
1e4d0 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72  uf = &writer.aWr
1e4e0 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20  iter[0].buf;.   
1e4f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e500 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
1e510 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65  Pos>=nCopy ) bre
1e520 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1e530 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1e540 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
1e550 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 7d  nCopy;.        }
1e560 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1e570 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b  pBuf->p[pBuf->n+
1e580 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  +] = '\0';.     
1e590 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
1e5a0 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  <=pBuf->nSpace )
1e5b0 3b 0a 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20  ;.      zPrev = 
1e5c0 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d  (const u8*)zTerm
1e5d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
1e5e0 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28  ts5HashScanNext(
1e5f0 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20  pHash);.    }.  
1e600 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1e610 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20  hClear(pHash);. 
1e620 20 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69     fts5WriteFini
1e630 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26  sh(p, &writer, &
1e640 6e 48 65 69 67 68 74 2c 20 26 70 67 6e 6f 4c 61  nHeight, &pgnoLa
1e650 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  st);..    /* Upd
1e660 61 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75  ate the Fts5Stru
1e670 63 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69  cture. It is wri
1e680 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65  tten back to the
1e690 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65   database by the
1e6a0 0a 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75  .    ** fts5Stru
1e6b0 63 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63  ctureRelease() c
1e6c0 61 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  all below.  */. 
1e6d0 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
1e6e0 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  nLevel==0 ){.   
1e6f0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1e700 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  AddLevel(&p->rc,
1e710 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20   &pStruct);.    
1e720 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
1e730 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26  ureExtendLevel(&
1e740 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20  p->rc, pStruct, 
1e750 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
1e760 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67  OK ){.      pSeg
1e780 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1e790 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74  vel[0].aSeg[ pSt
1e7a0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e  ruct->aLevel[0].
1e7b0 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20  nSeg++ ];.      
1e7c0 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
1e7d0 53 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65  Segid;.      pSe
1e7e0 67 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  g->nHeight = nHe
1e7f0 69 67 68 74 3b 0a 20 20 20 20 20 20 70 53 65 67  ight;.      pSeg
1e800 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
1e810 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
1e820 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74  oLast = pgnoLast
1e830 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
1e840 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20  >nSegment++;.   
1e850 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
1e860 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30  turePromote(p, 0
1e870 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
1e880 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74  ..  fts5IndexAut
1e890 6f 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  omerge(p, &pStru
1e8a0 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  ct, pgnoLast);. 
1e8b0 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1e8c0 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
1e8d0 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
1e8e0 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72  ureWrite(p, pStr
1e8f0 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
1e900 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1e910 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ruct);.}../*.** 
1e920 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73  Flush any data s
1e930 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
1e940 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1e950 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1e960 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
1e970 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  id fts5IndexFlus
1e980 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  h(Fts5Index *p){
1e990 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20  .  /* Unless it 
1e9a0 69 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20  is empty, flush 
1e9b0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74  the hash table t
1e9c0 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20  o disk */.  if( 
1e9d0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
1e9e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e9f0 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70  ->pHash );.    p
1ea00 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
1ea10 20 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73   0;.    fts5Flus
1ea20 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d  hOneHash(p);.  }
1ea30 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
1ea40 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  Fts5IndexOptimiz
1ea50 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
1ea60 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1ea70 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
1ea80 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77  5Structure *pNew
1ea90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67   = 0;.  int nSeg
1eaa0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1eab0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1eac0 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  K );.  fts5Index
1ead0 46 6c 75 73 68 28 70 29 3b 0a 20 20 70 53 74 72  Flush(p);.  pStr
1eae0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1eaf0 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69  ureRead(p);..  i
1eb00 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
1eb10 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
1eb20 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
1eb30 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
1eb40 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
1eb50 20 29 3b 0a 20 20 20 20 6e 53 65 67 20 3d 20 70   );.    nSeg = p
1eb60 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
1eb70 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3e 31  ;.    if( nSeg>1
1eb80 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
1eb90 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
1eba0 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20 20  5Structure);.   
1ebb0 20 20 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74     nByte += (pSt
1ebc0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20  ruct->nLevel+1) 
1ebd0 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1ebe0 75 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20  uctureLevel);.  
1ebf0 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35      pNew = (Fts5
1ec00 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74  Structure*)sqlit
1ec10 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1ec20 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
1ec30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1ec40 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73   pNew ){.    Fts
1ec50 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
1ec60 2a 70 4c 76 6c 3b 0a 20 20 20 20 69 6e 74 20 6e  *pLvl;.    int n
1ec70 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73 69  Byte = nSeg * si
1ec80 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1ec90 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
1eca0 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70  pNew->nLevel = p
1ecb0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31  Struct->nLevel+1
1ecc0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69  ;.    pNew->nWri
1ecd0 74 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72  teCounter = pStr
1ece0 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
1ecf0 65 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26  er;.    pLvl = &
1ed00 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  pNew->aLevel[pSt
1ed10 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
1ed20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
1ed30 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
1ed40 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
1ed50 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
1ed60 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >rc, nByte);.   
1ed70 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20   if( pLvl->aSeg 
1ed80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76  ){.      int iLv
1ed90 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69  l, iSeg;.      i
1eda0 6e 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a  nt iSegOut = 0;.
1edb0 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30        for(iLvl=0
1edc0 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
1edd0 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
1ede0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
1edf0 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63  g=0; iSeg<pStruc
1ee00 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1ee10 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
1ee20 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61           pLvl->a
1ee30 53 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70  Seg[iSegOut] = p
1ee40 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1ee50 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
1ee60 0a 20 20 20 20 20 20 20 20 20 20 69 53 65 67 4f  .          iSegO
1ee70 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ut++;.        }.
1ee80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
1ee90 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70  ew->nSegment = p
1eea0 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67  Lvl->nSeg = nSeg
1eeb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1eec0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1eed0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
1eee0 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  w = 0;.    }.  }
1eef0 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ..  if( pNew ){.
1ef00 20 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70      int iLvl = p
1ef10 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20  New->nLevel-1;. 
1ef20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1ef30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e  =SQLITE_OK && pN
1ef40 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ew->aLevel[iLvl]
1ef50 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20  .nSeg>0 ){.     
1ef60 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53 35   int nRem = FTS5
1ef70 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a  _OPT_WORK_UNIT;.
1ef80 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d        fts5IndexM
1ef90 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e  ergeLevel(p, &pN
1efa0 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29  ew, iLvl, &nRem)
1efb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
1efc0 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
1efd0 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66 74  p, pNew);.    ft
1efe0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1eff0 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  se(pNew);.  }.. 
1f000 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1f010 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
1f020 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
1f030 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a  exReturn(p); .}.
1f040 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1f050 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49  IndexMerge(Fts5I
1f060 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65  ndex *p, int nMe
1f070 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75  rge){.  Fts5Stru
1f080 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
1f090 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
1f0a0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
1f0b0 29 3b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  );.  if( pStruct
1f0c0 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   && pStruct->nLe
1f0d0 76 65 6c 20 29 7b 0a 20 20 20 20 66 74 73 35 49  vel ){.    fts5I
1f0e0 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 26 70 53  ndexMerge(p, &pS
1f0f0 74 72 75 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a  truct, nMerge);.
1f100 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1f110 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63  eWrite(p, pStruc
1f120 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74  t);.  }.  fts5St
1f130 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
1f140 53 74 72 75 63 74 29 3b 0a 0a 20 20 72 65 74 75  Struct);..  retu
1f150 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
1f160 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn(p);.}..static
1f170 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73   void fts5Poslis
1f180 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  tCallback(.  Fts
1f190 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f  5Index *p, .  vo
1f1a0 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e  id *pCtx, .  con
1f1b0 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
1f1c0 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 66  nt nChunk.){.  f
1f1d0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1f1e0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 28 46 74 73  lob(&p->rc, (Fts
1f1f0 35 42 75 66 66 65 72 2a 29 70 43 74 78 2c 20 6e  5Buffer*)pCtx, n
1f200 43 68 75 6e 6b 2c 20 70 43 68 75 6e 6b 29 3b 0a  Chunk, pChunk);.
1f210 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
1f220 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
1f230 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61  y points to a va
1f240 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45  lid entry (not E
1f250 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  OF). This.** fun
1f260 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68  ction appends th
1f270 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
1f280 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72  data for the cur
1f290 72 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  rent entry to.**
1f2a0 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74   buffer pBuf. It
1f2b0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
1f2c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73   copy of the pos
1f2d0 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a  ition-list size.
1f2e0 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61  ** field..*/.sta
1f2f0 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
1f300 69 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46  iterPoslist(.  F
1f310 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
1f320 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1f330 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
1f340 70 42 75 66 0a 29 7b 0a 20 20 66 74 73 35 43 68  pBuf.){.  fts5Ch
1f350 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53  unkIterate(p, pS
1f360 65 67 2c 20 28 76 6f 69 64 2a 29 70 42 75 66 2c  eg, (void*)pBuf,
1f370 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c   fts5PoslistCall
1f380 62 61 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  back);.}../*.** 
1f390 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20  Iterator pMulti 
1f3a0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1f3b0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1f3c0 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69  y (not EOF). Thi
1f3d0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
1f3e0 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66 20  pends a copy of 
1f3f0 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
1f400 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 70  t of the entry p
1f410 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65 6e  Multi .** curren
1f420 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f  tly points to to
1f430 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
1f440 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1f450 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1f460 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
1f470 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61 73   p->rc. It is as
1f480 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f  sumed.** no erro
1f490 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
1f4a0 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
1f4b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f4c0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
1f4d0 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
1f4e0 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
1f4f0 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
1f500 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d  MultiSegIter *pM
1f510 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a 2c  ulti,.  int bSz,
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e          /* Appen
1f540 64 20 61 20 73 69 7a 65 20 66 69 65 6c 64 20 62  d a size field b
1f550 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 20 2a  efore the data *
1f560 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
1f570 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d  pBuf.){.  if( p-
1f580 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1f590 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1f5a0 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74  r *pSeg = &pMult
1f5b0 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d  i->aSeg[ pMulti-
1f5c0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
1f5d0 74 20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t ];.    assert(
1f5e0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1f5f0 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20  f(p, pMulti)==0 
1f600 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 53 7a 20  );..    if( bSz 
1f610 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 52 49 54  ){.      /* WRIT
1f620 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
1f630 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1f640 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1f650 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d  >rc, pBuf, pSeg-
1f660 3e 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20 7d 0a  >nPos*2);.    }.
1f670 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50      fts5SegiterP
1f680 6f 73 6c 69 73 74 28 70 2c 20 70 53 65 67 2c 20  oslist(p, pSeg, 
1f690 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  pBuf);.  }.}..st
1f6a0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
1f6b0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46 74  clistIterNext(Ft
1f6c0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
1f6d0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
1f6e0 65 72 2d 3e 69 3c 70 49 74 65 72 2d 3e 6e 20 29  er->i<pIter->n )
1f6f0 7b 0a 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79  {.    int bDummy
1f700 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
1f710 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  >i ){.      i64 
1f720 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 70 49  iDelta;.      pI
1f730 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72  ter->i += getVar
1f740 69 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49  int(&pIter->a[pI
1f750 74 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26  ter->i], (u64*)&
1f760 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69  iDelta);.      i
1f770 66 28 20 70 49 74 65 72 2d 3e 62 44 65 73 63 20  f( pIter->bDesc 
1f780 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ){.        pIter
1f790 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c  ->iRowid -= iDel
1f7a0 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ta;.      }else{
1f7b0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
1f7c0 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
1f7d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1f7e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72  lse{.      pIter
1f7f0 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ->i += getVarint
1f800 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72  (&pIter->a[pIter
1f810 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  ->i], (u64*)&pIt
1f820 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
1f830 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20   }.    pIter->i 
1f840 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
1f850 74 53 69 7a 65 28 0a 20 20 20 20 20 20 20 20 26  tSize(.        &
1f860 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e  pIter->a[pIter->
1f870 69 5d 2c 20 26 70 49 74 65 72 2d 3e 6e 50 6f 73  i], &pIter->nPos
1f880 6c 69 73 74 2c 20 26 62 44 75 6d 6d 79 0a 20 20  list, &bDummy.  
1f890 20 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e    );.    pIter->
1f8a0 61 50 6f 73 6c 69 73 74 20 3d 20 26 70 49 74 65  aPoslist = &pIte
1f8b0 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 3b 0a  r->a[pIter->i];.
1f8c0 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20      pIter->i += 
1f8d0 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b  pIter->nPoslist;
1f8e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
1f8f0 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20  ter->aPoslist = 
1f900 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
1f910 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73   void fts5Doclis
1f920 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  tIterInit(.  Fts
1f930 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a  5Buffer *pBuf, .
1f940 20 20 69 6e 74 20 62 44 65 73 63 2c 20 0a 20 20    int bDesc, .  
1f950 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
1f960 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73  *pIter.){.  mems
1f970 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
1f980 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
1f990 70 49 74 65 72 2d 3e 61 20 3d 20 70 42 75 66 2d  pIter->a = pBuf-
1f9a0 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d  >p;.  pIter->n =
1f9b0 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 70 49 74 65   pBuf->n;.  pIte
1f9c0 72 2d 3e 62 44 65 73 63 20 3d 20 62 44 65 73 63  r->bDesc = bDesc
1f9d0 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49  ;.  fts5DoclistI
1f9e0 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
1f9f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1fa00 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66  a doclist to buf
1fa10 66 65 72 20 70 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer pBuf..*/.sta
1fa20 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
1fa30 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20  geAppendDocid(. 
1fa40 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
1fa70 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
1fa80 62 44 65 73 63 2c 0a 20 20 46 74 73 35 42 75 66  bDesc,.  Fts5Buf
1fa90 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20  fer *pBuf,      
1faa0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
1fab0 65 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  er to write to *
1fac0 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52  /.  i64 *piLastR
1fad0 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
1fae0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
1faf0 72 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72  revious rowid wr
1fb00 69 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a  itten (if any) *
1fb10 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20  /.  i64 iRowid  
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb30 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20      /* Rowid to 
1fb40 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69  append */.){.  i
1fb50 66 28 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b  f( pBuf->n==0 ){
1fb60 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1fb70 70 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c  ppendVarint(pRc,
1fb80 20 70 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a   pBuf, iRowid);.
1fb90 20 20 7d 65 6c 73 65 20 69 66 28 20 62 44 65 73    }else if( bDes
1fba0 63 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  c ){.    fts5Buf
1fbb0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1fbc0 70 52 63 2c 20 70 42 75 66 2c 20 2a 70 69 4c 61  pRc, pBuf, *piLa
1fbd0 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77 69 64  stRowid - iRowid
1fbe0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1fbf0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fc00 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66  Varint(pRc, pBuf
1fc10 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61  , iRowid - *piLa
1fc20 73 74 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  stRowid);.  }.  
1fc30 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69  *piLastRowid = i
1fc40 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1fc50 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20 70  Buffers p1 and p
1fc60 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73  2 contain doclis
1fc70 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
1fc80 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e  n merges the con
1fc90 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74  tent.** of the t
1fca0 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65  wo doclists toge
1fcb0 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62 75  ther and sets bu
1fcc0 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20 72  ffer p1 to the r
1fcd0 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20  esult before.** 
1fce0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1fcf0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1fd00 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1fd10 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d  de is left in p-
1fd20 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  >rc. If an error
1fd30 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
1fd40 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
1fd50 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1fd60 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1fd70 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65 66  id fts5MergePref
1fd80 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49  ixLists(.  Fts5I
1fd90 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1fda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1fdb0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1fdc0 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  t */.  int bDesc
1fdd0 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
1fde0 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
1fdf0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73      /* First lis
1fe00 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20  t to merge */.  
1fe10 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20  Fts5Buffer *p2  
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe30 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74  /* Second list t
1fe40 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20  o merge */.){.  
1fe50 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20  if( p2->n ){.   
1fe60 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
1fe70 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63  = 0;.    Fts5Doc
1fe80 6c 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20  listIter i1;.   
1fe90 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
1fea0 20 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66   i2;.    Fts5Buf
1feb0 66 65 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73  fer out;.    Fts
1fec0 35 42 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20  5Buffer tmp;.   
1fed0 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c   memset(&out, 0,
1fee0 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20   sizeof(out));. 
1fef0 20 20 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20     memset(&tmp, 
1ff00 30 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b  0, sizeof(tmp));
1ff10 0a 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ..    fts5Doclis
1ff20 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20 62 44  tIterInit(p1, bD
1ff30 65 73 63 2c 20 26 69 31 29 3b 0a 20 20 20 20 66  esc, &i1);.    f
1ff40 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
1ff50 69 74 28 70 32 2c 20 62 44 65 73 63 2c 20 26 69  it(p2, bDesc, &i
1ff60 32 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  2);.    while( p
1ff70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ff80 26 26 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 21  && (i1.aPoslist!
1ff90 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73  =0 || i2.aPoslis
1ffa0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69  t!=0) ){.      i
1ffb0 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i2.aPoslist==
1ffc0 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73  0 || (i1.aPoslis
1ffd0 74 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  t && .          
1ffe0 20 28 20 28 62 44 65 73 63 20 26 26 20 69 31 2e   ( (bDesc && i1.
1fff0 69 52 6f 77 69 64 3e 69 32 2e 69 52 6f 77 69 64  iRowid>i2.iRowid
20000 29 20 7c 7c 20 28 21 62 44 65 73 63 20 26 26 20  ) || (!bDesc && 
20010 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f  i1.iRowid<i2.iRo
20020 77 69 64 29 20 29 0a 20 20 20 20 20 20 29 29 7b  wid) ).      )){
20030 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
20040 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31 20 2a   entry from i1 *
20050 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  /.        fts5Me
20060 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
20070 70 2d 3e 72 63 2c 20 62 44 65 73 63 2c 20 26 6f  p->rc, bDesc, &o
20080 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c  ut, &iLastRowid,
20090 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i1.iRowid);.   
200a0 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53       /* WRITEPOS
200b0 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20  LISTSIZE */.    
200c0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
200d0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
200e0 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73  c, &out, i1.nPos
200f0 6c 69 73 74 20 2a 20 32 29 3b 0a 20 20 20 20 20  list * 2);.     
20100 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
20110 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
20120 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  &out, i1.nPoslis
20130 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b  t, i1.aPoslist);
20140 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
20150 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
20160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20170 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61 50 6f   else if( i1.aPo
20180 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 69  slist==0 || i2.i
20190 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69 64  Rowid!=i1.iRowid
201a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
201b0 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69  opy entry from i
201c0 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  2 */.        fts
201d0 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
201e0 64 28 26 70 2d 3e 72 63 2c 20 62 44 65 73 63 2c  d(&p->rc, bDesc,
201f0 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77   &out, &iLastRow
20200 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a  id, i2.iRowid);.
20210 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45          /* WRITE
20220 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20  POSLISTSIZE */. 
20230 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
20240 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
20250 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e  ->rc, &out, i2.n
20260 50 6f 73 6c 69 73 74 20 2a 20 32 29 3b 0a 20 20  Poslist * 2);.  
20270 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
20280 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
20290 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73  c, &out, i2.nPos
202a0 6c 69 73 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73  list, i2.aPoslis
202b0 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t);.        fts5
202c0 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
202d0 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &i2);.      }.  
202e0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
202f0 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61    Fts5PoslistRea
20300 64 65 72 20 72 31 3b 0a 20 20 20 20 20 20 20 20  der r1;.        
20310 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
20320 72 20 72 32 3b 0a 20 20 20 20 20 20 20 20 46 74  r r2;.        Ft
20330 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20  s5PoslistWriter 
20340 77 72 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 20  writer;..       
20350 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c   memset(&writer,
20360 20 30 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65   0, sizeof(write
20370 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  r));..        /*
20380 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20 70   Merge the two p
20390 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a  osition lists. *
203a0 2f 20 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  / .        fts5M
203b0 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
203c0 26 70 2d 3e 72 63 2c 20 62 44 65 73 63 2c 20 26  &p->rc, bDesc, &
203d0 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64  out, &iLastRowid
203e0 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
203f0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
20400 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20  Zero(&tmp);.    
20410 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
20420 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
20430 28 2d 31 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74  (-1, i1.aPoslist
20440 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i1.nPoslist, &
20450 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
20460 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
20470 65 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 32  eaderInit(-1, i2
20480 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50  .aPoslist, i2.nP
20490 6f 73 6c 69 73 74 2c 20 26 72 32 29 3b 0a 20 20  oslist, &r2);.  
204a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
204b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
204c0 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 7c 7c 20   (r1.bEof==0 || 
204d0 72 32 2e 62 45 6f 66 3d 3d 30 29 20 29 7b 0a 20  r2.bEof==0) ){. 
204e0 20 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65           i64 iNe
204f0 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  w;.          if(
20500 20 72 32 2e 62 45 6f 66 20 7c 7c 20 28 72 31 2e   r2.bEof || (r1.
20510 62 45 6f 66 3d 3d 30 20 26 26 20 72 31 2e 69 50  bEof==0 && r1.iP
20520 6f 73 3c 72 32 2e 69 50 6f 73 29 20 29 7b 0a 20  os<r2.iPos) ){. 
20530 20 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20             iNew 
20540 3d 20 72 31 2e 69 50 6f 73 3b 0a 20 20 20 20 20  = r1.iPos;.     
20550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
20560 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e  s5PoslistReaderN
20570 65 78 74 28 26 72 31 29 3b 0a 20 20 20 20 20 20  ext(&r1);.      
20580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20590 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 72 32         iNew = r2
205a0 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20  .iPos;.         
205b0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
205c0 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
205d0 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &r2);.          
205e0 20 20 69 66 28 20 72 31 2e 69 50 6f 73 3d 3d 72    if( r1.iPos==r
205f0 32 2e 69 50 6f 73 20 29 20 73 71 6c 69 74 65 33  2.iPos ) sqlite3
20600 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
20610 72 4e 65 78 74 28 26 72 31 29 3b 0a 20 20 20 20  rNext(&r1);.    
20620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20630 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
20640 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74  3Fts5PoslistWrit
20650 65 72 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  erAppend(&tmp, &
20660 77 72 69 74 65 72 2c 20 69 4e 65 77 29 3b 0a 20  writer, iNew);. 
20670 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
20680 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
20690 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20  TSIZE */.       
206a0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
206b0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
206c0 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29  &out, tmp.n * 2)
206d0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
206e0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
206f0 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70  p->rc, &out, tmp
20700 2e 6e 2c 20 74 6d 70 2e 70 29 3b 0a 20 20 20 20  .n, tmp.p);.    
20710 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
20720 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
20730 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
20740 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a  tIterNext(&i2);.
20750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20760 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
20770 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74  (&p->rc, p1, out
20780 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20  .n, out.p);.    
20790 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
207a0 74 6d 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75  tmp);.    fts5Bu
207b0 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a  fferFree(&out);.
207c0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
207d0 69 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61  id fts5BufferSwa
207e0 70 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31  p(Fts5Buffer *p1
207f0 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32  , Fts5Buffer *p2
20800 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ){.  Fts5Buffer 
20810 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31  tmp = *p1;.  *p1
20820 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20   = *p2;.  *p2 = 
20830 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  tmp;.}..static v
20840 6f 69 64 20 66 74 73 35 53 65 74 75 70 50 72 65  oid fts5SetupPre
20850 66 69 78 49 74 65 72 28 0a 20 20 46 74 73 35 49  fixIter(.  Fts5I
20860 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
20870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20880 64 65 78 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  dex to read from
20890 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c   */.  int bDesc,
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
208c0 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69  r "ORDER BY rowi
208d0 64 20 44 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e  d DESC" */.  con
208e0 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20  st u8 *pToken,  
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20900 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
20910 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61 74 63  g prefix to matc
20920 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65  h */.  int nToke
20930 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
20940 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
20950 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65 6e 20  f buffer pToken 
20960 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46 74  in bytes */.  Ft
20970 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
20980 65 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er            /*
20990 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f   Populate this o
209a0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74  bject */.){.  Ft
209b0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
209c0 72 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66  ruct;.  Fts5Buff
209d0 65 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73  er *aBuf;.  cons
209e0 74 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b  t int nBuf = 32;
209f0 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35  ..  aBuf = (Fts5
20a00 42 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d  Buffer*)fts5IdxM
20a10 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
20a20 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66  Fts5Buffer)*nBuf
20a30 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  );.  pStruct = f
20a40 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
20a50 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66  (p);..  if( aBuf
20a60 20 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20   && pStruct ){. 
20a70 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
20a80 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51  gs = FTS5INDEX_Q
20a90 55 45 52 59 5f 53 43 41 4e 3b 0a 20 20 20 20 46  UERY_SCAN;.    F
20aa0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a  ts5DoclistIter *
20ab0 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e  pDoclist;.    in
20ac0 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61  t i;.    i64 iLa
20ad0 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
20ae0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
20af0 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f  r *p1 = 0;     /
20b00 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20  * Iterator used 
20b10 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66  to gather data f
20b20 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  rom index */.   
20b30 20 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c   Fts5Buffer docl
20b40 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  ist;..    memset
20b50 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69  (&doclist, 0, si
20b60 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a  zeof(doclist));.
20b70 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74      for(fts5Mult
20b80 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
20b90 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c 20 70  uct, 1, flags, p
20ba0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d  Token, nToken, -
20bb0 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20 20  1, 0, &p1);.    
20bc0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
20bd0 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a  rEof(p, p1)==0;.
20be0 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
20bf0 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 31 2c  iIterNext(p, p1,
20c00 20 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20 20   0, 0).    ){.  
20c10 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
20c20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
20c30 77 69 64 28 70 31 29 3b 0a 20 20 20 20 20 20 69  wid(p1);.      i
20c40 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt nTerm;.      
20c50 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
20c60 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
20c70 65 72 6d 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b  erm(p1, &nTerm);
20c80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
20c90 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
20ca0 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c  erm, MIN(nToken,
20cb0 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20   nTerm))<=0 );. 
20cc0 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e       if( nTerm<n
20cd0 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  Token || memcmp(
20ce0 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e  pToken, pTerm, n
20cf0 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a  Token) ) break;.
20d00 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69  .      if( docli
20d10 73 74 2e 6e 3e 30 20 0a 20 20 20 20 20 20 20 26  st.n>0 .       &
20d20 26 20 28 28 21 62 44 65 73 63 20 26 26 20 69 52  & ((!bDesc && iR
20d30 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64  owid<=iLastRowid
20d40 29 20 7c 7c 20 28 62 44 65 73 63 20 26 26 20 69  ) || (bDesc && i
20d50 52 6f 77 69 64 3e 3d 69 4c 61 73 74 52 6f 77 69  Rowid>=iLastRowi
20d60 64 29 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20  d)).      ){..  
20d70 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
20d80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20d90 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b  && doclist.n; i+
20da0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
20db0 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a  sert( i<nBuf );.
20dc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42            if( aB
20dd0 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  uf[i].n==0 ){.  
20de0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
20df0 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73  fferSwap(&doclis
20e00 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
20e10 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
20e20 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73  fferZero(&doclis
20e30 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
20e40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
20e50 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
20e60 4c 69 73 74 73 28 70 2c 20 62 44 65 73 63 2c 20  Lists(p, bDesc, 
20e70 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
20e80 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
20e90 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
20ea0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
20eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20ed0 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30 20  f( doclist.n==0 
20ee0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
20ef0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
20f00 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69  t(&p->rc, &docli
20f10 73 74 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  st, iRowid);.   
20f20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 44 65     }else if( bDe
20f30 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  sc ){.        ft
20f40 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
20f50 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f  rint(&p->rc, &do
20f60 63 6c 69 73 74 2c 20 69 4c 61 73 74 52 6f 77 69  clist, iLastRowi
20f70 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  d - iRowid);.   
20f80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20f90 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
20fa0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
20fb0 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69   &doclist, iRowi
20fc0 64 20 2d 20 69 4c 61 73 74 52 6f 77 69 64 29 3b  d - iLastRowid);
20fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20fe0 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
20ff0 69 64 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  id;.      fts5Mu
21000 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70  ltiIterPoslist(p
21010 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69 73  , p1, 1, &doclis
21020 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  t);.    }..    f
21030 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20  or(i=0; i<nBuf; 
21040 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
21050 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
21060 28 70 2c 20 62 44 65 73 63 2c 20 26 64 6f 63 6c  (p, bDesc, &docl
21070 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
21080 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21090 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a  Free(&aBuf[i]);.
210a0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75      }.    fts5Mu
210b0 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
210c0 31 29 3b 0a 0a 20 20 20 20 70 44 6f 63 6c 69 73  1);..    pDoclis
210d0 74 20 3d 20 28 46 74 73 35 44 6f 63 6c 69 73 74  t = (Fts5Doclist
210e0 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c  Iter*)fts5IdxMal
210f0 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
21100 73 35 44 6f 63 6c 69 73 74 49 74 65 72 29 29 3b  s5DoclistIter));
21110 0a 20 20 20 20 69 66 28 20 21 70 44 6f 63 6c 69  .    if( !pDocli
21120 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  st ){.      fts5
21130 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c  BufferFree(&docl
21140 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
21150 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 44  .      pIter->pD
21160 6f 63 6c 69 73 74 20 3d 20 70 44 6f 63 6c 69 73  oclist = pDoclis
21170 74 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6f 63  t;.      fts5Doc
21180 6c 69 73 74 49 74 65 72 49 6e 69 74 28 26 64 6f  listIterInit(&do
21190 63 6c 69 73 74 2c 20 62 44 65 73 63 2c 20 70 49  clist, bDesc, pI
211a0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a  ter->pDoclist);.
211b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
211c0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
211d0 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71  e(pStruct);.  sq
211e0 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29  lite3_free(aBuf)
211f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  ;.}.../*.** Indi
21200 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75  cate that all su
21210 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
21220 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
21230 65 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69  exWrite() pertai
21240 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75  n.** to the docu
21250 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20  ment with rowid 
21260 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73  iRowid..*/.int s
21270 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42  qlite3Fts5IndexB
21280 65 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e  eginWrite(Fts5In
21290 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
212a0 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  id){.  assert( p
212b0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
212c0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
212d0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
212e0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
212f0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
21300 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  cated */.  if( p
21310 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->pHash==0 ){.  
21320 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
21330 33 46 74 73 35 48 61 73 68 4e 65 77 28 26 70 2d  3Fts5HashNew(&p-
21340 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e  >pHash, &p->nPen
21350 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a  dingData);.  }..
21360 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68    /* Flush the h
21370 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
21380 6b 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  k if required */
21390 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 3d 70  .  if( iRowid<=p
213a0 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 7c 7c  ->iWriteRowid ||
213b0 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74   (p->nPendingDat
213c0 61 20 3e 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69  a > p->nMaxPendi
213d0 6e 67 44 61 74 61 29 20 29 7b 0a 20 20 20 20 66  ngData) ){.    f
213e0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
213f0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 57 72 69 74  ;.  }.  p->iWrit
21400 65 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  eRowid = iRowid;
21410 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
21420 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
21430 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61  ./*.** Commit da
21440 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  ta to disk..*/.i
21450 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
21460 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65  dexSync(Fts5Inde
21470 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  x *p, int bCommi
21480 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  t){.  assert( p-
21490 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
214a0 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ;.  fts5IndexFlu
214b0 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f  sh(p);.  if( bCo
214c0 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65  mmit ) fts5Close
214d0 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74  Reader(p);.  ret
214e0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
214f0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
21500 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74   Discard any dat
21510 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
21520 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
21530 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72  ables. Do not wr
21540 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65  ite it.** to the
21550 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
21560 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20  ionally, assume 
21570 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
21580 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a  s of the %_data.
21590 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76  ** table may hav
215a0 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73  e changed on dis
215b0 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d  k. So any in-mem
215c0 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f  ory caches of %_
215d0 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73  data .** records
215e0 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64   must be invalid
215f0 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
21600 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c  ite3Fts5IndexRol
21610 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20  lback(Fts5Index 
21620 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65  *p){.  fts5Close
21630 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73  Reader(p);.  fts
21640 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
21650 61 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  a(p);.  assert( 
21660 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
21670 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
21680 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21690 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   The %_data tabl
216a0 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
216b0 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73 20  empty when this 
216c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
216d0 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
216e0 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69  tion populates i
216f0 74 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69  t with the initi
21700 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  al structure obj
21710 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e  ects for each in
21720 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  dex,.** and the 
21730 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20  initial version 
21740 6f 66 20 74 68 65 20 22 61 76 65 72 61 67 65 73  of the "averages
21750 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f  " record (a zero
21760 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a  -byte blob)..*/.
21770 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
21780 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49  ndexReinit(Fts5I
21790 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
217a0 53 74 72 75 63 74 75 72 65 20 73 3b 0a 0a 20 20  Structure s;..  
217b0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
217c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d  QLITE_OK );.  p-
217d0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
217e0 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65  5IndexSetAverage
217f0 73 28 70 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  s(p, (const u8*)
21800 22 22 2c 20 30 29 3b 0a 0a 20 20 6d 65 6d 73 65  "", 0);..  memse
21810 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&s, 0, sizeof(
21820 46 74 73 35 53 74 72 75 63 74 75 72 65 29 29 3b  Fts5Structure));
21830 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
21840 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 0a 20  Write(p, &s);.. 
21850 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
21860 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
21870 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
21880 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
21890 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65  . If the bCreate
218a0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
218b0 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64  e, create.** and
218c0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
218d0 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74  underlying %_dat
218e0 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
218f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
21900 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
21910 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
21920 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
21930 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77  TE_OK..** Otherw
21940 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ise, set *pp to 
21950 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20  NULL and return 
21960 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
21970 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
21980 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
21990 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  n(.  Fts5Config 
219a0 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74  *pConfig, .  int
219b0 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73   bCreate, .  Fts
219c0 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63  5Index **pp,.  c
219d0 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
219e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
219f0 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  _OK;.  Fts5Index
21a00 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
21a10 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
21a20 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d  ject */..  *pp =
21a30 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a   p = (Fts5Index*
21a40 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
21a50 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
21a60 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a  of(Fts5Index));.
21a70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43  _OK ){.    p->pC
21a90 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b  onfig = pConfig;
21aa0 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  .    p->nWorkUni
21ab0 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e  t = FTS5_WORK_UN
21ac0 49 54 3b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50  IT;.    p->nMaxP
21ad0 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 31 30 32  endingData = 102
21ae0 34 2a 31 30 32 34 3b 0a 20 20 20 20 70 2d 3e 7a  4*1024;.    p->z
21af0 44 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65  DataTbl = sqlite
21b00 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 5f 64 61  3_mprintf("%s_da
21b10 74 61 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  ta", pConfig->zN
21b20 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ame);.    if( p-
21b30 3e 7a 44 61 74 61 54 62 6c 3d 3d 30 20 29 7b 0a  >zDataTbl==0 ){.
21b40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21b50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
21b60 73 65 20 69 66 28 20 62 43 72 65 61 74 65 20 29  se if( bCreate )
21b70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21b80 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
21b90 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  ble(.          p
21ba0 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20  Config, "data", 
21bb0 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  "id INTEGER PRIM
21bc0 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
21bd0 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20  LOB", 0, pzErr. 
21be0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
21bf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21c00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21c10 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
21c20 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20  Reinit(p);.     
21c30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21c40 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21c50 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
21c60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
21c70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
21c80 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f  ite3Fts5IndexClo
21c90 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d  se(p);.    *pp =
21ca0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
21cb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
21cc0 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65  ose a handle ope
21cd0 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
21ce0 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
21cf0 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29  3Fts5IndexOpen()
21d00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21d10 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46  Fts5IndexClose(F
21d20 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
21d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21d40 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  OK;.  if( p ){. 
21d50 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
21d60 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  eader==0 );.    
21d70 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
21d80 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
21d90 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
21da0 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ze(p->pDeleter);
21db0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
21dc0 48 61 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73  HashFree(p->pHas
21dd0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
21de0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
21df0 2d 3e 73 63 72 61 74 63 68 29 3b 0a 20 20 20 20  ->scratch);.    
21e00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
21e10 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73  zDataTbl);.    s
21e20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
21e30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
21e50 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
21e60 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
21e70 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68  ng utf-8 text th
21e80 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e  at is n bytes in
21e90 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72   .** size. Retur
21ea0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
21eb0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68  bytes in the nCh
21ec0 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65  ar character pre
21ed0 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75  fix of the.** bu
21ee0 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68  ffer, or 0 if th
21ef0 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
21f00 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  n nChar characte
21f10 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a  rs in total..*/.
21f20 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
21f30 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
21f40 65 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  elen(const char 
21f50 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  *p, int nByte, i
21f60 6e 74 20 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74  nt nChar){.  int
21f70 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b   n = 0;.  int i;
21f80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
21f90 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  har; i++){.    i
21fa0 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65  f( n>=nByte ) re
21fb0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20  turn 0;      /* 
21fc0 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66  Input contains f
21fd0 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20  ewer than nChar 
21fe0 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28  chars */.    if(
21ff0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
22000 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a  p[n++]>=0xc0 ){.
22010 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b        while( (p[
22020 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  n] & 0xc0)==0x80
22030 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
22040 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
22050 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20  ./*.** pIn is a 
22060 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74  UTF-8 encoded st
22070 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20  ring, nIn bytes 
22080 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  in size. Return 
22090 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
220a0 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
220b0 65 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e  ers in the strin
220c0 67 2e 0a 2a 2f 0a 69 6e 74 20 66 74 73 35 49 6e  g..*/.int fts5In
220d0 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74  dexCharlen(const
220e0 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20   char *pIn, int 
220f0 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  nIn){.  int nCha
22100 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
22110 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a    .  int i = 0;.
22120 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29    while( i<nIn )
22130 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67  {.    if( (unsig
22140 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b  ned char)pIn[i++
22150 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20  ]>=0xc0 ){.     
22160 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26   while( i<nIn &&
22170 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29   (pIn[i] & 0xc0)
22180 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20  ==0x80 ) i++;.  
22190 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b    }.    nChar++;
221a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
221b0 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  har;.}../*.** In
221c0 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64  sert or remove d
221d0 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ata to or from t
221e0 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74  he index. Each t
221f0 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  ime a document i
22200 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f  s .** added to o
22210 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  r removed from t
22220 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66  he index, this f
22230 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22240 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  d one or more.**
22250 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   times..**.** Fo
22260 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20  r an insert, it 
22270 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f  must be called o
22280 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b  nce for each tok
22290 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f  en in the new do
222a0 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68  cument..** If th
222b0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
222c0 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74   delete, it must
222d0 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c   be called (at l
222e0 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65  east) once for e
222f0 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f  ach.** unique to
22300 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  ken in the docum
22310 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c  ent with an iCol
22320 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e   value less than
22330 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a   zero. The iPos.
22340 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
22350 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c  gnored for a del
22360 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ete..*/.int sqli
22370 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
22380 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
22390 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
223a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
223b0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
223c0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
223e0 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
223f0 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
22400 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
22410 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22430 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
22440 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
22450 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
22460 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
22470 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
22480 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
22490 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
224a0 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  x */.){.  int i;
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
224d0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
224e0 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
224f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22500 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
22510 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
22520 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
22530 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
22540 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72  Config;..  asser
22550 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
22560 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  _OK );..  /* Add
22570 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68   the entry to th
22580 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64  e main terms ind
22590 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ex. */.  rc = sq
225a0 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
225b0 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61  te(.      p->pHa
225c0 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  sh, p->iWriteRow
225d0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
225e0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
225f0 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
22600 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  .  );..  for(i=0
22610 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  ; i<pConfig->nPr
22620 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49  efix && rc==SQLI
22630 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
22640 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74 73   int nByte = fts
22650 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42  5IndexCharlenToB
22660 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e  ytelen(pToken, n
22670 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e  Token, pConfig->
22680 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20  aPrefix[i]);.   
22690 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20   if( nByte ){.  
226a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
226b0 46 74 73 35 48 61 73 68 57 72 69 74 65 28 70 2d  Fts5HashWrite(p-
226c0 3e 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  >pHash, .       
226d0 20 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69     p->iWriteRowi
226e0 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46  d, iCol, iPos, F
226f0 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b  TS5_MAIN_PREFIX+
22700 69 2b 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42 79  i+1, pToken, nBy
22710 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  te.      );.    
22720 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
22730 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
22740 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72  n a new iterator
22750 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75   to iterate thou
22760 67 68 20 61 6c 6c 20 64 6f 63 69 64 73 20 74 68  gh all docids th
22770 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a  at match the .**
22780 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e   specified token
22790 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78   or token prefix
227a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
227b0 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a  Fts5IndexQuery(.
227c0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227e0 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74    /* FTS index t
227f0 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e  o query */.  con
22800 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
22810 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20   int nToken, /* 
22820 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78  Token (or prefix
22830 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  ) to query for *
22840 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
22870 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58  TS5INDEX_QUERY_X
22880 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
22890 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74  IndexIter **ppIt
228a0 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er          /* O
228b0 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72  UT: New iterator
228c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
228d0 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
228e0 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
228f0 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ;.  Fts5IndexIte
22900 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20 69  r *pRet;.  int i
22910 49 64 78 20 3d 20 30 3b 0a 20 20 46 74 73 35 42  Idx = 0;.  Fts5B
22920 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20  uffer buf = {0, 
22930 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20  0, 0};..  /* If 
22940 74 68 65 20 51 55 45 52 59 5f 53 43 41 4e 20 66  the QUERY_SCAN f
22950 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6c 6c 20  lag is set, all 
22960 6f 74 68 65 72 20 66 6c 61 67 73 20 6d 75 73 74  other flags must
22970 20 62 65 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20   be clear. */.  
22980 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
22990 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
229a0 5f 53 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20  _SCAN)==0.      
229b0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
229c0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
229d0 4e 29 3d 3d 46 54 53 35 49 4e 44 45 58 5f 51 55  N)==FTS5INDEX_QU
229e0 45 52 59 5f 53 43 41 4e 0a 20 20 29 3b 0a 0a 20  ERY_SCAN.  );.. 
229f0 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
22a00 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
22a10 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b  c, &buf, nToken+
22a20 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  1)==0 ){.    mem
22a30 63 70 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70  cpy(&buf.p[1], p
22a40 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
22a50 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
22a60 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 66  TE_DEBUG.  if( f
22a70 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
22a80 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44  _QUERY_TEST_NOID
22a90 58 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  X ){.    assert(
22aa0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
22ab0 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20  EX_QUERY_PREFIX 
22ac0 29 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 31 2b  );.    iIdx = 1+
22ad0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
22ae0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
22af0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46  .  if( flags & F
22b00 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
22b10 52 45 46 49 58 20 29 7b 0a 20 20 20 20 69 6e 74  REFIX ){.    int
22b20 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e 64   nChar = fts5Ind
22b30 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e  exCharlen(pToken
22b40 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 66  , nToken);.    f
22b50 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78 3c  or(iIdx=1; iIdx<
22b60 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  =pConfig->nPrefi
22b70 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20  x; iIdx++){.    
22b80 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
22b90 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d  Prefix[iIdx-1]==
22ba0 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20  nChar ) break;. 
22bb0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 74     }.  }..  pRet
22bc0 20 3d 20 28 46 74 73 35 49 6e 64 65 78 49 74 65   = (Fts5IndexIte
22bd0 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  r*)sqlite3Fts5Ma
22be0 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
22bf0 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65   sizeof(Fts5Inde
22c00 78 49 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70  xIter));.  if( p
22c10 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d  Ret ){.    pRet-
22c20 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20  >pIndex = p;.   
22c30 20 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66   if( iIdx<=pConf
22c40 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20  ig->nPrefix ){. 
22c50 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20       buf.p[0] = 
22c60 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
22c70 20 2b 20 69 49 64 78 3b 0a 20 20 20 20 20 20 70   + iIdx;.      p
22c80 52 65 74 2d 3e 70 53 74 72 75 63 74 20 3d 20 66  Ret->pStruct = f
22c90 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
22ca0 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  (p);.      if( p
22cb0 52 65 74 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a  Ret->pStruct ){.
22cc0 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
22cd0 69 49 74 65 72 4e 65 77 28 0a 20 20 20 20 20 20  iIterNew(.      
22ce0 20 20 20 20 20 20 70 2c 20 70 52 65 74 2d 3e 70        p, pRet->p
22cf0 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67 73  Struct, 1, flags
22d00 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b  , buf.p, nToken+
22d10 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 2d  1, -1, 0, &pRet-
22d20 3e 70 4d 75 6c 74 69 0a 20 20 20 20 20 20 20 20  >pMulti.        
22d30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
22d50 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26  bDesc = (flags &
22d60 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
22d70 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20  _DESC)!=0;.     
22d80 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35   buf.p[0] = FTS5
22d90 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20  _MAIN_PREFIX;.  
22da0 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65      fts5SetupPre
22db0 66 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63  fixIter(p, bDesc
22dc0 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b  , buf.p, nToken+
22dd0 31 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a  1, pRet);.    }.
22de0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
22df0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   ){.    sqlite3F
22e00 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 52 65  ts5IterClose(pRe
22e10 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  t);.    pRet = 0
22e20 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 74 65 72 20  ;.  }.  *ppIter 
22e30 3d 20 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65  = pRet;.  sqlite
22e40 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
22e50 26 62 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  &buf);.  return 
22e60 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
22e70 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
22e80 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
22e90 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
22ea0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
22eb0 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a  ment is at EOF..
22ec0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22ed0 73 35 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  s5IterEof(Fts5In
22ee0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
22ef0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
22f00 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
22f10 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
22f20 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
22f30 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
22f40 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d  pIter->pDoclist-
22f50 3e 61 50 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a 20  >aPoslist==0; . 
22f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
22f70 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  rn fts5MultiIter
22f80 45 6f 66 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  Eof(pIter->pInde
22f90 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  x, pIter->pMulti
22fa0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
22fb0 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
22fc0 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e   matching rowid.
22fd0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
22fe0 46 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73  Fts5IterNext(Fts
22ff0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
23000 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  r){.  assert( pI
23010 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
23020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
23030 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
23040 69 73 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44  ist ){.    fts5D
23050 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
23060 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b  Iter->pDoclist);
23070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
23080 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49  s5BufferZero(&pI
23090 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
230a0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
230b0 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64  Next(pIter->pInd
230c0 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74  ex, pIter->pMult
230d0 69 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  i, 0, 0);.  }.  
230e0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
230f0 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
23100 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
23110 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
23120 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72   matching term/r
23130 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20 74 68  owid. Used by th
23140 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75  e fts5vocab modu
23150 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
23160 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63  e3Fts5IterNextSc
23170 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  an(Fts5IndexIter
23180 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
23190 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72  Index *p = pIter
231a0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 46 74 73 35  ->pIndex;.  Fts5
231b0 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d  MultiSegIter *pM
231c0 75 6c 74 69 20 3d 20 70 49 74 65 72 2d 3e 70 4d  ulti = pIter->pM
231d0 75 6c 74 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  ulti;..  assert(
231e0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
231f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
23200 0a 20 20 61 73 73 65 72 74 28 20 70 4d 75 6c 74  .  assert( pMult
23210 69 20 29 3b 0a 0a 20 20 66 74 73 35 42 75 66 66  i );..  fts5Buff
23220 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
23230 6f 73 6c 69 73 74 29 3b 0a 20 20 66 74 73 35 4d  oslist);.  fts5M
23240 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
23250 70 4d 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20  pMulti, 0, 0);. 
23260 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
23270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
23280 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
23290 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20   &pMulti->aSeg[ 
232a0 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31  pMulti->aFirst[1
232b0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
232c0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20  if( pSeg->pLeaf 
232d0 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 5b  && pSeg->term.p[
232e0 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50 52  0]!=FTS5_MAIN_PR
232f0 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66 74  EFIX ){.      ft
23300 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 53  s5DataRelease(pS
23310 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  eg->pLeaf);.    
23320 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d 20    pSeg->pLeaf = 
23330 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
23340 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
23350 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
23360 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
23370 4d 6f 76 65 20 74 68 65 20 64 6f 63 6c 69 73 74  Move the doclist
23380 2d 69 74 65 72 20 70 61 73 73 65 64 20 61 73 20  -iter passed as 
23390 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
233a0 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 0a  nt to the next .
233b0 2a 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69  ** matching rowi
233c0 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  d that occurs at
233d0 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68   or after iMatch
233e0 2e 20 54 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  . The definition
233f0 20 6f 66 20 22 61 74 20 0a 2a 2a 20 6f 72 20 61   of "at .** or a
23400 66 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e  fter" depends on
23410 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74   whether this it
23420 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 20  erator iterates 
23430 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20  in ascending or 
23440 0a 2a 2a 20 64 65 73 63 65 6e 64 69 6e 67 20 72  .** descending r
23450 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  owid order..*/.s
23460 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
23470 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72  oclistIterNextFr
23480 6f 6d 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74  om(Fts5DoclistIt
23490 65 72 20 2a 70 2c 20 69 36 34 20 69 4d 61 74 63  er *p, i64 iMatc
234a0 68 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36  h){.  do{.    i6
234b0 34 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e 69 52  4 iRowid = p->iR
234c0 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 70 2d  owid;.    if( p-
234d0 3e 62 44 65 73 63 3d 3d 30 20 26 26 20 69 52 6f  >bDesc==0 && iRo
234e0 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
234f0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  eak;.    if( p->
23500 62 44 65 73 63 21 3d 30 20 26 26 20 69 52 6f 77  bDesc!=0 && iRow
23510 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
23520 61 6b 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c  ak;.    fts5Docl
23530 69 73 74 49 74 65 72 4e 65 78 74 28 70 29 3b 0a  istIterNext(p);.
23540 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e 61 50 6f    }while( p->aPo
23550 73 6c 69 73 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  slist );.}../*.*
23560 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65  * Move to the ne
23570 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69  xt matching rowi
23580 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  d that occurs at
23590 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68   or after iMatch
235a0 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74  . The.** definit
235b0 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66  ion of "at or af
235c0 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20  ter" depends on 
235d0 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65  whether this ite
235e0 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a  rator iterates.*
235f0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
23600 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  r descending row
23610 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74  id order..*/.int
23620 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
23630 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64  NextFrom(Fts5Ind
23640 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  exIter *pIter, i
23650 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 69 66  64 iMatch){.  if
23660 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  ( pIter->pDoclis
23670 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f 63  t ){.    fts5Doc
23680 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f 6d  listIterNextFrom
23690 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74  (pIter->pDoclist
236a0 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 7d 65 6c  , iMatch);.  }el
236b0 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  se{.    fts5Mult
236c0 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49  iIterNextFrom(pI
236d0 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
236e0 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61 74  er->pMulti, iMat
236f0 63 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ch);.  }.  retur
23700 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
23710 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
23720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23730 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
23740 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  wid..*/.i64 sqli
23750 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64  te3Fts5IterRowid
23760 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
23770 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
23780 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b  ter->pDoclist ){
23790 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65  .    return pIte
237a0 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 69 52 6f  r->pDoclist->iRo
237b0 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
237c0 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c    return fts5Mul
237d0 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65  tiIterRowid(pIte
237e0 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a  r->pMulti);.  }.
237f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23800 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
23810 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
23820 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  *sqlite3Fts5Iter
23830 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74  Term(Fts5IndexIt
23840 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a  er *pIter, int *
23850 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  pn){.  int n;.  
23860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
23870 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73  (const char*)fts
23880 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
23890 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 26 6e  Iter->pMulti, &n
238a0 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a  );.  *pn = n-1;.
238b0 20 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a    return &z[1];.
238c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
238d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
238e0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
238f0 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  g a copy of the 
23900 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f  position list fo
23910 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  r.** the current
23920 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74 20 76   entry. Output v
23930 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73 20 73  ariable *pn is s
23940 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
23950 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a  f the buffer .**
23960 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65   in bytes before
23970 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
23980 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
23990 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65  osition list doe
239a0 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
239b0 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  e "number of byt
239c0 65 73 22 20 76 61 72 69 6e 74 0a 2a 2a 20 66 69  es" varint.** fi
239d0 65 6c 64 20 74 68 61 74 20 73 74 61 72 74 73 20  eld that starts 
239e0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
239f0 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  t on disk..*/.in
23a00 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
23a10 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
23a20 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
23a30 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a  , .  const u8 **
23a40 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pp,             
23a50 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
23a60 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e  nter to position
23a70 2d 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20  -list data */.  
23a80 69 6e 74 20 2a 70 6e 2c 20 20 20 20 20 20 20 20  int *pn,        
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23aa0 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
23ab0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e  position-list in
23ac0 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 36 34 20   bytes */.  i64 
23ad0 2a 70 69 52 6f 77 69 64 20 20 20 20 20 20 20 20  *piRowid        
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23af0 55 54 3a 20 43 75 72 72 65 6e 74 20 72 6f 77 69  UT: Current rowi
23b00 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6f  d */.){.  Fts5Do
23b10 63 6c 69 73 74 49 74 65 72 20 2a 70 44 6f 63 6c  clistIter *pDocl
23b20 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 44 6f  ist = pIter->pDo
23b30 63 6c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  clist;.  assert(
23b40 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
23b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
23b60 0a 20 20 69 66 28 20 70 44 6f 63 6c 69 73 74 20  .  if( pDoclist 
23b70 29 7b 0a 20 20 20 20 2a 70 6e 20 3d 20 70 44 6f  ){.    *pn = pDo
23b80 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c 69 73 74 3b  clist->nPoslist;
23b90 0a 20 20 20 20 2a 70 70 20 3d 20 70 44 6f 63 6c  .    *pp = pDocl
23ba0 69 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3b 0a 20  ist->aPoslist;. 
23bb0 20 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 70 44     *piRowid = pD
23bc0 6f 63 6c 69 73 74 2d 3e 69 52 6f 77 69 64 3b 0a  oclist->iRowid;.
23bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73    }else{.    Fts
23be0 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
23bf0 4d 75 6c 74 69 20 3d 20 70 49 74 65 72 2d 3e 70  Multi = pIter->p
23c00 4d 75 6c 74 69 3b 0a 20 20 20 20 46 74 73 35 53  Multi;.    Fts5S
23c10 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
23c20 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d  pMulti->aSeg[ pM
23c30 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  ulti->aFirst[1].
23c40 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 2a 70  iFirst ];.    *p
23c50 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
23c60 52 6f 77 69 64 3b 0a 20 20 20 20 2a 70 6e 20 3d  Rowid;.    *pn =
23c70 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20   pSeg->nPos;.   
23c80 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66   if( pSeg->iLeaf
23c90 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f  Offset+pSeg->nPo
23ca0 73 20 3c 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66  s <= pSeg->pLeaf
23cb0 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ->n ){.      *pp
23cc0 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
23cd0 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
23ce0 66 73 65 74 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  fset];.    }else
23cf0 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
23d00 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
23d10 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66  oslist);.      f
23d20 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
23d30 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
23d40 20 70 53 65 67 2c 20 26 70 49 74 65 72 2d 3e 70   pSeg, &pIter->p
23d50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 2a  oslist);.      *
23d60 70 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  pp = pIter->posl
23d70 69 73 74 2e 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  ist.p;.    }.  }
23d80 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
23d90 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d  dexReturn(pIter-
23da0 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  >pIndex);.}../*.
23db0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23dc0 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
23dd0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
23de0 73 6c 69 73 74 28 29 2c 20 65 78 63 65 70 74 20  slist(), except 
23df0 74 68 61 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65  that it.** copie
23e00 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
23e10 69 73 74 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ist into the buf
23e20 66 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20  fer supplied as 
23e30 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
23e40 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
23e50 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
23e60 6f 73 6c 69 73 74 42 75 66 66 65 72 28 46 74 73  oslistBuffer(Fts
23e70 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
23e80 72 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  r, Fts5Buffer *p
23e90 42 75 66 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  Buf){.  Fts5Inde
23ea0 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49  x *p = pIter->pI
23eb0 6e 64 65 78 3b 0a 20 20 46 74 73 35 44 6f 63 6c  ndex;.  Fts5Docl
23ec0 69 73 74 49 74 65 72 20 2a 70 44 6f 63 6c 69 73  istIter *pDoclis
23ed0 74 20 3d 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  t = pIter->pDocl
23ee0 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ist;.  assert( p
23ef0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
23f00 29 3b 0a 20 20 69 66 28 20 70 44 6f 63 6c 69 73  );.  if( pDoclis
23f10 74 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  t ){.    fts5Buf
23f20 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70  ferSet(&p->rc, p
23f30 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2d 3e 6e  Buf, pDoclist->n
23f40 50 6f 73 6c 69 73 74 2c 20 70 44 6f 63 6c 69 73  Poslist, pDoclis
23f50 74 2d 3e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20  t->aPoslist);.  
23f60 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 4d  }else{.    Fts5M
23f70 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75  ultiSegIter *pMu
23f80 6c 74 69 20 3d 20 70 49 74 65 72 2d 3e 70 4d 75  lti = pIter->pMu
23f90 6c 74 69 3b 0a 20 20 20 20 66 74 73 35 42 75 66  lti;.    fts5Buf
23fa0 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
23fb0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
23fc0 50 6f 73 6c 69 73 74 28 70 2c 20 70 4d 75 6c 74  Poslist(p, pMult
23fd0 69 2c 20 30 2c 20 70 42 75 66 29 3b 0a 20 20 7d  i, 0, pBuf);.  }
23fe0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
23ff0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
24000 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
24010 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20  iterator opened 
24020 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
24030 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ll to sqlite3Fts
24040 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a  5IndexQuery()..*
24050 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
24060 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35  s5IterClose(Fts5
24070 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
24080 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
24090 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
240a0 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  >pDoclist ){.   
240b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
240c0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d  pIter->pDoclist-
240d0 3e 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >a);.      sqlit
240e0 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 70  e3_free(pIter->p
240f0 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65  Doclist);.    }e
24100 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  lse{.      fts5M
24110 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74  ultiIterFree(pIt
24120 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
24130 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20  r->pMulti);.    
24140 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
24150 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53  elease(pIter->pS
24160 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74  truct);.      ft
24170 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
24180 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
24190 20 20 20 7d 0a 20 20 20 20 66 74 73 35 43 6c 6f     }.    fts5Clo
241a0 73 65 52 65 61 64 65 72 28 70 49 74 65 72 2d 3e  seReader(pIter->
241b0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  pIndex);.    sql
241c0 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
241d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
241e0 65 61 64 20 74 68 65 20 22 61 76 65 72 61 67 65  ead the "average
241f0 73 22 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  s" record into t
24200 68 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69  he buffer suppli
24210 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
24220 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52   .** argument. R
24230 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
24240 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
24250 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
24260 72 20 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20  r code.** if an 
24270 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
24280 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24290 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73  IndexGetAverages
242a0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
242b0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29  ts5Buffer *pBuf)
242c0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
242d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
242e0 20 20 66 74 73 35 44 61 74 61 52 65 61 64 4f 72    fts5DataReadOr
242f0 42 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20  Buffer(p, pBuf, 
24300 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
24310 57 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  WID);.  return f
24320 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
24330 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  );.}../*.** Repl
24340 61 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ace the current 
24350 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
24360 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  d with the conte
24370 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  nts of the buffe
24380 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61  r .** supplied a
24390 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
243a0 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
243b0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
243c0 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e  tAverages(Fts5In
243d0 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38  dex *p, const u8
243e0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
243f0 74 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ta){.  assert( p
24400 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
24410 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
24420 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41  te(p, FTS5_AVERA
24430 47 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61  GES_ROWID, pData
24440 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75  , nData);.  retu
24450 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24460 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
24470 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
24480 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b   number of block
24490 73 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61  s this module ha
244a0 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
244b0 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20  %_data.** table 
244c0 73 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65  since it was cre
244d0 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
244e0 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61  ite3Fts5IndexRea
244f0 64 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ds(Fts5Index *p)
24500 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52  {.  return p->nR
24510 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ead;.}../*.** Se
24520 74 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f  t the 32-bit coo
24530 6b 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  kie value stored
24540 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
24550 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a   all structure .
24560 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ** records to th
24570 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
24580 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
24590 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ument..**.** Ret
245a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
245b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
245c0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
245d0 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
245e0 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
245f0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
24600 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73  dexSetCookie(Fts
24610 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
24620 4e 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  New){.  int rc; 
24630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24650 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
24660 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
24670 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
24680 67 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75  g;    /* Configu
24690 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  ration object */
246a0 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d  .  u8 aCookie[4]
246b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
246c0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72          /* Binar
246d0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
246e0 20 6f 66 20 69 4e 65 77 20 2a 2f 0a 0a 20 20 61   of iNew */..  a
246f0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
24700 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71  LITE_OK );..  sq
24710 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61  lite3Fts5Put32(a
24720 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 20  Cookie, iNew);. 
24730 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
24740 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Blob = 0;.  rc =
24750 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
24760 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  en(pConfig->db, 
24770 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d  pConfig->zDb, p-
24780 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20  >zDataTbl, .    
24790 20 20 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f    "block", FTS5_
247a0 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c  STRUCTURE_ROWID,
247b0 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a   1, &pBlob.  );.
247c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
247d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
247e0 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42  e3_blob_write(pB
247f0 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c  lob, aCookie, 4,
24800 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
24810 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
24820 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20  (pBlob);.  }..  
24830 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
24840 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
24850 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73  exLoadConfig(Fts
24860 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
24870 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
24880 72 75 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20  ruct;.  pStruct 
24890 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
248a0 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74  ead(p);.  fts5St
248b0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
248c0 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72  Struct);.  retur
248d0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
248e0 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  n(p);.}.../*****
248f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24930 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
24940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
24980 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f  ** Below this po
24990 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65  int is the imple
249a0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
249b0 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
249c0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69   .** functionali
249d0 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ty..*/../*.** Re
249e0 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68  turn a simple ch
249f0 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73  ecksum value bas
24a00 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65  ed on the argume
24a10 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  nts..*/.static u
24a20 36 34 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  64 fts5IndexEntr
24a30 79 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52  yCksum(.  i64 iR
24a40 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f  owid, .  int iCo
24a50 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20  l, .  int iPos, 
24a60 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63  .  int iIdx,.  c
24a70 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d  onst char *pTerm
24a80 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b  ,.  int nTerm.){
24a90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20  .  int i;.  u64 
24aa0 72 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  ret = iRowid;.  
24ab0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
24ac0 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d  + iCol;.  ret +=
24ad0 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73   (ret<<3) + iPos
24ae0 3b 0a 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20  ;.  if( iIdx>=0 
24af0 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33  ) ret += (ret<<3
24b00 29 20 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50  ) + (FTS5_MAIN_P
24b10 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20  REFIX + iIdx);. 
24b20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
24b30 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28  m; i++) ret += (
24b40 72 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b  ret<<3) + pTerm[
24b50 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  i];.  return ret
24b60 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
24b70 20 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e   fts5BtreeIterIn
24b80 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
24b90 2a 70 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63  *p, .  Fts5Struc
24ba0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
24bb0 67 2c 20 0a 20 20 46 74 73 35 42 74 72 65 65 49  g, .  Fts5BtreeI
24bc0 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20  ter *pIter.){.  
24bd0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
24be0 20 69 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   i;.  nByte = si
24bf0 7a 65 6f 66 28 70 49 74 65 72 2d 3e 61 4c 76 6c  zeof(pIter->aLvl
24c00 5b 30 5d 29 20 2a 20 28 70 53 65 67 2d 3e 6e 48  [0]) * (pSeg->nH
24c10 65 69 67 68 74 2d 31 29 3b 0a 20 20 6d 65 6d 73  eight-1);.  mems
24c20 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
24c30 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
24c40 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
24c50 20 70 49 74 65 72 2d 3e 61 4c 76 6c 20 3d 20 28   pIter->aLvl = (
24c60 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
24c70 65 6c 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  el*)fts5IdxMallo
24c80 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  c(p, nByte);.  }
24c90 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
24ca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
24cb0 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65  Iter->nLvl = pSe
24cc0 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 0a 20 20  g->nHeight-1;.  
24cd0 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a    pIter->p = p;.
24ce0 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20      pIter->pSeg 
24cf0 3d 20 70 53 65 67 3b 0a 20 20 7d 0a 20 20 66 6f  = pSeg;.  }.  fo
24d00 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
24d10 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74  LITE_OK && i<pIt
24d20 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a  er->nLvl; i++){.
24d30 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
24d40 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
24d50 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
24d60 2c 20 69 2b 31 2c 20 31 29 3b 0a 20 20 20 20 46  , i+1, 1);.    F
24d70 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
24d80 20 20 20 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b      pIter->aLvl[
24d90 69 5d 2e 70 44 61 74 61 20 3d 20 70 44 61 74 61  i].pData = pData
24da0 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
24db0 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  p, iRowid);.    
24dc0 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
24dd0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49     fts5NodeIterI
24de0 6e 69 74 28 70 44 61 74 61 2d 3e 70 2c 20 70 44  nit(pData->p, pD
24df0 61 74 61 2d 3e 6e 2c 20 26 70 49 74 65 72 2d 3e  ata->n, &pIter->
24e00 61 4c 76 6c 5b 69 5d 2e 73 29 3b 0a 20 20 20 20  aLvl[i].s);.    
24e10 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74  }.  }..  if( pIt
24e20 65 72 2d 3e 6e 4c 76 6c 3d 3d 30 20 7c 7c 20 70  er->nLvl==0 || p
24e30 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70 49 74 65  ->rc ){.    pIte
24e40 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  r->bEof = 1;.   
24e50 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20   pIter->iLeaf = 
24e60 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a  pSeg->pgnoLast;.
24e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
24e80 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74  er->nEmpty = pIt
24e90 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45  er->aLvl[0].s.nE
24ea0 6d 70 74 79 3b 0a 20 20 20 20 70 49 74 65 72 2d  mpty;.    pIter-
24eb0 3e 69 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  >iLeaf = pIter->
24ec0 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68 69 6c 64  aLvl[0].s.iChild
24ed0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c  ;.    pIter->bDl
24ee0 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  idx = pIter->aLv
24ef0 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20  l[0].s.bDlidx;. 
24f00 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
24f10 64 20 66 74 73 35 42 74 72 65 65 49 74 65 72 4e  d fts5BtreeIterN
24f20 65 78 74 28 46 74 73 35 42 74 72 65 65 49 74 65  ext(Fts5BtreeIte
24f30 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
24f40 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65  5Index *p = pIte
24f50 72 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  r->p;.  int i;..
24f60 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
24f70 3e 62 45 6f 66 3d 3d 30 20 26 26 20 70 49 74 65  >bEof==0 && pIte
24f80 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 61 44 61  r->aLvl[0].s.aDa
24f90 74 61 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ta );.  for(i=0;
24fa0 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 26   i<pIter->nLvl &
24fb0 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
24fc0 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  OK; i++){.    Ft
24fd0 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
24fe0 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
24ff0 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74  >aLvl[i];.    ft
25000 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
25010 70 2d 3e 72 63 2c 20 26 70 4c 76 6c 2d 3e 73 29  p->rc, &pLvl->s)
25020 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  ;.    if( pLvl->
25030 73 2e 61 44 61 74 61 20 29 7b 0a 20 20 20 20 20  s.aData ){.     
25040 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
25050 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
25060 65 72 6d 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72  erm, pLvl->s.ter
25070 6d 2e 6e 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72  m.n, pLvl->s.ter
25080 6d 2e 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  m.p);.      brea
25090 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
250a0 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
250b0 46 72 65 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a  Free(&pLvl->s);.
250c0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
250d0 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
250e0 61 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  a);.      pLvl->
250f0 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d  pData = 0;.    }
25100 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d 70 49  .  }.  if( i==pI
25110 74 65 72 2d 3e 6e 4c 76 6c 20 7c 7c 20 70 2d 3e  ter->nLvl || p->
25120 72 63 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  rc ){.    pIter-
25130 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >bEof = 1;.  }el
25140 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  se{.    int iSeg
25150 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  id = pIter->pSeg
25160 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 66 6f  ->iSegid;.    fo
25170 72 28 69 2d 2d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  r(i--; i>=0; i--
25180 29 7b 0a 20 20 20 20 20 20 46 74 73 35 42 74 72  ){.      Fts5Btr
25190 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76  eeIterLevel *pLv
251a0 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
251b0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 36 34 20 69  [i];.      i64 i
251c0 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
251d0 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
251e0 64 2c 20 69 2b 31 2c 20 70 4c 76 6c 5b 31 5d 2e  d, i+1, pLvl[1].
251f0 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  s.iChild);.     
25200 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
25210 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
25220 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
25230 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b  ( pLvl->pData ){
25240 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64  .        fts5Nod
25250 65 49 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d 3e  eIterInit(pLvl->
25260 70 44 61 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e  pData->p, pLvl->
25270 70 44 61 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d  pData->n, &pLvl-
25280 3e 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >s);.      }.   
25290 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d   }.  }..  pIter-
252a0 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d  >nEmpty = pIter-
252b0 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74  >aLvl[0].s.nEmpt
252c0 79 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 6c 69  y;.  pIter->bDli
252d0 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c  dx = pIter->aLvl
252e0 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20  [0].s.bDlidx;.  
252f0 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70  pIter->iLeaf = p
25300 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
25310 69 43 68 69 6c 64 3b 0a 7d 0a 0a 73 74 61 74 69  iChild;.}..stati
25320 63 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65  c void fts5Btree
25330 49 74 65 72 46 72 65 65 28 46 74 73 35 42 74 72  IterFree(Fts5Btr
25340 65 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  eeIter *pIter){.
25350 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
25360 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76  =0; i<pIter->nLv
25370 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  l; i++){.    Fts
25380 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20  5BtreeIterLevel 
25390 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
253a0 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73  aLvl[i];.    fts
253b0 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 70  5NodeIterFree(&p
253c0 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28  Lvl->s);.    if(
253d0 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a   pLvl->pData ){.
253e0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
253f0 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
25400 61 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  a);.      pLvl->
25410 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d  pData = 0;.    }
25420 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
25430 72 65 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29  ree(pIter->aLvl)
25440 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
25450 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29  ee(&pIter->term)
25460 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
25470 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
25480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25490 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e  purely an intern
254a0 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73  al test. It does
254b0 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
254c0 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74  to .** FTS funct
254d0 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65  ionality, or eve
254e0 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  n the integrity-
254f0 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61  check, in any wa
25500 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  y..**.** Instead
25510 2c 20 69 74 20 74 65 73 74 73 20 74 68 61 74 20  , it tests that 
25520 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
25530 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69  pgno/rowid combi
25540 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20  nations are .** 
25550 76 69 73 69 74 65 64 20 72 65 67 61 72 64 6c 65  visited regardle
25560 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
25570 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
25580 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
25590 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67  rameters.** iSeg
255a0 69 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72  id/iLeaf is iter
255b0 61 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73  ated in forwards
255c0 20 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65   or reverse orde
255d0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
255e0 64 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52  d fts5TestDlidxR
255f0 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e  everse(.  Fts5In
25600 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69  dex *p, .  int i
25610 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
25620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
25630 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64  gment id to load
25640 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
25650 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
25660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
25670 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
25680 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
25690 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  /.){.  Fts5Dlidx
256a0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
256b0 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d  ;.  u64 cksum1 =
256c0 20 31 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d   13;.  u64 cksum
256d0 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70  2 = 13;..  for(p
256e0 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
256f0 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53  terInit(p, 0, iS
25700 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20  egid, iLeaf);.  
25710 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
25720 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d  rEof(p, pDlidx)=
25730 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  =0;.      fts5Dl
25740 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70  idxIterNext(p, p
25750 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20  Dlidx).  ){.    
25760 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
25770 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
25780 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74  pDlidx);.    int
25790 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64   pgno = fts5Dlid
257a0 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
257b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
257c0 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20  gno>iLeaf );.   
257d0 20 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69   cksum1 += iRowi
257e0 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c  d + ((i64)pgno<<
257f0 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44  32);.  }.  fts5D
25800 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
25810 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d  idx);.  pDlidx =
25820 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64   0;..  for(pDlid
25830 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  x=fts5DlidxIterI
25840 6e 69 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64  nit(p, 1, iSegid
25850 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , iLeaf);.      
25860 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
25870 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
25880 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
25890 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64  terPrev(p, pDlid
258a0 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  x).  ){.    i64 
258b0 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69  iRowid = fts5Dli
258c0 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
258d0 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e  dx);.    int pgn
258e0 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
258f0 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
25900 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44     assert( fts5D
25910 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
25920 69 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20  idx)>iLeaf );.  
25930 20 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77    cksum2 += iRow
25940 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c  id + ((i64)pgno<
25950 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  <32);.  }.  fts5
25960 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44  DlidxIterFree(pD
25970 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20  lidx);.  pDlidx 
25980 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
25990 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
259a0 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29  cksum1!=cksum2 )
259b0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
259c0 52 52 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63  RRUPT;.}..static
259d0 20 69 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b   int fts5QueryCk
259e0 73 75 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sum(.  Fts5Index
259f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
25a00 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69         /* Fts5 i
25a10 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
25a20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e   int iIdx,.  con
25a30 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a50 49 6e 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65  Index key to que
25a60 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
25a70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
25a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25a90 69 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79  ize of index key
25aa0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
25ab0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
25ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ad0 2a 20 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35  * Flags for Fts5
25ae0 49 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20  IndexQuery */.  
25af0 75 36 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20  u64 *pCksum     
25b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b10 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b  /* IN/OUT: Check
25b20 73 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  sum value */.){.
25b30 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70    u64 cksum = *p
25b40 43 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64  Cksum;.  Fts5Ind
25b50 65 78 49 74 65 72 20 2a 70 49 64 78 49 74 65 72  exIter *pIdxIter
25b60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
25b70 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
25b80 78 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20  xQuery(p, z, n, 
25b90 66 6c 61 67 73 2c 20 26 70 49 64 78 49 74 65 72  flags, &pIdxIter
25ba0 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  );..  while( rc=
25bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
25bc0 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  =sqlite3Fts5Iter
25bd0 45 6f 66 28 70 49 64 78 49 74 65 72 29 20 29 7b  Eof(pIdxIter) ){
25be0 0a 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a  .    i64 dummy;.
25bf0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50      const u8 *pP
25c00 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73  os;.    int nPos
25c10 3b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20  ;.    i64 rowid 
25c20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
25c30 72 52 6f 77 69 64 28 70 49 64 78 49 74 65 72 29  rRowid(pIdxIter)
25c40 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
25c50 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73  e3Fts5IterPoslis
25c60 74 28 70 49 64 78 49 74 65 72 2c 20 26 70 50 6f  t(pIdxIter, &pPo
25c70 73 2c 20 26 6e 50 6f 73 2c 20 26 64 75 6d 6d 79  s, &nPos, &dummy
25c80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
25c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25ca0 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61    Fts5PoslistRea
25cb0 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20  der sReader;.   
25cc0 20 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74     for(sqlite3Ft
25cd0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49  s5PoslistReaderI
25ce0 6e 69 74 28 2d 31 2c 20 70 50 6f 73 2c 20 6e 50  nit(-1, pPos, nP
25cf0 6f 73 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20  os, &sReader);. 
25d00 20 20 20 20 20 20 20 20 20 73 52 65 61 64 65 72           sReader
25d10 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20  .bEof==0;.      
25d20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
25d30 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
25d40 28 26 73 52 65 61 64 65 72 29 0a 20 20 20 20 20  (&sReader).     
25d50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
25d60 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32  iCol = FTS5_POS2
25d70 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69  COLUMN(sReader.i
25d80 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  Pos);.        in
25d90 74 20 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f  t iOff = FTS5_PO
25da0 53 32 4f 46 46 53 45 54 28 73 52 65 61 64 65 72  S2OFFSET(sReader
25db0 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  .iPos);.        
25dc0 63 6b 73 75 6d 20 5e 3d 20 66 74 73 35 49 6e 64  cksum ^= fts5Ind
25dd0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77  exEntryCksum(row
25de0 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20  id, iCol, iOff, 
25df0 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  iIdx, z, n);.   
25e00 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
25e10 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
25e20 65 78 74 28 70 49 64 78 49 74 65 72 29 3b 0a 20  ext(pIdxIter);. 
25e30 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
25e40 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
25e50 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 2a 70  pIdxIter);..  *p
25e60 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20  Cksum = cksum;. 
25e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
25e80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
25e90 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65  ion is also pure
25ea0 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ly an internal t
25eb0 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  est. It does not
25ec0 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a   contribute to .
25ed0 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61  ** FTS functiona
25ee0 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68  lity, or even th
25ef0 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
25f00 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  k, in any way..*
25f10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
25f20 73 35 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74  s5TestTerm(.  Ft
25f30 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
25f40 74 73 35 42 75 66 66 65 72 20 2a 70 50 72 65 76  ts5Buffer *pPrev
25f50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25f60 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20  * Previous term 
25f70 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
25f80 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  *z, int n,      
25f90 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
25fa0 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73   new term to tes
25fb0 74 20 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63  t */.  u64 expec
25fc0 74 65 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73  ted,.  u64 *pCks
25fd0 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  um.){.  int rc =
25fe0 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50   p->rc;.  if( pP
25ff0 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  rev->n==0 ){.   
26000 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
26010 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63  rc, pPrev, n, (c
26020 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d  onst u8*)z);.  }
26030 65 6c 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53  else.  if( rc==S
26040 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72  QLITE_OK && (pPr
26050 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63  ev->n!=n || memc
26060 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20  mp(pPrev->p, z, 
26070 6e 29 29 20 29 7b 0a 20 20 20 20 75 33 32 20 63  n)) ){.    u32 c
26080 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b  ksum3 = *pCksum;
26090 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
260a0 2a 7a 54 65 72 6d 20 3d 20 26 70 50 72 65 76 2d  *zTerm = &pPrev-
260b0 3e 70 5b 31 5d 3b 20 20 2f 2a 20 54 68 65 20 74  >p[1];  /* The t
260c0 65 72 6d 20 77 69 74 68 6f 75 74 20 74 68 65 20  erm without the 
260d0 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20  prefix-byte */. 
260e0 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70     int nTerm = p
260f0 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20  Prev->n-1;      
26100 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
26110 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
26120 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20  */.    int iIdx 
26130 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d  = (pPrev->p[0] -
26140 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
26150 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  X);.    int flag
26160 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30  s = (iIdx==0 ? 0
26170 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   : FTS5INDEX_QUE
26180 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20  RY_PREFIX);.    
26190 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 36 34 20  int rc;.    u64 
261a0 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34  ck1 = 0;.    u64
261b0 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f   ck2 = 0;..    /
261c0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
261d0 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
261e0 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45  d for ASC and DE
261f0 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20  SC queries are. 
26200 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
26210 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69  If not, call thi
26220 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  s corruption.  *
26230 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51  /.    rc = fts5Q
26240 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
26250 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
26260 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20   flags, &ck1);. 
26270 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
26290 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
262a0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
262b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
262c0 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
262d0 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
262e0 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
262f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
26300 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
26310 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
26320 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f  _CORRUPT;..    /
26330 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70  * If this is a p
26340 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65  refix query, che
26350 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ck that the resu
26360 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20  lts returned if 
26370 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  the.    ** the i
26380 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64  ndex is disabled
26390 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49   are the same. I
263a0 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44  n both ASC and D
263b0 45 53 43 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ESC order. */.  
263c0 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20    if( iIdx>0 && 
263d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
263e0 0a 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66  .      int f = f
263f0 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51  lags|FTS5INDEX_Q
26400 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b  UERY_TEST_NOIDX;
26410 0a 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a  .      ck2 = 0;.
26420 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
26430 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
26440 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
26450 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20   f, &ck2);.     
26460 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26470 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
26480 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
26490 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
264a0 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d  ( iIdx>0 && rc==
264b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
264c0 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
264d0 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
264e0 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35  _TEST_NOIDX|FTS5
264f0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
26500 3b 0a 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b  ;.      ck2 = 0;
26510 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35  .      rc = fts5
26520 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
26530 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
26540 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
26550 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26560 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
26570 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
26580 55 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  UPT;.    }..    
26590 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20  cksum3 ^= ck1;. 
265a0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
265b0 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20  (&rc, pPrev, n, 
265c0 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a  (const u8*)z);..
265d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
265e0 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21  TE_OK && cksum3!
265f0 3d 65 78 70 65 63 74 65 64 20 29 7b 0a 20 20 20  =expected ){.   
26600 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52     rc = FTS5_COR
26610 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
26620 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33  *pCksum = cksum3
26630 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20  ;.  }.  p->rc = 
26640 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20  rc;.}. .#else.# 
26650 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 44  define fts5TestD
26660 6c 69 64 78 52 65 76 65 72 73 65 28 78 2c 79 2c  lidxReverse(x,y,
26670 7a 29 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  z).# define fts5
26680 54 65 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78  TestTerm(u,v,w,x
26690 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 73 74  ,y,z).#endif..st
266a0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
266b0 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
266c0 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35  kSegment(.  Fts5
266d0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
266e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
266f0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
26700 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
26710 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
26720 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg      /* Segme
26730 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
26740 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
26750 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 42 74 72   */.){.  Fts5Btr
26760 65 65 49 74 65 72 20 69 74 65 72 3b 20 20 20 20  eeIter iter;    
26770 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
26780 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
26790 75 67 68 20 62 2d 74 72 65 65 20 68 69 65 72 61  ugh b-tree hiera
267a0 72 63 68 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70  rchy */..  if( p
267b0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
267c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
267d0 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
267e0 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  h the b-tree hie
267f0 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 66 6f  rarchy.  */.  fo
26800 72 28 66 74 73 35 42 74 72 65 65 49 74 65 72 49  r(fts5BtreeIterI
26810 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26 69 74  nit(p, pSeg, &it
26820 65 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  er);.      p->rc
26830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
26840 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20  ter.bEof==0;.   
26850 20 20 20 66 74 73 35 42 74 72 65 65 49 74 65 72     fts5BtreeIter
26860 4e 65 78 74 28 26 69 74 65 72 29 0a 20 20 29 7b  Next(&iter).  ){
26870 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20  .    i64 iRow;  
26880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26890 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
268a0 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20  this leaf */.   
268b0 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
268c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
268d0 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73 20  * Data for this 
268e0 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20  leaf */.    int 
268f0 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
26900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
26910 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72  set of first ter
26920 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20  m on leaf */.   
26930 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
26940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26950 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
26960 65 20 74 68 72 6f 75 67 68 20 65 6d 70 74 79 20  e through empty 
26970 6c 65 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20 2f  leaves */..    /
26980 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e  * If the leaf in
26990 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c   question has al
269a0 72 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d  ready been trimm
269b0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d  ed from the segm
269c0 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e  ent, .    ** ign
269d0 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65 65 20  ore this b-tree 
269e0 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
269f0 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d  , load it into m
26a00 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66  emory. */.    if
26a10 28 20 69 74 65 72 2e 69 4c 65 61 66 3c 70 53 65  ( iter.iLeaf<pSe
26a20 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63  g->pgnoFirst ) c
26a30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f  ontinue;.    iRo
26a40 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  w = FTS5_SEGMENT
26a50 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65  _ROWID(pSeg->iSe
26a60 67 69 64 2c 20 30 2c 20 69 74 65 72 2e 69 4c 65  gid, 0, iter.iLe
26a70 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d  af);.    pLeaf =
26a80 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
26a90 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20   iRow);.    if( 
26aa0 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
26ab0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
26ac0 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f  that the leaf co
26ad0 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
26ae0 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68  one term, and th
26af0 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20  at it is equal. 
26b00 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67     ** to or larg
26b10 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69  er than the spli
26b20 74 2d 6b 65 79 20 69 6e 20 69 74 65 72 2e 74 65  t-key in iter.te
26b30 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20  rm.  Also check 
26b40 74 68 61 74 20 69 66 20 74 68 65 72 65 0a 20 20  that if there.  
26b50 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72    ** is also a r
26b60 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74  owid pointer wit
26b70 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67  hin the leaf pag
26b80 65 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69  e header, it poi
26b90 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20  nts to a.    ** 
26ba0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
26bb0 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20  the term.  */.  
26bc0 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74    iOff = fts5Get
26bd0 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d  U16(&pLeaf->p[2]
26be0 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3d  );.    if( iOff=
26bf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
26c00 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
26c10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26c20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
26c30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  ;.      int nTer
26c40 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
26c50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
26c60 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62  erm on leaf in b
26c70 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ytes */.      in
26c80 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
26c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
26ca0 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20  parison of term 
26cb0 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f  and split-key */
26cc0 0a 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66  ..      iRowidOf
26cd0 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
26ce0 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20  pLeaf->p[0]);.  
26cf0 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
26d00 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20  f>=iOff ){.     
26d10 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
26d20 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
26d30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
26d40 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
26d50 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
26d60 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20  iOff], nTerm);. 
26d70 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d         res = mem
26d80 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  cmp(&pLeaf->p[iO
26d90 66 66 5d 2c 20 69 74 65 72 2e 74 65 72 6d 2e 70  ff], iter.term.p
26da0 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 69 74 65  , MIN(nTerm, ite
26db0 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20 20 20 20  r.term.n));.    
26dc0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
26dd0 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 69   res = nTerm - i
26de0 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20  ter.term.n;.    
26df0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20      if( res<0 ) 
26e00 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
26e10 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
26e20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61    }.    fts5Data
26e30 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
26e40 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
26e50 62 72 65 61 6b 3b 0a 0a 0a 20 20 20 20 2f 2a 20  break;...    /* 
26e60 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
26e70 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
26e80 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
26e90 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
26ea0 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73  .    ** (a) exis
26eb0 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
26ec0 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20  n no terms. */. 
26ed0 20 20 20 66 6f 72 28 69 3d 31 3b 20 70 2d 3e 72     for(i=1; p->r
26ee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26ef0 69 3c 3d 69 74 65 72 2e 6e 45 6d 70 74 79 3b 20  i<=iter.nEmpty; 
26f00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4c 65 61  i++){.      pLea
26f10 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
26f20 28 70 2c 20 69 52 6f 77 2b 69 29 3b 0a 20 20 20  (p, iRow+i);.   
26f30 20 20 20 69 66 28 20 70 4c 65 61 66 20 26 26 20     if( pLeaf && 
26f40 30 21 3d 66 74 73 35 47 65 74 55 31 36 28 26 70  0!=fts5GetU16(&p
26f50 4c 65 61 66 2d 3e 70 5b 32 5d 29 20 29 7b 0a 20  Leaf->p[2]) ){. 
26f60 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
26f70 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
26f80 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44     }.      fts5D
26f90 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
26fa0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
26fb0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
26fc0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63 68  oclist-index, ch
26fd0 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b  eck that it look
26fe0 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  s right. */.    
26ff0 69 66 28 20 69 74 65 72 2e 62 44 6c 69 64 78 20  if( iter.bDlidx 
27000 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69  ){.      Fts5Dli
27010 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
27020 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72   0;  /* For iter
27030 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f  ating through do
27040 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  clist index */. 
27050 20 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65       int iPrevLe
27060 61 66 20 3d 20 69 74 65 72 2e 69 4c 65 61 66 3b  af = iter.iLeaf;
27070 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 69  .      int iSegi
27080 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64  d = pSeg->iSegid
27090 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b  ;.      int iPg;
270a0 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79 3b  .      i64 iKey;
270b0 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c 69  ..      for(pDli
270c0 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
270d0 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69  Init(p, 0, iSegi
270e0 64 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a  d, iter.iLeaf);.
270f0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c            fts5Dl
27100 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
27110 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
27120 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
27130 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29  rNext(p, pDlidx)
27140 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20  .      ){..     
27150 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20     /* Check any 
27160 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73  rowid-less pages
27170 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f   that occur befo
27180 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  re the current l
27190 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eaf. */.        
271a0 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61  for(iPg=iPrevLea
271b0 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69  f+1; iPg<fts5Dli
271c0 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
271d0 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  x); iPg++){.    
271e0 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
271f0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
27200 69 53 65 67 69 64 2c 20 30 2c 20 69 50 67 29 3b  iSegid, 0, iPg);
27210 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61 66  .          pLeaf
27220 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
27230 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20  p, iKey);.      
27240 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
27250 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27260 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
27270 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20 70  af->p[0])!=0 ) p
27280 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
27290 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UPT;.           
272a0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
272b0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
272c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
272d0 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66         iPrevLeaf
272e0 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
272f0 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
27300 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
27310 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61  that the leaf pa
27320 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ge indicated by 
27330 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
27340 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20  lly does.       
27350 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   ** contain the 
27360 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20  rowid suggested 
27370 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a  by the same. */.
27380 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
27390 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
273a0 44 28 69 53 65 67 69 64 2c 20 30 2c 20 69 50 72  D(iSegid, 0, iPr
273b0 65 76 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  evLeaf);.       
273c0 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
273d0 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
273e0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
273f0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
27400 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
27410 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
27420 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
27430 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
27440 20 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69           getVari
27450 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
27460 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
27470 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
27480 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66     if( iRowid!=f
27490 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
274a0 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72  d(pDlidx) ) p->r
274b0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
274c0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
274d0 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
274e0 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  f);.        }.  
274f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
27500 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31  (iPg=iPrevLeaf+1
27510 3b 20 69 50 67 3c 3d 28 69 74 65 72 2e 69 4c 65  ; iPg<=(iter.iLe
27520 61 66 20 2b 20 69 74 65 72 2e 6e 45 6d 70 74 79  af + iter.nEmpty
27530 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20  ); iPg++){.     
27540 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53     iKey = FTS5_S
27550 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
27560 67 69 64 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20  gid, 0, iPg);.  
27570 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
27580 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
27590 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
275a0 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
275b0 20 20 20 20 69 66 28 20 66 74 73 35 47 65 74 55      if( fts5GetU
275c0 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29  16(&pLeaf->p[0])
275d0 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  !=0 ) p->rc = FT
275e0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
275f0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
27600 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
27610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27620 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
27630 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
27640 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65 73 74  ;.      fts5Test
27650 44 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c 20  DlidxReverse(p, 
27660 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c 65  iSegid, iter.iLe
27670 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  af);.    }.  }..
27680 20 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69    /* Page iter.i
27690 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65  Leaf must now be
276a0 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c   the rightmost l
276b0 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20  eaf-page in the 
276c0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 66 28  segment */.  if(
276d0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
276e0 4b 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21  K && iter.iLeaf!
276f0 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  =pSeg->pgnoLast 
27700 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
27710 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  TS5_CORRUPT;.  }
27720 0a 0a 20 20 66 74 73 35 42 74 72 65 65 49 74 65  ..  fts5BtreeIte
27730 72 46 72 65 65 28 26 69 74 65 72 29 3b 0a 7d 0a  rFree(&iter);.}.
27740 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65  ../*.** Run inte
27750 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65  rnal checks to e
27760 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46  nsure that the F
27770 54 53 20 69 6e 64 65 78 20 28 61 29 20 69 73 20  TS index (a) is 
27780 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63  internally .** c
27790 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62  onsistent and (b
277a0 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69  ) contains entri
277b0 65 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  es for which the
277c0 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63   XOR of the chec
277d0 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63  ksums.** as calc
277e0 75 6c 61 74 65 64 20 62 79 20 66 74 73 35 49 6e  ulated by fts5In
277f0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20  dexEntryCksum() 
27800 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  is cksum..**.** 
27810 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
27820 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20  RRUPT if any of 
27830 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  the internal che
27840 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20  cks fail, or if 
27850 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20  the.** checksum 
27860 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20  does not match. 
27870 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
27880 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70   if all checks p
27890 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65  ass without.** e
278a0 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74  rror, or some ot
278b0 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72  her SQLite error
278c0 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72   code if another
278d0 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d   error (e.g. OOM
278e0 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  ).** occurs..*/.
278f0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
27900 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
27910 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ck(Fts5Index *p,
27920 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 75   u64 cksum){.  u
27930 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20  64 cksum2 = 0;  
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27950 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
27960 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   on contents of 
27970 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73  indexes */.  Fts
27980 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20  5Buffer poslist 
27990 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20  = {0,0,0};   /* 
279a0 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68  Buffer used to h
279b0 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f  old a poslist */
279c0 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
279d0 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20  ter *pIter;     
279e0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
279f0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e  erate through en
27a00 74 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  tire index */.  
27a10 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
27a20 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20 20  Struct;         
27a30 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
27a40 72 65 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 65 64  re */..  /* Used
27a50 20 62 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e   by extra intern
27a60 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75  al tests only ru
27a70 6e 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  n if NDEBUG is n
27a80 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  ot defined */.  
27a90 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20  u64 cksum3 = 0; 
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ab0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65  /* Checksum base
27ac0 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66  d on contents of
27ad0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74   indexes */.  Ft
27ae0 73 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20  s5Buffer term = 
27af0 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a  {0,0,0};      /*
27b00 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20   Buffer used to 
27b10 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74  hold most recent
27b20 20 74 65 72 6d 20 2a 2f 0a 20 20 0a 20 20 2f 2a   term */.  .  /*
27b30 20 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e   Load the FTS in
27b40 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
27b50 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
27b60 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
27b70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
27b80 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
27b90 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73   nodes of each s
27ba0 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65  egment match the
27bb0 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28   leaves */.  if(
27bc0 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
27bd0 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
27be0 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
27bf0 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
27c00 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
27c10 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
27c20 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
27c30 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
27c40 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
27c50 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
27c60 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
27c70 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
27c80 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
27c90 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49  ];.        fts5I
27ca0 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
27cb0 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65  ckSegment(p, pSe
27cc0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
27cd0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
27ce0 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70  cksum argument p
27cf0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
27d00 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63  nction is a chec
27d10 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a  ksum calculated.
27d20 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c    ** based on al
27d30 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69  l expected entri
27d40 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  es in the FTS in
27d50 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70  dex (including p
27d60 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a  refix index.  **
27d70 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20   entries). This 
27d80 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61  block checks tha
27d90 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  t a checksum cal
27da0 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  culated based on
27db0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
27dc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53   contents of FTS
27dd0 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69   index is identi
27de0 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cal..  **.  ** T
27df0 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
27e00 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d  he same checksum
27e10 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e   are calculated.
27e20 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63   The first (stac
27e30 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  k.  ** variable 
27e40 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e  cksum2) based on
27e50 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74   entries extract
27e60 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c  ed from the full
27e70 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a  -text index.  **
27e80 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c   while doing a l
27e90 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61  inear scan of ea
27ea0 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e  ch individual in
27eb0 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20  dex in turn. .  
27ec0 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20  **.  ** As each 
27ed0 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20  term visited by 
27ee0 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73  the linear scans
27ef0 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65  , a separate que
27f00 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ry for the.  ** 
27f10 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72  same term is per
27f20 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69  formed. cksum3 i
27f30 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  s calculated bas
27f40 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65  ed on the entrie
27f50 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64  s.  ** extracted
27f60 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65   by these querie
27f70 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74  s..  */.  for(ft
27f80 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
27f90 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c  , pStruct, 0, 0,
27fa0 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70   0, 0, -1, 0, &p
27fb0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
27fc0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
27fd0 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
27fe0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
27ff0 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
28000 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74   0).  ){.    int
28010 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
28020 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
28030 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
28040 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f  s */.    i64 iPo
28050 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
28060 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
28070 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69   read from posli
28080 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  st */.    int iO
28090 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
280a0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
280b0 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a  within poslist *
280c0 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
280d0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
280e0 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
280f0 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
28100 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
28110 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b  Term(pIter, &n);
28120 0a 0a 20 20 20 20 70 6f 73 6c 69 73 74 2e 6e 20  ..    poslist.n 
28130 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  = 0;.    fts5Mul
28140 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c  tiIterPoslist(p,
28150 20 70 49 74 65 72 2c 20 30 2c 20 26 70 6f 73 6c   pIter, 0, &posl
28160 69 73 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ist);.    while(
28170 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 50   0==sqlite3Fts5P
28180 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 70 6f 73  oslistNext64(pos
28190 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73 74 2e  list.p, poslist.
281a0 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f 73 29  n, &iOff, &iPos)
281b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
281c0 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f  ol = FTS5_POS2CO
281d0 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20 20  LUMN(iPos);.    
281e0 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20 3d 20    int iTokOff = 
281f0 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28  FTS5_POS2OFFSET(
28200 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 63 6b 73  iPos);.      cks
28210 75 6d 32 20 5e 3d 20 66 74 73 35 49 6e 64 65 78  um2 ^= fts5Index
28220 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69  EntryCksum(iRowi
28230 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66  d, iCol, iTokOff
28240 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  , -1, z, n);.   
28250 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
28260 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d  is is a new term
28270 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20  , query for it. 
28280 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69  Update cksum3 wi
28290 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  th the results. 
282a0 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74 54  */.    fts5TestT
282b0 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c  erm(p, &term, z,
282c0 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73   n, cksum2, &cks
282d0 75 6d 33 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  um3);.  }.  fts5
282e0 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72  TestTerm(p, &ter
282f0 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c  m, 0, 0, cksum2,
28300 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74   &cksum3);..  ft
28310 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
28320 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 69 66 28  p, pIter);.  if(
28330 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
28340 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75  K && cksum!=cksu
28350 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  m2 ) p->rc = FTS
28360 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74  5_CORRUPT;..  ft
28370 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
28380 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 66  se(pStruct);.  f
28390 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
283a0 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66  erm);.  fts5Buff
283b0 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29  erFree(&poslist)
283c0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
283d0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
283e0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61  .../*.** Calcula
283f0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
28400 63 68 65 63 6b 73 75 6d 20 74 68 61 74 20 69 73  checksum that is
28410 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20   the XOR of the 
28420 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63  index entry.** c
28430 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65  hecksum of all e
28440 6e 74 72 69 65 73 20 74 68 61 74 20 77 6f 75 6c  ntries that woul
28450 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 62  d be generated b
28460 79 20 74 68 65 20 74 6f 6b 65 6e 20 73 70 65 63  y the token spec
28470 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ified.** by the 
28480 66 69 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e 74  final 5 argument
28490 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65  s..*/.u64 sqlite
284a0 33 46 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28  3Fts5IndexCksum(
284b0 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
284c0 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20  Config,         
284d0 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
284e0 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
284f0 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20  i64 iRowid,     
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 2f 2a 20 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d  /* Document term
28520 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20   appears in */. 
28530 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28550 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20   /* Column term 
28560 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20  appears in */.  
28570 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20  int iPos,       
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d  /* Position term
285a0 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20   appears in */. 
285b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65   const char *pTe
285c0 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20  rm, int nTerm   
285d0 20 2f 2a 20 54 65 72 6d 20 61 74 20 69 50 6f 73   /* Term at iPos
285e0 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65 74   */.){.  u64 ret
285f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
28600 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28610 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  rn value */.  in
28620 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20  t iIdx;         
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28640 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
28650 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a  hrough indexes *
28660 2f 0a 0a 20 20 72 65 74 20 3d 20 66 74 73 35 49  /..  ret = fts5I
28670 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69  ndexEntryCksum(i
28680 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
28690 73 2c 20 30 2c 20 70 54 65 72 6d 2c 20 6e 54 65  s, 0, pTerm, nTe
286a0 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 49 64 78  rm);..  for(iIdx
286b0 3d 30 3b 20 69 49 64 78 3c 70 43 6f 6e 66 69 67  =0; iIdx<pConfig
286c0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
286d0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  +){.    int nByt
286e0 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61  e = fts5IndexCha
286f0 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54  rlenToBytelen(pT
28700 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 43 6f 6e  erm, nTerm, pCon
28710 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
28720 78 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  x]);.    if( nBy
28730 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 20  te ){.      ret 
28740 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  ^= fts5IndexEntr
28750 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69  yCksum(iRowid, i
28760 43 6f 6c 2c 20 69 50 6f 73 2c 20 69 49 64 78 2b  Col, iPos, iIdx+
28770 31 2c 20 70 54 65 72 6d 2c 20 6e 42 79 74 65 29  1, pTerm, nByte)
28780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
28790 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
287a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
287f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28830 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69  ***.** Below thi
28840 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69  s point is the i
28850 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
28860 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
28870 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e  () scalar.** fun
28880 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a  ction only..*/..
28890 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73  /*.** Decode a s
288a0 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77 69  egment-data rowi
288b0 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
288c0 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  a table. This fu
288d0 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65  nction is.** the
288e0 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61 63   opposite of mac
288f0 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ro FTS5_SEGMENT_
28900 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74  ROWID()..*/.stat
28910 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
28920 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20 69  deRowid(.  i64 i
28930 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
28940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
28950 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61 20  wid from %_data 
28960 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  table */.  int *
28970 70 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20  piSegid,        
28980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28990 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f  T: Segment id */
289a0 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64 78 2c  .  int *pbDlidx,
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64 78     /* OUT: Dlidx
289d0 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20 2a   flag */.  int *
289e0 70 69 48 65 69 67 68 74 2c 20 20 20 20 20 20 20  piHeight,       
289f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28a00 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69  T: Height */.  i
28a10 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20  nt *piPgno      
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a30 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62  * OUT: Page numb
28a40 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67  er */.){.  *piPg
28a50 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  no = (int)(iRowi
28a60 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
28a70 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
28a80 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69  ) - 1));.  iRowi
28a90 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
28aa0 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65  PAGE_B;..  *piHe
28ab0 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f  ight = (int)(iRo
28ac0 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
28ad0 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  < FTS5_DATA_HEIG
28ae0 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69  HT_B) - 1));.  i
28af0 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
28b00 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20  ATA_HEIGHT_B;.. 
28b10 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69 6e 74   *pbDlidx = (int
28b20 29 28 69 52 6f 77 69 64 20 26 20 30 78 30 30 30  )(iRowid & 0x000
28b30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  1);.  iRowid >>=
28b40 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
28b50 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20 3d 20  ;..  *piSegid = 
28b60 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
28b70 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
28b80 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31 29 29  DATA_ID_B) - 1))
28b90 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
28ba0 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28   fts5DebugRowid(
28bb0 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75  int *pRc, Fts5Bu
28bc0 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20  ffer *pBuf, i64 
28bd0 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 53 65  iKey){.  int iSe
28be0 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50  gid, iHeight, iP
28bf0 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20 20 20  gno, bDlidx;    
28c00 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70     /* Rowid comp
28c10 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35  enents */.  fts5
28c20 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b 65 79  DecodeRowid(iKey
28c30 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69  , &iSegid, &bDli
28c40 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69  dx, &iHeight, &i
28c50 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53  Pgno);..  if( iS
28c60 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  egid==0 ){.    i
28c70 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56  f( iKey==FTS5_AV
28c80 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a  ERAGES_ROWID ){.
28c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
28ca0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
28cb0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
28cc0 28 61 76 65 72 61 67 65 73 29 20 22 29 3b 0a 20  (averages) ");. 
28cd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28ce0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
28cf0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
28d00 63 2c 20 70 42 75 66 2c 20 22 28 73 74 72 75 63  c, pBuf, "(struc
28d10 74 75 72 65 29 22 29 3b 0a 20 20 20 20 7d 0a 20  ture)");.    }. 
28d20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73   }.  else{.    s
28d30 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
28d40 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
28d50 2c 20 70 42 75 66 2c 20 22 28 25 73 73 65 67 69  , pBuf, "(%ssegi
28d60 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25  d=%d h=%d pgno=%
28d70 64 29 22 2c 0a 20 20 20 20 20 20 20 20 62 44 6c  d)",.        bDl
28d80 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22 20 3a  idx ? "dlidx " :
28d90 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69 48 65   "", iSegid, iHe
28da0 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20 20  ight, iPgno.    
28db0 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
28dc0 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 53   void fts5DebugS
28dd0 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20  tructure(.  int 
28de0 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
28df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28e00 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64  N/OUT: error cod
28e10 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
28e20 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73 35 53  r *pBuf,.  Fts5S
28e30 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a 20  tructure *p.){. 
28e40 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e60 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f   /* Iterate thro
28e70 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65 67 6d  ugh levels, segm
28e80 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ents */..  for(i
28e90 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e  Lvl=0; iLvl<p->n
28ea0 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
28eb0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
28ec0 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
28ed0 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  p->aLevel[iLvl];
28ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
28ef0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
28f00 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20  tf(pRc, pBuf, . 
28f10 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64         " {lvl=%d
28f20 20 6e 4d 65 72 67 65 3d 25 64 22 2c 20 69 4c 76   nMerge=%d", iLv
28f30 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 0a  l, pLvl->nMerge.
28f40 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69      );.    for(i
28f50 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c  Seg=0; iSeg<pLvl
28f60 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ->nSeg; iSeg++){
28f70 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
28f80 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
28f90 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  g = &pLvl->aSeg[
28fa0 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c  iSeg];.      sql
28fb0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
28fc0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
28fd0 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20  pBuf, .         
28fe0 20 22 20 7b 69 64 3d 25 64 20 68 3d 25 64 20 6c   " {id=%d h=%d l
28ff0 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20  eaves=%d..%d}", 
29000 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 53  pSeg->iSegid, pS
29010 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20 0a 20 20  eg->nHeight, .  
29020 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67          pSeg->pg
29030 6e 6f 46 69 72 73 74 2c 20 70 53 65 67 2d 3e 70  noFirst, pSeg->p
29040 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20 29 3b  gnoLast.      );
29050 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29060 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
29070 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
29080 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a  uf, "}");.  }.}.
29090 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70  ./*.** This is p
290a0 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f  art of the fts5_
290b0 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69  decode() debuggi
290c0 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  ng aid..**.** Ar
290d0 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42  guments pBlob/nB
290e0 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 20 73 65  lob contain a se
290f0 72 69 61 6c 69 7a 65 64 20 46 74 73 35 53 74 72  rialized Fts5Str
29100 75 63 74 75 72 65 20 6f 62 6a 65 63 74 2e 20 54  ucture object. T
29110 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
29120 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d  appends a human-
29130 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65  readable represe
29140 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
29150 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ame object.** to
29160 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73   the buffer pass
29170 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
29180 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73   argument. .*/.s
29190 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
291a0 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 0a  ecodeStructure(.
291b0 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
291e0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
291f0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
29200 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62   const u8 *pBlob
29210 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20  , int nBlob.){. 
29220 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
29230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29240 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
29250 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
29260 72 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  re *p = 0;      
29270 20 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 64 20       /* Decoded 
29280 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
29290 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 35   */..  rc = fts5
292a0 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
292b0 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c  pBlob, nBlob, 0,
292c0 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   &p);.  if( rc!=
292d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
292e0 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
292f0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
29300 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
29310 65 28 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b  e(pRc, pBuf, p);
29320 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
29330 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f  Release(p);.}../
29340 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e  *.** Buffer (a/n
29350 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
29360 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f  contain a list o
29370 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72  f serialized var
29380 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61  ints. Read.** ea
29390 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70  ch varint and ap
293a0 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20  pend its string 
293b0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74  representation t
293c0 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52  o buffer pBuf. R
293d0 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65  eturn.** after e
293e0 69 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20  ither the input 
293f0 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73  buffer is exhaus
29400 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65  ted or a 0 value
29410 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   is read..**.** 
29420 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
29430 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
29440 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
29450 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
29460 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
29470 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  t fts5DecodePosl
29480 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
29490 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
294a0 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
294b0 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20   n){.  int iOff 
294c0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f  = 0;.  while( iO
294d0 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
294e0 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b  iVal;.    iOff +
294f0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
29500 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c  2(&a[iOff], iVal
29510 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
29520 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
29530 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
29540 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20  " %d", iVal);.  
29550 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  }.  return iOff;
29560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
29570 61 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61  art of buffer (a
29580 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  /n) contains the
29590 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c   start of a docl
295a0 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74  ist. The doclist
295b0 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  .** may or may n
295c0 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e  ot finish within
295d0 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69   the buffer. Thi
295e0 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
295f0 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70  ds a text.** rep
29600 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
29610 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  he part of the d
29620 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70  oclist that is p
29630 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72  resent to buffer
29640 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a  .** pBuf. .**.**
29650 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
29660 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
29670 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72  of bytes read fr
29680 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  om the input buf
29690 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
296a0 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  nt fts5DecodeDoc
296b0 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46  list(int *pRc, F
296c0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
296d0 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
296e0 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63  t n){.  i64 iDoc
296f0 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  id;.  int iOff =
29700 20 30 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 73 71   0;..  iOff = sq
29710 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26  lite3GetVarint(&
29720 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
29730 69 44 6f 63 69 64 29 3b 0a 20 20 73 71 6c 69 74  iDocid);.  sqlit
29740 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
29750 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
29760 75 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64  uf, " rowid=%lld
29770 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 77 68  ", iDocid);.  wh
29780 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
29790 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
297a0 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
297b0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
297c0 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69  PoslistSize(&a[i
297d0 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
297e0 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20  ummy);.    iOff 
297f0 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73  += fts5DecodePos
29800 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20  list(pRc, pBuf, 
29810 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d  &a[iOff], MIN(n-
29820 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20  iOff, nPos));.  
29830 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
29840 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
29850 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
29860 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
29870 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
29880 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
29890 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
298a0 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20   return iOff;.  
298b0 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44      iDocid += iD
298c0 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69  elta;.      sqli
298d0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
298e0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
298f0 42 75 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c  Buf, " rowid=%ll
29900 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20  d", iDocid);.   
29910 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
29920 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
29930 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
29940 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  on of user-defin
29950 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
29960 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  on fts5_decode()
29970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29980 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
29990 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
299a0 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
299b0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
299c0 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
299d0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29a00 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32  f args (always 2
29a10 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) */.  sqlite3_v
29a20 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
29a30 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
29a40 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
29a50 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ){.  i64 iRowid;
29a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a70 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
29a80 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64  r record being d
29a90 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ecoded */.  int 
29aa0 69 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c 69  iSegid,iHeight,i
29ab0 50 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52  Pgno,bDlidx;/* R
29ac0 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  owid components 
29ad0 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  */.  const u8 *a
29ae0 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20  Blob; int n;    
29af0 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74       /* Record t
29b00 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38  o decode */.  u8
29b10 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42   *a = 0;.  Fts5B
29b20 75 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20  uffer s;        
29b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
29b40 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72  ild up text to r
29b50 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20  eturn here */.  
29b60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29b70 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
29b80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29b90 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d  /.  int nSpace =
29ba0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   0;..  assert( n
29bb0 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73  Arg==2 );.  mems
29bc0 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
29bd0 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
29be0 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65   iRowid = sqlite
29bf0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
29c00 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73  Val[0]);.  n = s
29c10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
29c20 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  es(apVal[1]);.  
29c30 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  aBlob = sqlite3_
29c40 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c  value_blob(apVal
29c50 5b 31 5d 29 3b 0a 0a 20 20 6e 53 70 61 63 65 20  [1]);..  nSpace 
29c60 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  = n + FTS5_DATA_
29c70 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20  ZERO_PADDING;.  
29c80 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  a = (u8*)sqlite3
29c90 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
29ca0 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  rc, nSpace);.  i
29cb0 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64  f( a==0 ) goto d
29cc0 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d  ecode_out;.  mem
29cd0 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29  cpy(a, aBlob, n)
29ce0 3b 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f  ;.  fts5DecodeRo
29cf0 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53 65  wid(iRowid, &iSe
29d00 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69  gid, &bDlidx, &i
29d10 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b  Height, &iPgno);
29d20 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77  ..  fts5DebugRow
29d30 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77  id(&rc, &s, iRow
29d40 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69 64  id);.  if( bDlid
29d50 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  x ){.    Fts5Dat
29d60 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73  a dlidx;.    Fts
29d70 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a  5DlidxLvl lvl;..
29d80 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b      dlidx.p = a;
29d90 0a 20 20 20 20 64 6c 69 64 78 2e 6e 20 3d 20 6e  .    dlidx.n = n
29da0 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 52 65 66  ;.    dlidx.nRef
29db0 20 3d 20 32 3b 0a 0a 20 20 20 20 6d 65 6d 73 65   = 2;..    memse
29dc0 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(&lvl, 0, sizeo
29dd0 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
29de0 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20  ;.    lvl.pData 
29df0 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76  = &dlidx;.    lv
29e00 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50  l.iLeafPgno = iP
29e10 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74  gno;..    for(ft
29e20 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
29e30 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d  lvl); lvl.bEof==
29e40 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  0; fts5DlidxLvlN
29e50 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20  ext(&lvl)){.    
29e60 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
29e70 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
29e80 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20  &rc, &s, .      
29e90 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c      " %d(%lld)",
29ea0 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20   lvl.iLeafPgno, 
29eb0 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20  lvl.iRowid.     
29ec0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
29ed0 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20  e if( iSegid==0 
29ee0 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  ){.    if( iRowi
29ef0 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  d==FTS5_AVERAGES
29f00 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
29f10 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 7d  /* todo */.    }
29f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
29f30 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
29f40 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a  &rc, &s, a, n);.
29f50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a      }.  }else{..
29f60 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
29f70 65 72 6d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  erm;.    memset(
29f80 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
29f90 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a  (Fts5Buffer));..
29fa0 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3d      if( iHeight=
29fb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
29fc0 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
29fd0 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
29fe0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  f = 0;.      int
29ff0 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74   iOff;.      int
2a000 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20   nKeep = 0;..   
2a010 20 20 20 69 66 28 20 6e 3e 3d 34 20 29 7b 0a 20     if( n>=4 ){. 
2a020 20 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66         iRowidOff
2a030 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
2a040 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 54  [0]);.        iT
2a050 65 72 6d 4f 66 66 20 3d 20 66 74 73 35 47 65 74  ermOff = fts5Get
2a060 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
2a070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a080 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2a090 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20 38  erSet(&rc, &s, 8
2a0a0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f  , (const u8*)"co
2a0b0 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20 20  rrupt");.       
2a0c0 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
2a0d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2a0e0 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
2a0f0 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  {.        iOff =
2a100 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
2a110 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72    }else if( iTer
2a120 6d 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  mOff ){.        
2a130 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
2a140 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a150 20 20 20 20 20 20 69 4f 66 66 20 3d 20 6e 3b 0a        iOff = n;.
2a160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
2a170 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
2a180 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20  &rc, &s, &a[4], 
2a190 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 20 20  iOff-4);..      
2a1a0 61 73 73 65 72 74 28 20 69 52 6f 77 69 64 4f 66  assert( iRowidOf
2a1b0 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 52  f==0 || iOff==iR
2a1c0 6f 77 69 64 4f 66 66 20 29 3b 0a 20 20 20 20 20  owidOff );.     
2a1d0 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
2a1e0 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
2a1f0 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  = fts5DecodeDocl
2a200 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
2a210 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a  iOff], n-iOff);.
2a220 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
2a230 73 73 65 72 74 28 20 69 54 65 72 6d 4f 66 66 3d  ssert( iTermOff=
2a240 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 54 65 72  =0 || iOff==iTer
2a250 6d 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 77 68  mOff );.      wh
2a260 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
2a270 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
2a280 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
2a290 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2a2a0 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  2(&a[iOff], nByt
2a2b0 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d  e);.        term
2a2c0 2e 6e 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20  .n= nKeep;.     
2a2d0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
2a2e0 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65  endBlob(&rc, &te
2a2f0 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f  rm, nByte, &a[iO
2a300 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  ff]);.        iO
2a310 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20  ff += nByte;..  
2a320 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2a330 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2a340 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
2a350 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d   &rc, &s, " term
2a360 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20  =%.*s", term.n, 
2a370 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72  (const char*)ter
2a380 6d 2e 70 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  m.p.        );. 
2a390 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
2a3a0 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
2a3b0 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
2a3c0 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20  f], n-iOff);.   
2a3d0 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20       if( iOff<n 
2a3e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  ){.          iOf
2a3f0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2a400 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
2a410 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  Keep);.        }
2a420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2a430 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
2a440 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  erm);.    }else{
2a450 0a 20 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49  .      Fts5NodeI
2a460 74 65 72 20 73 73 3b 0a 20 20 20 20 20 20 66 6f  ter ss;.      fo
2a470 72 28 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e  r(fts5NodeIterIn
2a480 69 74 28 61 2c 20 6e 2c 20 26 73 73 29 3b 20 73  it(a, n, &ss); s
2a490 73 2e 61 44 61 74 61 3b 20 66 74 73 35 4e 6f 64  s.aData; fts5Nod
2a4a0 65 49 74 65 72 4e 65 78 74 28 26 72 63 2c 20 26  eIterNext(&rc, &
2a4b0 73 73 29 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ss)){.        if
2a4c0 28 20 73 73 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29  ( ss.term.n==0 )
2a4d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2a4e0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2a4f0 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26  endPrintf(&rc, &
2a500 73 2c 20 22 20 6c 65 66 74 3d 25 64 22 2c 20 73  s, " left=%d", s
2a510 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  s.iChild);.     
2a520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a530 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2a540 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2a550 66 28 26 72 63 2c 26 73 2c 20 22 20 5c 22 25 2e  f(&rc,&s, " \"%.
2a560 2a 73 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  *s\"", .        
2a570 20 20 20 20 20 20 73 73 2e 74 65 72 6d 2e 6e 2c        ss.term.n,
2a580 20 73 73 2e 74 65 72 6d 2e 70 0a 20 20 20 20 20   ss.term.p.     
2a590 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2a5a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 73  }.        if( ss
2a5b0 2e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20  .nEmpty ){.     
2a5c0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2a5d0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2a5e0 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 65 6d  tf(&rc, &s, " em
2a5f0 70 74 79 3d 25 64 25 73 22 2c 20 73 73 2e 6e 45  pty=%d%s", ss.nE
2a600 6d 70 74 79 2c 0a 20 20 20 20 20 20 20 20 20 20  mpty,.          
2a610 20 20 20 20 73 73 2e 62 44 6c 69 64 78 20 3f 20      ss.bDlidx ? 
2a620 22 2a 22 20 3a 20 22 22 0a 20 20 20 20 20 20 20  "*" : "".       
2a630 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
2a640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
2a650 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26  s5NodeIterFree(&
2a660 73 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ss);.    }.  }. 
2a670 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20   . decode_out:. 
2a680 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
2a690 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2a6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2a6b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
2a6c0 28 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68  (pCtx, (const ch
2a6d0 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51  ar*)s.p, s.n, SQ
2a6e0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
2a6f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
2a700 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2a710 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
2a720 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66  );.  }.  fts5Buf
2a730 66 65 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a  ferFree(&s);.}..
2a740 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
2a750 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
2a760 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
2a770 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f  function fts5_ro
2a780 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  wid()..*/.static
2a790 20 76 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46   void fts5RowidF
2a7a0 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
2a7b0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2a7c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
2a7d0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
2a7e0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
2a7f0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2a800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a810 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
2a820 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
2a830 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
2a840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2a850 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
2a860 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
2a870 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28  har *zArg;.  if(
2a880 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20   nArg==0 ){.    
2a890 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2a8a0 72 72 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75  rror(pCtx, "shou
2a8b0 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69  ld be: fts5_rowi
2a8c0 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29  d(subject, ....)
2a8d0 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
2a8e0 0a 20 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e  .    zArg = (con
2a8f0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
2a900 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
2a910 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30  l[0]);.    if( 0
2a920 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
2a930 70 28 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74  p(zArg, "segment
2a940 22 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ") ){.      i64 
2a950 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e  iRowid;.      in
2a960 74 20 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  t segid, height,
2a970 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28   pgno;.      if(
2a980 20 6e 41 72 67 21 3d 34 20 29 7b 0a 20 20 20 20   nArg!=4 ){.    
2a990 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2a9a0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f              "sho
2a9c0 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
2a9d0 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65  id('segment', se
2a9e0 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e  gid, height, pgn
2a9f0 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20  o))", -1.       
2aa00 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
2aa10 0a 20 20 20 20 20 20 20 20 73 65 67 69 64 20 3d  .        segid =
2aa20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2aa30 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  nt(apVal[1]);.  
2aa40 20 20 20 20 20 20 68 65 69 67 68 74 20 3d 20 73        height = s
2aa50 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2aa60 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20  (apVal[2]);.    
2aa70 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74      pgno = sqlit
2aa80 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
2aa90 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20  al[3]);.        
2aaa0 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
2aab0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69  GMENT_ROWID(segi
2aac0 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  d, height, pgno)
2aad0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2aae0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
2aaf0 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Ctx, iRowid);.  
2ab00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2ab10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2ab20 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
2ab30 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69 72  x, .        "fir
2ab40 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72  st arg to fts5_r
2ab50 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20 27  owid() must be '
2ab60 73 65 67 6d 65 6e 74 27 20 22 0a 20 20 20 20 20  segment' ".     
2ab70 20 20 20 22 6f 72 20 27 73 74 61 72 74 2d 6f 66     "or 'start-of
2ab80 2d 69 6e 64 65 78 27 22 0a 20 20 20 20 20 20 20  -index'".       
2ab90 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20   , -1.      );. 
2aba0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2abb0 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
2abc0 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 67 69   as part of regi
2abd0 73 74 65 72 69 6e 67 20 74 68 65 20 46 54 53 35  stering the FTS5
2abe0 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74   module with dat
2abf0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
2ac00 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73  ion db. It regis
2ac10 74 65 72 73 20 73 65 76 65 72 61 6c 20 75 73 65  ters several use
2ac20 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
2ac30 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75   functions usefu
2ac40 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a  l.** with FTS5..
2ac50 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2ac60 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
2ac70 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2ac80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2ac90 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51  some other.** SQ
2aca0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
2acb0 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
2acc0 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ead..*/.int sqli
2acd0 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74  te3Fts5IndexInit
2ace0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
2acf0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2ad00 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2ad10 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74  n(.      db, "ft
2ad20 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53  s5_decode", 2, S
2ad30 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
2ad40 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f  ts5DecodeFunctio
2ad50 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69  n, 0, 0.  );.  i
2ad60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ad70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
2ad80 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
2ad90 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62  tion(.        db
2ada0 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20  , "fts5_rowid", 
2adb0 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
2adc0 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e   0, fts5RowidFun
2add0 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20  ction, 0, 0.    
2ade0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2adf0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
2ae00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
2ae10 54 53 35 20 2a 2f 0a                             TS5 */.