/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 985bfa5ab258918b34b4c44866ce9f9a0f2a6b0e:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 23 69 66  s5Int.h..*/..#if
0280: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
0290: 45 5f 46 54 53 35 0a 0a 23 69 6e 63 6c 75 64 65  E_FTS5..#include
02a0: 20 22 66 74 73 35 49 6e 74 2e 68 22 0a 0a 2f 2a   "fts5Int.h"../*
02b0: 0a 2a 2a 20 4f 76 65 72 76 69 65 77 3a 0a 2a 2a  .** Overview:.**
02c0: 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74  .** The %_data t
02d0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c  able contains al
02e0: 6c 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 65  l the FTS indexe
02f0: 73 20 66 6f 72 20 61 6e 20 46 54 53 35 20 76 69  s for an FTS5 vi
0300: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  rtual table..** 
0310: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  As well as the m
0320: 61 69 6e 20 74 65 72 6d 20 69 6e 64 65 78 2c 20  ain term index, 
0330: 74 68 65 72 65 20 6d 61 79 20 62 65 20 75 70 20  there may be up 
0340: 74 6f 20 33 31 20 70 72 65 66 69 78 20 69 6e 64  to 31 prefix ind
0350: 65 78 65 73 2e 0a 2a 2a 20 54 68 65 20 66 6f 72  exes..** The for
0360: 6d 61 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74  mat is similar t
0370: 6f 20 46 54 53 33 2f 34 2c 20 65 78 63 65 70 74  o FTS3/4, except
0380: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
0390: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d 74   all segment b-t
03a0: 72 65 65 20 6c 65 61 66 20 64 61 74 61 20 69 73  ree leaf data is
03b0: 20 73 74 6f 72 65 64 20 69 6e 20 66 69 78 65 64   stored in fixed
03c0: 20 73 69 7a 65 20 70 61 67 65 20 72 65 63 6f 72   size page recor
03d0: 64 73 20 0a 2a 2a 20 20 20 20 20 28 65 2e 67 2e  ds .**     (e.g.
03e0: 20 31 30 30 30 20 62 79 74 65 73 29 2e 20 41 20   1000 bytes). A 
03f0: 73 69 6e 67 6c 65 20 64 6f 63 6c 69 73 74 20 6d  single doclist m
0400: 61 79 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65  ay span multiple
0410: 20 70 61 67 65 73 2e 20 43 61 72 65 20 69 73 20   pages. Care is 
0420: 0a 2a 2a 20 20 20 20 20 74 61 6b 65 6e 20 74 6f  .**     taken to
0430: 20 65 6e 73 75 72 65 20 69 74 20 69 73 20 70 6f   ensure it is po
0440: 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72 61 74  ssible to iterat
0450: 65 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  e in either dire
0460: 63 74 69 6f 6e 20 74 68 72 6f 75 67 68 20 0a 2a  ction through .*
0470: 2a 20 20 20 20 20 74 68 65 20 65 6e 74 72 69 65  *     the entrie
0480: 73 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2c 20  s in a doclist, 
0490: 6f 72 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 20  or to seek to a 
04a0: 73 70 65 63 69 66 69 63 20 65 6e 74 72 79 20 77  specific entry w
04b0: 69 74 68 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20  ithin a .**     
04c0: 64 6f 63 6c 69 73 74 2c 20 77 69 74 68 6f 75 74  doclist, without
04d0: 20 6c 6f 61 64 69 6e 67 20 69 74 20 69 6e 74 6f   loading it into
04e0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
04f0: 20 2a 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74   * large doclist
0500: 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
0510: 20 70 61 67 65 73 20 68 61 76 65 20 61 73 73 6f   pages have asso
0520: 63 69 61 74 65 64 20 22 64 6f 63 6c 69 73 74 20  ciated "doclist 
0530: 69 6e 64 65 78 22 0a 2a 2a 20 20 20 20 20 72 65  index".**     re
0540: 63 6f 72 64 73 20 74 68 61 74 20 63 6f 6e 74 61  cords that conta
0550: 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  in a copy of the
0560: 20 66 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20   first docid on 
0570: 65 61 63 68 20 70 61 67 65 20 73 70 61 6e 6e 65  each page spanne
0580: 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20  d by.**     the 
0590: 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 20 69 73  doclist. This is
05a0: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
05b0: 70 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  p seek operation
05c0: 73 2c 20 61 6e 64 20 6d 65 72 67 65 73 20 6f 66  s, and merges of
05d0: 0a 2a 2a 20 20 20 20 20 6c 61 72 67 65 20 64 6f  .**     large do
05e0: 63 6c 69 73 74 73 20 77 69 74 68 20 76 65 72 79  clists with very
05f0: 20 73 6d 61 6c 6c 20 64 6f 63 6c 69 73 74 73 2e   small doclists.
0600: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 65 78 74 72 61  .**.**   * extra
0610: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 22   fields in the "
0620: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
0630: 22 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  " record the sta
0640: 74 65 20 6f 66 20 6f 6e 67 6f 69 6e 67 0a 2a 2a  te of ongoing.**
0650: 20 20 20 20 20 69 6e 63 72 65 6d 65 6e 74 61 6c       incremental
0660: 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
0670: 73 2e 0a 2a 2a 0a 2a 2f 0a 0a 0a 23 64 65 66 69  s..**.*/...#defi
0680: 6e 65 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b  ne FTS5_OPT_WORK
0690: 5f 55 4e 49 54 20 20 31 30 30 30 20 20 2f 2a 20  _UNIT  1000  /* 
06a0: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
06b0: 61 67 65 73 20 70 65 72 20 6f 70 74 69 6d 69 7a  ages per optimiz
06c0: 65 20 73 74 65 70 20 2a 2f 0a 23 64 65 66 69 6e  e step */.#defin
06d0: 65 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54  e FTS5_WORK_UNIT
06e0: 20 20 20 20 20 20 36 34 20 20 20 20 2f 2a 20 4e        64    /* N
06f0: 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
0700: 67 65 73 20 69 6e 20 75 6e 69 74 20 6f 66 20 77  ges in unit of w
0710: 6f 72 6b 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ork */..#define 
0720: 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
0730: 49 5a 45 20 34 20 20 20 20 20 2f 2a 20 41 64 64  IZE 4     /* Add
0740: 20 64 6c 69 64 78 20 69 66 20 74 68 69 73 20 6d   dlidx if this m
0750: 61 6e 79 20 65 6d 70 74 79 20 70 61 67 65 73 20  any empty pages 
0760: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
0770: 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 27 30 27  _MAIN_PREFIX '0'
0780: 0a 0a 23 69 66 20 46 54 53 35 5f 4d 41 58 5f 50  ..#if FTS5_MAX_P
0790: 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20 3e 20  REFIX_INDEXES > 
07a0: 33 31 0a 23 20 65 72 72 6f 72 20 22 46 54 53 35  31.# error "FTS5
07b0: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
07c0: 58 45 53 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  XES is too large
07d0: 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ".#endif../*.** 
07e0: 44 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 54  Details:.**.** T
07f0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
0800: 6d 61 6e 61 67 65 64 20 62 79 20 74 68 69 73 20  managed by this 
0810: 6d 6f 64 75 6c 65 2c 0a 2a 2a 0a 2a 2a 20 20 20  module,.**.**   
0820: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
0830: 5f 64 61 74 61 28 69 64 20 49 4e 54 45 47 45 52  _data(id INTEGER
0840: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c   PRIMARY KEY, bl
0850: 6f 63 6b 20 42 4c 4f 42 29 3b 0a 2a 2a 0a 2a 2a  ock BLOB);.**.**
0860: 20 2c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20   , contains the 
0870: 66 6f 6c 6c 6f 77 69 6e 67 20 35 20 74 79 70 65  following 5 type
0880: 73 20 6f 66 20 72 65 63 6f 72 64 73 2e 20 53 65  s of records. Se
0890: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 73  e the comments s
08a0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 74 68  urrounding.** th
08b0: 65 20 46 54 53 35 5f 2a 5f 52 4f 57 49 44 20 6d  e FTS5_*_ROWID m
08c0: 61 63 72 6f 73 20 62 65 6c 6f 77 20 66 6f 72 20  acros below for 
08d0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
08e0: 20 68 6f 77 20 25 5f 64 61 74 61 20 72 6f 77 69   how %_data rowi
08f0: 64 73 20 61 72 65 20 0a 2a 2a 20 61 73 73 69 67  ds are .** assig
0900: 6e 65 64 20 74 6f 20 65 61 63 68 20 66 6f 20 74  ned to each fo t
0910: 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 31 2e 20 53 74  hem..**.** 1. St
0920: 72 75 63 74 75 72 65 20 52 65 63 6f 72 64 73 3a  ructure Records:
0930: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 73 65 74  .**.**   The set
0940: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 68 61   of segments tha
0950: 74 20 6d 61 6b 65 20 75 70 20 61 6e 20 69 6e 64  t make up an ind
0960: 65 78 20 2d 20 74 68 65 20 69 6e 64 65 78 20 73  ex - the index s
0970: 74 72 75 63 74 75 72 65 20 2d 20 61 72 65 0a 2a  tructure - are.*
0980: 2a 20 20 20 72 65 63 6f 72 64 65 64 20 69 6e 20  *   recorded in 
0990: 61 20 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20  a single record 
09a0: 77 69 74 68 69 6e 20 74 68 65 20 25 5f 64 61 74  within the %_dat
09b0: 61 20 74 61 62 6c 65 2e 20 54 68 65 20 72 65 63  a table. The rec
09c0: 6f 72 64 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  ord consists.** 
09d0: 20 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 33 32    of a single 32
09e0: 2d 62 69 74 20 63 6f 6e 66 69 67 75 72 61 74 69  -bit configurati
09f0: 6f 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  on cookie value 
0a00: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 6c 69  followed by a li
0a10: 73 74 20 6f 66 20 0a 2a 2a 20 20 20 53 51 4c 69  st of .**   SQLi
0a20: 74 65 20 76 61 72 69 6e 74 73 2e 20 49 66 20 74  te varints. If t
0a30: 68 65 20 46 54 53 20 74 61 62 6c 65 20 66 65 61  he FTS table fea
0a40: 74 75 72 65 73 20 6d 6f 72 65 20 74 68 61 6e 20  tures more than 
0a50: 6f 6e 65 20 69 6e 64 65 78 20 28 62 65 63 61 75  one index (becau
0a60: 73 65 0a 2a 2a 20 20 20 74 68 65 72 65 20 61 72  se.**   there ar
0a70: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 70 72  e one or more pr
0a80: 65 66 69 78 20 69 6e 64 65 78 65 73 29 2c 20 69  efix indexes), i
0a90: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
0aa0: 74 68 61 74 20 61 6c 6c 20 73 68 61 72 65 0a 2a  that all share.*
0ab0: 2a 20 20 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  *   the same coo
0ac0: 6b 69 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  kie value..**.**
0ad0: 20 20 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 66     Immediately f
0ae0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6e  ollowing the con
0af0: 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69  figuration cooki
0b00: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 62 65  e, the record be
0b10: 67 69 6e 73 20 77 69 74 68 0a 2a 2a 20 20 20 74  gins with.**   t
0b20: 68 72 65 65 20 76 61 72 69 6e 74 73 3a 0a 2a 2a  hree varints:.**
0b30: 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d 62 65 72  .**     + number
0b40: 20 6f 66 20 6c 65 76 65 6c 73 2c 0a 2a 2a 20 20   of levels,.**  
0b50: 20 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65     + total numbe
0b60: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e  r of segments on
0b70: 20 61 6c 6c 20 6c 65 76 65 6c 73 2c 0a 2a 2a 20   all levels,.** 
0b80: 20 20 20 20 2b 20 76 61 6c 75 65 20 6f 66 20 77      + value of w
0b90: 72 69 74 65 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  rite counter..**
0ba0: 0a 2a 2a 20 20 20 54 68 65 6e 2c 20 66 6f 72 20  .**   Then, for 
0bb0: 65 61 63 68 20 6c 65 76 65 6c 20 66 72 6f 6d 20  each level from 
0bc0: 30 20 74 6f 20 6e 4d 61 78 3a 0a 2a 2a 0a 2a 2a  0 to nMax:.**.**
0bd0: 20 20 20 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66       + number of
0be0: 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
0bf0: 69 6e 20 6f 6e 67 6f 69 6e 67 20 6d 65 72 67 65  in ongoing merge
0c00: 2e 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ..**     + total
0c10: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0c20: 6e 74 73 20 69 6e 20 6c 65 76 65 6c 2e 0a 2a 2a  nts in level..**
0c30: 20 20 20 20 20 2b 20 66 6f 72 20 65 61 63 68 20       + for each 
0c40: 73 65 67 6d 65 6e 74 20 66 72 6f 6d 20 6f 6c 64  segment from old
0c50: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 3a 0a 2a  est to newest:.*
0c60: 2a 20 20 20 20 20 20 20 20 20 2b 20 73 65 67 6d  *         + segm
0c70: 65 6e 74 20 69 64 20 28 61 6c 77 61 79 73 20 3e  ent id (always >
0c80: 20 30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b   0).**         +
0c90: 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 20 28   b-tree height (
0ca0: 31 20 2d 3e 20 72 6f 6f 74 20 69 73 20 6c 65 61  1 -> root is lea
0cb0: 66 2c 20 32 20 2d 3e 20 72 6f 6f 74 20 69 73 20  f, 2 -> root is 
0cc0: 70 61 72 65 6e 74 20 6f 66 20 6c 65 61 66 20 65  parent of leaf e
0cd0: 74 63 2e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  tc.).**         
0ce0: 2b 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67  + first leaf pag
0cf0: 65 20 6e 75 6d 62 65 72 20 28 6f 66 74 65 6e 20  e number (often 
0d00: 31 2c 20 61 6c 77 61 79 73 20 67 72 65 61 74 65  1, always greate
0d10: 72 20 74 68 61 6e 20 30 29 0a 2a 2a 20 20 20 20  r than 0).**    
0d20: 20 20 20 20 20 2b 20 66 69 6e 61 6c 20 6c 65 61       + final lea
0d30: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a  f page number.**
0d40: 0a 2a 2a 20 32 2e 20 54 68 65 20 41 76 65 72 61  .** 2. The Avera
0d50: 67 65 73 20 52 65 63 6f 72 64 3a 0a 2a 2a 0a 2a  ges Record:.**.*
0d60: 2a 20 20 20 41 20 73 69 6e 67 6c 65 20 72 65 63  *   A single rec
0d70: 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65 20 25  ord within the %
0d80: 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 65  _data table. The
0d90: 20 64 61 74 61 20 69 73 20 61 20 6c 69 73 74 20   data is a list 
0da0: 6f 66 20 76 61 72 69 6e 74 73 2e 0a 2a 2a 20 20  of varints..**  
0db0: 20 54 68 65 20 66 69 72 73 74 20 76 61 6c 75 65   The first value
0dc0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
0dd0: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  f rows in the in
0de0: 64 65 78 2e 20 54 68 65 6e 2c 20 66 6f 72 20 65  dex. Then, for e
0df0: 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20  ach column.**   
0e00: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
0e10: 68 74 2c 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ht, the total nu
0e20: 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69  mber of tokens i
0e30: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  n the column for
0e40: 20 61 6c 6c 20 0a 2a 2a 20 20 20 72 6f 77 73 20   all .**   rows 
0e50: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
0e60: 0a 2a 2a 20 33 2e 20 53 65 67 6d 65 6e 74 20 6c  .** 3. Segment l
0e70: 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  eaves:.**.**   T
0e80: 45 52 4d 20 44 4f 43 4c 49 53 54 20 46 4f 52 4d  ERM DOCLIST FORM
0e90: 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4d 6f  AT:.**.**     Mo
0ea0: 73 74 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65  st of each segme
0eb0: 6e 74 20 6c 65 61 66 20 69 73 20 74 61 6b 65 6e  nt leaf is taken
0ec0: 20 75 70 20 62 79 20 74 65 72 6d 2f 64 6f 63 6c   up by term/docl
0ed0: 69 73 74 20 64 61 74 61 2e 20 54 68 65 20 0a 2a  ist data. The .*
0ee0: 2a 20 20 20 20 20 67 65 6e 65 72 61 6c 20 66 6f  *     general fo
0ef0: 72 6d 61 74 20 6f 66 20 74 68 65 20 74 65 72 6d  rmat of the term
0f00: 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 69 73  /doclist data is
0f10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
0f20: 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20 6f 66  varint : size of
0f30: 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a 20 20   first term.**  
0f40: 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20 20 20         blob:    
0f50: 66 69 72 73 74 20 74 65 72 6d 20 64 61 74 61 0a  first term data.
0f60: 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63 6c 69  **         docli
0f70: 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c 69 73  st: first doclis
0f80: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72  t.**         zer
0f90: 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20  o-or-more {.**  
0fa0: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
0fb0: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    number of byte
0fc0: 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68  s in common with
0fd0: 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 0a 2a   previous term.*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69  *           vari
0ff0: 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62  nt:  number of b
1000: 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d  ytes of new term
1010: 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a 2a 20   data (nNew).** 
1020: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20            blob: 
1030: 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20 6f 66     nNew bytes of
1040: 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 0a 2a   new term data.*
1050: 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f 63 6c  *           docl
1060: 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c 69 73  ist: next doclis
1070: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  t.**         }.*
1080: 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69 73 74  *.**     doclist
1090: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
10a0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10b0: 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 20 20  first rowid.**  
10c0: 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20         poslist: 
10d0: 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a 2a 2a  first poslist.**
10e0: 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72           zero-or
10f0: 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20  -more {.**      
1100: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 72 6f       varint:  ro
1110: 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77 61 79  wid delta (alway
1120: 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20 20 20  s > 0).**       
1130: 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e 65 78      poslist: nex
1140: 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20  t poslist.**    
1150: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
1160: 20 20 30 78 30 30 20 62 79 74 65 0a 2a 2a 0a 2a    0x00 byte.**.*
1170: 2a 20 20 20 20 20 70 6f 73 6c 69 73 74 20 66 6f  *     poslist fo
1180: 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rmat:.**.**     
1190: 20 20 20 20 76 61 72 69 6e 74 3a 20 73 69 7a 65      varint: size
11a0: 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62   of poslist in b
11b0: 79 74 65 73 20 6d 75 6c 74 69 70 6c 69 65 64 20  ytes multiplied 
11c0: 62 79 20 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64  by 2, not includ
11d0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
11e0: 20 20 20 20 20 20 20 74 68 69 73 20 66 69 65 6c         this fiel
11f0: 64 2e 20 50 6c 75 73 20 31 20 69 66 20 74 68 69  d. Plus 1 if thi
1200: 73 20 65 6e 74 72 79 20 63 61 72 72 69 65 73 20  s entry carries 
1210: 74 68 65 20 22 64 65 6c 65 74 65 22 20 66 6c 61  the "delete" fla
1220: 67 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  g..**         co
1230: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1240: 6f 72 20 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20  or column 0.**  
1250: 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d         zero-or-m
1260: 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ore {.**        
1270: 20 20 20 30 78 30 31 20 62 79 74 65 0a 2a 2a 20     0x01 byte.** 
1280: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
1290: 3a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  : column number 
12a0: 28 49 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  (I).**          
12b0: 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73   collist: collis
12c0: 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a  t for column I.*
12d0: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a  *         }.**.*
12e0: 2a 20 20 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f  *     collist fo
12f0: 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rmat:.**.**     
1300: 20 20 20 20 76 61 72 69 6e 74 3a 20 66 69 72 73      varint: firs
1310: 74 20 6f 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20  t offset + 2.** 
1320: 20 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d          zero-or-
1330: 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  more {.**       
1340: 20 20 20 20 76 61 72 69 6e 74 3a 20 6f 66 66 73      varint: offs
1350: 65 74 20 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20  et delta + 2.** 
1360: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20          }.**.** 
1370: 20 20 50 41 47 49 4e 41 54 49 4f 4e 0a 2a 2a 0a    PAGINATION.**.
1380: 2a 2a 20 20 20 20 20 54 68 65 20 66 6f 72 6d 61  **     The forma
1390: 74 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  t described abov
13a0: 65 20 69 73 20 6f 6e 6c 79 20 61 63 63 75 72 61  e is only accura
13b0: 74 65 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  te if the entire
13c0: 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 0a 2a 2a   term/doclist.**
13d0: 20 20 20 20 20 64 61 74 61 20 66 69 74 73 20 6f       data fits o
13e0: 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20  n a single leaf 
13f0: 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
1400: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20 74   not the case, t
1410: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 20 20 20  he format.**    
1420: 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 20 74   is changed in t
1430: 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20  wo ways:.**.**  
1440: 20 20 20 20 20 2b 20 69 66 20 74 68 65 20 66 69       + if the fi
1450: 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 61 20 70  rst rowid on a p
1460: 61 67 65 20 6f 63 63 75 72 73 20 62 65 66 6f 72  age occurs befor
1470: 65 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  e the first term
1480: 2c 20 69 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  , it.**         
1490: 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6c  is stored as a l
14a0: 69 74 65 72 61 6c 20 76 61 6c 75 65 3a 0a 2a 2a  iteral value:.**
14b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14c0: 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74 20 72  varint:  first r
14d0: 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  owid.**.**      
14e0: 20 2b 20 74 68 65 20 66 69 72 73 74 20 74 65 72   + the first ter
14f0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 69  m on each page i
1500: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
1510: 73 61 6d 65 20 77 61 79 20 61 73 20 74 68 65 0a  same way as the.
1520: 2a 2a 20 20 20 20 20 20 20 20 20 76 65 72 79 20  **         very 
1530: 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
1540: 65 20 73 65 67 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a  e segment:.**.**
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72               var
1560: 69 6e 74 20 3a 20 73 69 7a 65 20 6f 66 20 66 69  int : size of fi
1570: 72 73 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20  rst term.**     
1580: 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20 20          blob:   
1590: 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74 61   first term data
15a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 45 61 63 68 20  .**.**     Each 
15b0: 6c 65 61 66 20 70 61 67 65 20 62 65 67 69 6e 73  leaf page begins
15c0: 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   with:.**.**    
15d0: 20 20 20 2b 20 32 2d 62 79 74 65 20 75 6e 73 69     + 2-byte unsi
15e0: 67 6e 65 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  gned containing 
15f0: 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
1600: 72 6f 77 69 64 20 28 6f 72 20 30 29 2e 0a 2a 2a  rowid (or 0)..**
1610: 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74 65 20         + 2-byte 
1620: 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61 69 6e  unsigned contain
1630: 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20 66 69  ing offset to fi
1640: 72 73 74 20 74 65 72 6d 20 28 6f 72 20 30 29 2e  rst term (or 0).
1650: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 6c 6c 6f 77 65  .**.**   Followe
1660: 64 20 62 79 20 74 65 72 6d 2f 64 6f 63 6c 69 73  d by term/doclis
1670: 74 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 34 2e  t data..**.** 4.
1680: 20 53 65 67 6d 65 6e 74 20 69 6e 74 65 72 69 6f   Segment interio
1690: 72 20 6e 6f 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  r nodes:.**.**  
16a0: 20 54 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   The interior no
16b0: 64 65 73 20 74 75 72 6e 20 74 68 65 20 6c 69 73  des turn the lis
16c0: 74 20 6f 66 20 6c 65 61 76 65 73 20 69 6e 74 6f  t of leaves into
16d0: 20 61 20 62 2b 74 72 65 65 2e 20 0a 2a 2a 0a 2a   a b+tree. .**.*
16e0: 2a 20 20 20 45 61 63 68 20 69 6e 74 65 72 69 6f  *   Each interio
16f0: 72 20 6e 6f 64 65 20 62 65 67 69 6e 73 20 77 69  r node begins wi
1700: 74 68 20 61 20 76 61 72 69 6e 74 20 2d 20 74 68  th a varint - th
1710: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1720: 20 74 68 65 20 6c 65 66 74 0a 2a 2a 20 20 20 6d   the left.**   m
1730: 6f 73 74 20 63 68 69 6c 64 20 6e 6f 64 65 2e 20  ost child node. 
1740: 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 20  Following this, 
1750: 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70 61  for each leaf pa
1760: 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66 69  ge except the fi
1770: 72 73 74 2c 0a 2a 2a 20 20 20 74 68 65 20 69 6e  rst,.**   the in
1780: 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 63 6f 6e  terior nodes con
1790: 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tain:.**.**     
17a0: 61 29 20 49 66 20 74 68 65 20 6c 65 61 66 20 70  a) If the leaf p
17b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  age contains at 
17c0: 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20  least one term, 
17d0: 74 68 65 6e 20 61 20 74 65 72 6d 2d 70 72 65 66  then a term-pref
17e0: 69 78 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ix that.**      
17f0: 20 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61    is greater tha
1800: 6e 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 20 74  n all previous t
1810: 65 72 6d 73 2c 20 61 6e 64 20 6c 65 73 73 20 74  erms, and less t
1820: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1830: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 66 69  the.**        fi
1840: 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  rst term on the 
1850: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
1860: 20 20 20 20 20 62 29 20 49 66 20 74 68 65 20 6c       b) If the l
1870: 65 61 66 20 70 61 67 65 20 6e 6f 20 74 65 72 6d  eaf page no term
1880: 73 2c 20 61 20 72 65 63 6f 72 64 20 69 6e 64 69  s, a record indi
1890: 63 61 74 69 6e 67 20 68 6f 77 20 6d 61 6e 79 20  cating how many 
18a0: 63 6f 6e 73 65 63 75 74 69 76 65 0a 2a 2a 20 20  consecutive.**  
18b0: 20 20 20 20 20 20 6c 65 61 76 65 73 20 63 6f 6e        leaves con
18c0: 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2c 20 61  tain no terms, a
18d0: 6e 64 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  nd whether or no
18e0: 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 73  t there is an as
18f0: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 20 20 20 20  sociated.**     
1900: 20 20 20 62 79 2d 72 6f 77 69 64 20 69 6e 64 65     by-rowid inde
1910: 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  x record..**.** 
1920: 20 20 42 79 20 64 65 66 69 6e 69 74 69 6f 6e 2c    By definition,
1930: 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
1940: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 79  more than one ty
1950: 70 65 20 28 62 29 20 72 65 63 6f 72 64 20 69 6e  pe (b) record in
1960: 20 61 20 72 6f 77 2e 0a 2a 2a 20 20 20 54 79 70   a row..**   Typ
1970: 65 20 28 62 29 20 72 65 63 6f 72 64 73 20 6f 6e  e (b) records on
1980: 6c 79 20 65 76 65 72 20 61 70 70 65 61 72 20 6f  ly ever appear o
1990: 6e 20 68 65 69 67 68 74 3d 31 20 70 61 67 65 73  n height=1 pages
19a0: 20 2d 20 69 6d 6d 65 64 69 61 74 65 20 70 61 72   - immediate par
19b0: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 6c 65 61  ents.**   of lea
19c0: 76 65 73 2e 20 4f 6e 6c 79 20 74 79 70 65 20 28  ves. Only type (
19d0: 61 29 20 72 65 63 6f 72 64 73 20 61 72 65 20 70  a) records are p
19e0: 75 73 68 65 64 20 74 6f 20 68 69 67 68 65 72 20  ushed to higher 
19f0: 6c 65 76 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  levels..**.**   
1a00: 54 65 72 6d 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a  Term format:.**.
1a10: 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72 20  **     * Number 
1a20: 6f 66 20 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d  of bytes in comm
1a30: 6f 6e 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  on with previous
1a40: 20 74 65 72 6d 20 70 6c 75 73 20 32 2c 20 61 73   term plus 2, as
1a50: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20   a varint..**   
1a60: 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79    * Number of by
1a70: 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20  tes of new term 
1a80: 64 61 74 61 2c 20 61 73 20 61 20 76 61 72 69 6e  data, as a varin
1a90: 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 6e 65 77 20  t..**     * new 
1aa0: 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  term data..**.**
1ab0: 20 20 20 4e 6f 2d 74 65 72 6d 20 66 6f 72 6d 61     No-term forma
1ac0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 65  t:.**.**     * e
1ad0: 69 74 68 65 72 20 61 6e 20 30 78 30 30 20 6f 72  ither an 0x00 or
1ae0: 20 30 78 30 31 20 62 79 74 65 2e 20 49 66 20 74   0x01 byte. If t
1af0: 68 65 20 76 61 6c 75 65 20 30 78 30 31 20 69 73  he value 0x01 is
1b00: 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 72   used, then ther
1b10: 65 20 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  e .**       is a
1b20: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  n associated ind
1b30: 65 78 2d 62 79 2d 72 6f 77 69 64 20 72 65 63 6f  ex-by-rowid reco
1b40: 72 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65  rd..**     * the
1b50: 20 6e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 2d   number of zero-
1b60: 74 65 72 6d 20 6c 65 61 76 65 73 20 61 73 20 61  term leaves as a
1b70: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 35   varint..**.** 5
1b80: 2e 20 53 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73  . Segment doclis
1b90: 74 20 69 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a  t indexes:.**.**
1ba0: 20 20 20 44 6f 63 6c 69 73 74 20 69 6e 64 65 78     Doclist index
1bb0: 65 73 20 61 72 65 20 74 68 65 6d 73 65 6c 76 65  es are themselve
1bc0: 73 20 62 2d 74 72 65 65 73 2c 20 68 6f 77 65 76  s b-trees, howev
1bd0: 65 72 20 74 68 65 79 20 75 73 75 61 6c 6c 79 20  er they usually 
1be0: 63 6f 6e 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20  consist of.**   
1bf0: 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 72 65  a single leaf re
1c00: 63 6f 72 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66  cord only. The f
1c10: 6f 72 6d 61 74 20 6f 66 20 65 61 63 68 20 64 6f  ormat of each do
1c20: 63 6c 69 73 74 20 69 6e 64 65 78 20 6c 65 61 66  clist index leaf
1c30: 20 70 61 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a   page .**   is:.
1c40: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67  **.**     * Flag
1c50: 73 20 62 79 74 65 2e 20 42 69 74 73 20 61 72 65  s byte. Bits are
1c60: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30  :.**         0x0
1c70: 31 3a 20 43 6c 65 61 72 20 69 66 20 6c 65 61 66  1: Clear if leaf
1c80: 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f   is also the roo
1c90: 74 20 70 61 67 65 2c 20 6f 74 68 65 72 77 69 73  t page, otherwis
1ca0: 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  e set..**.**    
1cb0: 20 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f   * Page number o
1cc0: 66 20 66 74 73 20 69 6e 64 65 78 20 6c 65 61 66  f fts index leaf
1cd0: 20 70 61 67 65 2e 20 41 73 20 61 20 76 61 72 69   page. As a vari
1ce0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  nt..**.**     * 
1cf0: 46 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20 70  First docid on p
1d00: 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  age indicated by
1d10: 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c 64 2e   previous field.
1d20: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1d30: 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69 73 74  .**     * A list
1d40: 20 6f 66 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65   of varints, one
1d50: 20 66 6f 72 20 65 61 63 68 20 73 75 62 73 65 71   for each subseq
1d60: 75 65 6e 74 20 74 65 72 6d 6c 65 73 73 20 70 61  uent termless pa
1d70: 67 65 2e 20 41 20 0a 2a 2a 20 20 20 20 20 20 20  ge. A .**       
1d80: 70 6f 73 69 74 69 76 65 20 64 65 6c 74 61 20 69  positive delta i
1d90: 66 20 74 68 65 20 74 65 72 6d 6c 65 73 73 20 70  f the termless p
1da0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  age contains at 
1db0: 6c 65 61 73 74 20 6f 6e 65 20 64 6f 63 69 64 2c  least one docid,
1dc0: 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 61 6e   .**       or an
1dd0: 20 30 78 30 30 20 62 79 74 65 20 6f 74 68 65 72   0x00 byte other
1de0: 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  wise..**.**   In
1df0: 74 65 72 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69  ternal doclist i
1e00: 6e 64 65 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a  ndex nodes are:.
1e10: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67  **.**     * Flag
1e20: 73 20 62 79 74 65 2e 20 42 69 74 73 20 61 72 65  s byte. Bits are
1e30: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30  :.**         0x0
1e40: 31 3a 20 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f  1: Clear for roo
1e50: 74 20 70 61 67 65 2c 20 6f 74 68 65 72 77 69 73  t page, otherwis
1e60: 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  e set..**.**    
1e70: 20 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f   * Page number o
1e80: 66 20 66 69 72 73 74 20 63 68 69 6c 64 20 70 61  f first child pa
1e90: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1ea0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70  .**.**     * Cop
1eb0: 79 20 6f 66 20 66 69 72 73 74 20 64 6f 63 69 64  y of first docid
1ec0: 20 6f 6e 20 70 61 67 65 20 69 6e 64 69 63 61 74   on page indicat
1ed0: 65 64 20 62 79 20 70 72 65 76 69 6f 75 73 20 66  ed by previous f
1ee0: 69 65 6c 64 2e 20 41 73 20 61 20 76 61 72 69 6e  ield. As a varin
1ef0: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41  t..**.**     * A
1f00: 20 6c 69 73 74 20 6f 66 20 64 65 6c 74 61 2d 65   list of delta-e
1f10: 6e 63 6f 64 65 64 20 76 61 72 69 6e 74 73 20 2d  ncoded varints -
1f20: 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64   the first docid
1f30: 20 6f 6e 20 65 61 63 68 20 73 75 62 73 65 71 75   on each subsequ
1f40: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 63 68 69  ent.**       chi
1f50: 6c 64 20 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a  ld page. .**.*/.
1f60: 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f  ./*.** Rowids fo
1f70: 72 20 74 68 65 20 61 76 65 72 61 67 65 73 20 61  r the averages a
1f80: 6e 64 20 73 74 72 75 63 74 75 72 65 20 72 65 63  nd structure rec
1f90: 6f 72 64 73 20 69 6e 20 74 68 65 20 25 5f 64 61  ords in the %_da
1fa0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65  ta table..*/.#de
1fb0: 66 69 6e 65 20 46 54 53 35 5f 41 56 45 52 41 47  fine FTS5_AVERAG
1fc0: 45 53 5f 52 4f 57 49 44 20 20 20 20 20 31 20 20  ES_ROWID     1  
1fd0: 20 20 2f 2a 20 52 6f 77 69 64 20 75 73 65 64 20    /* Rowid used 
1fe0: 66 6f 72 20 74 68 65 20 61 76 65 72 61 67 65 73  for the averages
1ff0: 20 72 65 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69   record */.#defi
2000: 6e 65 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  ne FTS5_STRUCTUR
2010: 45 5f 52 4f 57 49 44 20 20 20 31 30 20 20 20 20  E_ROWID   10    
2020: 2f 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65  /* The structure
2030: 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a   record */../*.*
2040: 2a 20 4d 61 63 72 6f 73 20 64 65 74 65 72 6d 69  * Macros determi
2050: 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 73 20  ning the rowids 
2060: 75 73 65 64 20 62 79 20 73 65 67 6d 65 6e 74 20  used by segment 
2070: 6e 6f 64 65 73 2e 20 41 6c 6c 20 6e 6f 64 65 73  nodes. All nodes
2080: 20 69 6e 20 61 6c 6c 0a 2a 2a 20 73 65 67 6d 65   in all.** segme
2090: 6e 74 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 65  nts for all inde
20a0: 78 65 73 20 28 74 68 65 20 72 65 67 75 6c 61 72  xes (the regular
20b0: 20 46 54 53 20 69 6e 64 65 78 20 61 6e 64 20 61   FTS index and a
20c0: 6e 79 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  ny prefix indexe
20d0: 73 29 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  s).** are stored
20e0: 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74   in the %_data t
20f0: 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67 65 20  able with large 
2100: 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 73 2e  positive rowids.
2110: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74  .**.** The %_dat
2120: 61 20 74 61 62 6c 65 20 6d 61 79 20 63 6f 6e 74  a table may cont
2130: 61 69 6e 20 75 70 20 74 6f 20 28 31 3c 3c 46 54  ain up to (1<<FT
2140: 53 35 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58  S5_SEGMENT_INDEX
2150: 5f 42 49 54 53 29 20 0a 2a 2a 20 69 6e 64 65 78  _BITS) .** index
2160: 65 73 20 2d 20 6f 6e 65 20 72 65 67 75 6c 61 72  es - one regular
2170: 20 74 65 72 6d 20 69 6e 64 65 78 20 61 6e 64 20   term index and 
2180: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 72 65  zero or more pre
2190: 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a  fix indexes..**.
21a0: 2a 2a 20 45 61 63 68 20 73 65 67 6d 65 6e 74 20  ** Each segment 
21b0: 69 6e 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20  in an index has 
21c0: 61 20 75 6e 69 71 75 65 20 69 64 20 67 72 65 61  a unique id grea
21d0: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a  ter than zero..*
21e0: 2a 0a 2a 2a 20 45 61 63 68 20 6e 6f 64 65 20 69  *.** Each node i
21f0: 6e 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  n a segment b-tr
2200: 65 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61  ee is assigned a
2210: 20 22 70 61 67 65 20 6e 75 6d 62 65 72 22 20 74   "page number" t
2220: 68 61 74 20 69 73 20 75 6e 69 71 75 65 0a 2a 2a  hat is unique.**
2230: 20 77 69 74 68 69 6e 20 6e 6f 64 65 73 20 6f 66   within nodes of
2240: 20 69 74 73 20 68 65 69 67 68 74 20 77 69 74 68   its height with
2250: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 28  in the segment (
2260: 6c 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20  leaf nodes have 
2270: 61 20 68 65 69 67 68 74 20 0a 2a 2a 20 6f 66 20  a height .** of 
2280: 30 2c 20 70 61 72 65 6e 74 73 20 31 2c 20 65 74  0, parents 1, et
2290: 63 2e 29 2e 20 50 61 67 65 20 6e 75 6d 62 65 72  c.). Page number
22a0: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
22b0: 73 65 71 75 65 6e 74 69 61 6c 6c 79 20 73 6f 20  sequentially so 
22c0: 74 68 61 74 0a 2a 2a 20 61 20 6e 6f 64 65 73 20  that.** a nodes 
22d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 61  page number is a
22e0: 6c 77 61 79 73 20 6f 6e 65 20 6d 6f 72 65 20 74  lways one more t
22f0: 68 61 6e 20 69 74 73 20 6c 65 66 74 20 73 69 62  han its left sib
2300: 6c 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ling..**.** The 
2310: 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 64 65  rowid for a node
2320: 20 69 73 20 74 68 65 6e 20 66 6f 75 6e 64 20 75   is then found u
2330: 73 69 6e 67 20 74 68 65 20 46 54 53 35 5f 53 45  sing the FTS5_SE
2340: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 6d 61  GMENT_ROWID() ma
2350: 63 72 6f 0a 2a 2a 20 62 65 6c 6f 77 2e 20 54 68  cro.** below. Th
2360: 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 2a  e FTS5_SEGMENT_*
2370: 5f 42 49 54 53 20 6d 61 63 72 6f 73 20 64 65 66  _BITS macros def
2380: 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
2390: 66 20 62 69 74 73 20 75 73 65 64 0a 2a 2a 20 74  f bits used.** t
23a0: 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 74 68 72  o encode the thr
23b0: 65 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ee FTS5_SEGMENT_
23c0: 52 4f 57 49 44 28 29 20 61 72 67 75 6d 65 6e 74  ROWID() argument
23d0: 73 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 72  s. This module r
23e0: 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
23f0: 5f 46 55 4c 4c 20 61 6e 64 20 66 61 69 6c 73 20  _FULL and fails 
2400: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65 72  the current oper
2410: 61 74 69 6f 6e 20 69 66 20 74 68 65 79 20 65 76  ation if they ev
2420: 65 72 20 70 72 6f 76 65 20 74 6f 6f 20 73 6d 61  er prove too sma
2430: 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ll..*/.#define F
2440: 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 20 20  TS5_DATA_ID_B   
2450: 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61 78 20    16     /* Max 
2460: 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20 36 35  seg id number 65
2470: 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  535 */.#define F
2480: 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 20 20  TS5_DATA_DLI_B  
2490: 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f 63 6c     1     /* Docl
24a0: 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67 20 28  ist-index flag (
24b0: 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66 69 6e  1 bit) */.#defin
24c0: 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  e FTS5_DATA_HEIG
24d0: 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a 20 4d  HT_B  5     /* M
24e0: 61 78 20 62 2d 74 72 65 65 20 68 65 69 67 68 74  ax b-tree height
24f0: 20 6f 66 20 33 32 20 2a 2f 0a 23 64 65 66 69 6e   of 32 */.#defin
2500: 65 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  e FTS5_DATA_PAGE
2510: 5f 42 20 20 20 33 31 20 20 20 20 20 2f 2a 20 4d  _B   31     /* M
2520: 61 78 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ax page number o
2530: 66 20 32 31 34 37 34 38 33 36 34 38 20 2a 2f 0a  f 2147483648 */.
2540: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 5f 64 72  .#define fts5_dr
2550: 69 28 73 65 67 69 64 2c 20 64 6c 69 64 78 2c 20  i(segid, dlidx, 
2560: 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 28 20  height, pgno) ( 
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 5c 0a 20 28 28 69 36 34 29 28 73 65 67 69 64 29  \. ((i64)(segid)
25a0: 20 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f    << (FTS5_DATA_
25b0: 50 41 47 45 5f 42 2b 46 54 53 35 5f 44 41 54 41  PAGE_B+FTS5_DATA
25c0: 5f 48 45 49 47 48 54 5f 42 2b 46 54 53 35 5f 44  _HEIGHT_B+FTS5_D
25d0: 41 54 41 5f 44 4c 49 5f 42 29 29 20 2b 20 20 20  ATA_DLI_B)) +   
25e0: 20 5c 0a 20 28 28 69 36 34 29 28 64 6c 69 64 78   \. ((i64)(dlidx
25f0: 29 20 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41  )  << (FTS5_DATA
2600: 5f 50 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44  _PAGE_B + FTS5_D
2610: 41 54 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b  ATA_HEIGHT_B)) +
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 5c 0a 20 28 28 69 36 34 29 28 68 65 69 67    \. ((i64)(heig
2640: 68 74 29 20 3c 3c 20 28 46 54 53 35 5f 44 41 54  ht) << (FTS5_DAT
2650: 41 5f 50 41 47 45 5f 42 29 29 20 2b 20 20 20 20  A_PAGE_B)) +    
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 20 5c 0a 20 28 28 69 36 34 29 28 70 67 6e     \. ((i64)(pgn
2690: 6f 29 29 20 20 20 20 20 20 20 20 20 20 20 20 20  o))             
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 5c 0a 29 0a 0a 23 64 65 66 69 6e 65      \.)..#define
26e0: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
26f0: 57 49 44 28 73 65 67 69 64 2c 20 68 65 69 67 68  WID(segid, heigh
2700: 74 2c 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72  t, pgno) fts5_dr
2710: 69 28 73 65 67 69 64 2c 20 30 2c 20 68 65 69 67  i(segid, 0, heig
2720: 68 74 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e  ht, pgno).#defin
2730: 65 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57  e FTS5_DLIDX_ROW
2740: 49 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74  ID(segid, height
2750: 2c 20 70 67 6e 6f 29 20 20 20 66 74 73 35 5f 64  , pgno)   fts5_d
2760: 72 69 28 73 65 67 69 64 2c 20 31 2c 20 68 65 69  ri(segid, 1, hei
2770: 67 68 74 2c 20 70 67 6e 6f 29 0a 0a 23 69 66 20  ght, pgno)..#if 
2780: 30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 69 67  0./*.** The heig
2790: 68 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d  ht of segment b-
27a0: 74 72 65 65 73 20 69 73 20 61 63 74 75 61 6c 6c  trees is actuall
27b0: 79 20 6c 69 6d 69 74 65 64 20 74 6f 20 6f 6e 65  y limited to one
27c0: 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 28   less than .** (
27d0: 31 3c 3c 48 45 49 47 48 54 5f 42 49 54 53 29 2e  1<<HEIGHT_BITS).
27e0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
27f0: 20 74 68 65 20 72 6f 77 69 64 20 61 64 64 72 65   the rowid addre
2800: 73 73 20 73 70 61 63 65 20 66 6f 72 20 6e 6f 64  ss space for nod
2810: 65 73 0a 2a 2a 20 77 69 74 68 20 73 75 63 68 20  es.** with such 
2820: 61 20 68 65 69 67 68 74 20 69 73 20 75 73 65 64  a height is used
2830: 20 62 79 20 64 6f 63 6c 69 73 74 20 69 6e 64 65   by doclist inde
2840: 78 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  xes..*/.#define 
2850: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58  FTS5_SEGMENT_MAX
2860: 5f 48 45 49 47 48 54 20 28 28 31 20 3c 3c 20 46  _HEIGHT ((1 << F
2870: 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
2880: 42 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  B)-1).#endif../*
2890: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 65 67 6d  .** Maximum segm
28a0: 65 6e 74 73 20 70 65 72 6d 69 74 74 65 64 20 69  ents permitted i
28b0: 6e 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  n a single index
28c0: 20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53   .*/.#define FTS
28d0: 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 32 30  5_MAX_SEGMENT 20
28e0: 30 30 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  00..#if 0./*.** 
28f0: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
2900: 65 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  e doclist index 
2910: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2920: 6c 65 61 66 20 70 61 67 65 20 70 67 6e 6f 20 6f  leaf page pgno o
2930: 66 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 73 65 67  f segment.** seg
2940: 69 64 20 69 6e 20 69 6e 64 65 78 20 69 64 78 2e  id in index idx.
2950: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .*/.#define FTS5
2960: 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57  _DOCLIST_IDX_ROW
2970: 49 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74  ID(segid, height
2980: 2c 20 70 67 6e 6f 29 20 5c 0a 20 20 20 20 20 20  , pgno) \.      
2990: 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52    FTS5_SEGMENT_R
29a0: 4f 57 49 44 28 73 65 67 69 64 2c 20 46 54 53 35  OWID(segid, FTS5
29b0: 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49  _SEGMENT_MAX_HEI
29c0: 47 48 54 2c 20 70 67 6e 6f 29 0a 23 65 6e 64 69  GHT, pgno).#endi
29d0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
29e0: 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
29f0: 65 33 46 74 73 35 43 6f 72 72 75 70 74 28 29 20  e3Fts5Corrupt() 
2a00: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
2a10: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 20 7d 0a  CORRUPT_VTAB; }.
2a20: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45  #endif.../*.** E
2a30: 61 63 68 20 74 69 6d 65 20 61 20 62 6c 6f 62 20  ach time a blob 
2a40: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
2a50: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 69   %_data table, i
2a60: 74 20 69 73 20 70 61 64 64 65 64 20 77 69 74 68  t is padded with
2a70: 20 74 68 69 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65   this.** many ze
2a80: 72 6f 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  ro bytes. This m
2a90: 61 6b 65 73 20 69 74 20 65 61 73 69 65 72 20 74  akes it easier t
2aa0: 6f 20 64 65 63 6f 64 65 20 74 68 65 20 76 61 72  o decode the var
2ab0: 69 6f 75 73 20 72 65 63 6f 72 64 20 66 6f 72 6d  ious record form
2ac0: 61 74 73 0a 2a 2a 20 77 69 74 68 6f 75 74 20 6f  ats.** without o
2ad0: 76 65 72 72 65 61 64 69 6e 67 20 69 66 20 74 68  verreading if th
2ae0: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 63 6f  e records are co
2af0: 72 72 75 70 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  rrupt..*/.#defin
2b00: 65 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  e FTS5_DATA_ZERO
2b10: 5f 50 41 44 44 49 4e 47 20 38 0a 0a 74 79 70 65  _PADDING 8..type
2b20: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 42  def struct Fts5B
2b30: 74 72 65 65 49 74 65 72 20 46 74 73 35 42 74 72  treeIter Fts5Btr
2b40: 65 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  eeIter;.typedef 
2b50: 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65  struct Fts5Btree
2b60: 49 74 65 72 4c 65 76 65 6c 20 46 74 73 35 42 74  IterLevel Fts5Bt
2b70: 72 65 65 49 74 65 72 4c 65 76 65 6c 3b 0a 74 79  reeIterLevel;.ty
2b80: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2b90: 35 43 68 75 6e 6b 49 74 65 72 20 46 74 73 35 43  5ChunkIter Fts5C
2ba0: 68 75 6e 6b 49 74 65 72 3b 0a 74 79 70 65 64 65  hunkIter;.typede
2bb0: 66 20 73 74 72 75 63 74 20 46 74 73 35 44 61 74  f struct Fts5Dat
2bc0: 61 20 46 74 73 35 44 61 74 61 3b 0a 74 79 70 65  a Fts5Data;.type
2bd0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2be0: 6c 69 64 78 49 74 65 72 20 46 74 73 35 44 6c 69  lidxIter Fts5Dli
2bf0: 64 78 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  dxIter;.typedef 
2c00: 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78  struct Fts5Dlidx
2c10: 4c 76 6c 20 46 74 73 35 44 6c 69 64 78 4c 76 6c  Lvl Fts5DlidxLvl
2c20: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2c30: 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
2c40: 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
2c50: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2c60: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
2c70: 72 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  r Fts5MultiSegIt
2c80: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2c90: 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20  ct Fts5NodeIter 
2ca0: 46 74 73 35 4e 6f 64 65 49 74 65 72 3b 0a 74 79  Fts5NodeIter;.ty
2cb0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2cc0: 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35  5PageWriter Fts5
2cd0: 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65  PageWriter;.type
2ce0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50  def struct Fts5P
2cf0: 6f 73 49 74 65 72 20 46 74 73 35 50 6f 73 49 74  osIter Fts5PosIt
2d00: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2d10: 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20 46  ct Fts5SegIter F
2d20: 74 73 35 53 65 67 49 74 65 72 3b 0a 74 79 70 65  ts5SegIter;.type
2d30: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2d40: 6f 63 6c 69 73 74 49 74 65 72 20 46 74 73 35 44  oclistIter Fts5D
2d50: 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74 79 70 65  oclistIter;.type
2d60: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2d70: 65 67 57 72 69 74 65 72 20 46 74 73 35 53 65 67  egWriter Fts5Seg
2d80: 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20  Writer;.typedef 
2d90: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2da0: 74 75 72 65 20 46 74 73 35 53 74 72 75 63 74 75  ture Fts5Structu
2db0: 72 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  re;.typedef stru
2dc0: 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ct Fts5Structure
2dd0: 4c 65 76 65 6c 20 46 74 73 35 53 74 72 75 63 74  Level Fts5Struct
2de0: 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ureLevel;.typede
2df0: 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74 72  f struct Fts5Str
2e00: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 46 74  uctureSegment Ft
2e10: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2e20: 6e 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  nt;..struct Fts5
2e30: 44 61 74 61 20 7b 0a 20 20 75 38 20 2a 70 3b 20  Data {.  u8 *p; 
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2e60: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
2e70: 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f 72 64 20  ntaining record 
2e80: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2eb0: 72 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73 20  record in bytes 
2ec0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 2f 2a 20 52 65 66 20 63 6f 75 6e       /* Ref coun
2ef0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  t */.};../*.** O
2f00: 6e 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f  ne object per %_
2f10: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  data table..*/.s
2f20: 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20  truct Fts5Index 
2f30: 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
2f40: 70 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20  pConfig;        
2f50: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
2f60: 61 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69  able configurati
2f70: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  on */.  char *zD
2f80: 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20  ataTbl;         
2f90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2fa0: 6f 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  of %_data table 
2fb0: 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e  */.  int nWorkUn
2fc0: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
2fd0: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67       /* Leaf pag
2fe0: 65 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f  es in a "unit" o
2ff0: 66 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a  f work */..  /*.
3000: 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72    ** Variables r
3010: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63  elated to the ac
3020: 63 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f  cumulation of to
3030: 6b 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74  kens and doclist
3040: 73 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a  s within the.  *
3050: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  * in-memory hash
3060: 20 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74   tables before t
3070: 68 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20  hey are flushed 
3080: 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  to disk..  */.  
3090: 46 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b  Fts5Hash *pHash;
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
30c0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
30d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65   */.  int nMaxPe
30e0: 6e 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20 20  ndingData;      
30f0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e        /* Max pen
3100: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
3110: 20 66 6c 75 73 68 20 74 6f 20 64 69 73 6b 20 2a   flush to disk *
3120: 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67  /.  int nPending
3130: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
3140: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62      /* Current b
3150: 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20  ytes of pending 
3160: 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57  data */.  i64 iW
3170: 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20  riteRowid;      
3180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
3190: 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64  id for current d
31a0: 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  oc being written
31b0: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
31c0: 20 73 63 72 61 74 63 68 3b 0a 0a 20 20 2f 2a 20   scratch;..  /* 
31d0: 45 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  Error state. */.
31e0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 72 72    /* Current err
3210: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  or code */..  /*
3220: 20 53 74 61 74 65 20 75 73 65 64 20 62 79 20 74   State used by t
3230: 68 65 20 66 74 73 35 44 61 74 61 58 58 58 28 29  he fts5DataXXX()
3240: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20   functions. */. 
3250: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
3260: 52 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20  Reader;         
3270: 20 2f 2a 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62   /* RO incr-blob
3280: 20 6f 70 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20   open on %_data 
3290: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
32a0: 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 72  e3_stmt *pWriter
32b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 49  ;          /* "I
32c0: 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61  NSERT ... %_data
32d0: 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f   VALUES(?,?)" */
32e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
32f0: 2a 70 44 65 6c 65 74 65 72 3b 20 20 20 20 20 20  *pDeleter;      
3300: 20 20 20 2f 2a 20 22 44 45 4c 45 54 45 20 46 52     /* "DELETE FR
3310: 4f 4d 20 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64  OM %_data ... id
3320: 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a  >=? AND id<=?" *
3330: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  /.  int nRead;  
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
3360: 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65  ber of blocks re
3370: 61 64 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  ad */.};..struct
3380: 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
3390: 20 7b 0a 20 20 69 6e 74 20 62 44 65 73 63 3b 20   {.  int bDesc; 
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
33c0: 20 44 45 53 43 20 6f 72 64 65 72 2c 20 66 61 6c   DESC order, fal
33d0: 73 65 20 66 6f 72 20 41 53 43 20 2a 2f 0a 20 20  se for ASC */.  
33e0: 75 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a  u8 *a;.  int n;.
33f0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4f    int i;..  /* O
3400: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e  utput variables.
3410: 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74 20   aPoslist==0 at 
3420: 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  EOF */.  i64 iRo
3430: 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73 6c  wid;.  u8 *aPosl
3440: 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73 6c  ist;.  int nPosl
3450: 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  ist;.};../*.** E
3460: 61 63 68 20 69 74 65 72 61 74 6f 72 20 75 73 65  ach iterator use
3470: 64 20 62 79 20 65 78 74 65 72 6e 61 6c 20 6d 6f  d by external mo
3480: 64 75 6c 65 73 20 69 73 20 61 6e 20 69 6e 73 74  dules is an inst
3490: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70  ance of this typ
34a0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  e..*/.struct Fts
34b0: 35 49 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 46  5IndexIter {.  F
34c0: 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  ts5Index *pIndex
34d0: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
34e0: 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74  e *pStruct;.  Ft
34f0: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
3500: 70 4d 75 6c 74 69 3b 0a 20 20 46 74 73 35 44 6f  pMulti;.  Fts5Do
3510: 63 6c 69 73 74 49 74 65 72 20 2a 70 44 6f 63 6c  clistIter *pDocl
3520: 69 73 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65  ist;.  Fts5Buffe
3530: 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20 20  r poslist;      
3540: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
3550: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72   containing curr
3560: 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 7d  ent poslist */.}
3570: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  ;../*.** The con
3580: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 22 73 74  tents of the "st
3590: 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20  ructure" record 
35a0: 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 61  for each index a
35b0: 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a 2a  re represented.*
35c0: 2a 20 75 73 69 6e 67 20 61 6e 20 46 74 73 35 53  * using an Fts5S
35d0: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20  tructure record 
35e0: 69 6e 20 6d 65 6d 6f 72 79 2e 20 57 68 69 63 68  in memory. Which
35f0: 20 75 73 65 73 20 69 6e 73 74 61 6e 63 65 73 20   uses instances 
3600: 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 74 68 65 72  of the .** other
3610: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 58 58   Fts5StructureXX
3620: 58 20 74 79 70 65 73 20 61 73 20 63 6f 6d 70 6f  X types as compo
3630: 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  nents..*/.struct
3640: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
3650: 67 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20 69 53  gment {.  int iS
3660: 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  egid;           
3670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
3680: 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74  ment id */.  int
3690: 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20   nHeight;       
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36b0: 48 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e  Height of segmen
36c0: 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e  t b-tree */.  in
36d0: 74 20 70 67 6e 6f 46 69 72 73 74 3b 20 20 20 20  t pgnoFirst;    
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36f0: 20 46 69 72 73 74 20 6c 65 61 66 20 70 61 67 65   First leaf page
3700: 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
3710: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f  nt */.  int pgno
3720: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
3730: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
3740: 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
3750: 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d   in segment */.}
3760: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  ;.struct Fts5Str
3770: 75 63 74 75 72 65 4c 65 76 65 6c 20 7b 0a 20 20  uctureLevel {.  
3780: 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20 20 20 20  int nMerge;     
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
37b0: 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72 2d 6d 65  ments in incr-me
37c0: 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  rge */.  int nSe
37d0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
37e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
37f0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
3800: 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f  ents on level */
3810: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3820: 53 65 67 6d 65 6e 74 20 2a 61 53 65 67 3b 20 20  Segment *aSeg;  
3830: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
3840: 65 67 6d 65 6e 74 73 2e 20 61 53 65 67 5b 30 5d  egments. aSeg[0]
3850: 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d   is oldest. */.}
3860: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  ;.struct Fts5Str
3870: 75 63 74 75 72 65 20 7b 0a 20 20 75 36 34 20 6e  ucture {.  u64 n
3880: 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20 20 20  WriteCounter;   
3890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
38a0: 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69 74 74  tal leaves writt
38b0: 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f  en to level 0 */
38c0: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b  .  int nSegment;
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65 67 6d     /* Total segm
38f0: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73 74 72  ents in this str
3900: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
3910: 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  nLevel;         
3920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3930: 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20  umber of levels 
3940: 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  in this index */
3950: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3960: 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 30 5d 3b  Level aLevel[0];
3970: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6e     /* Array of n
3980: 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62 6a 65  Level level obje
3990: 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  cts */.};../*.**
39a0: 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 79   An object of ty
39b0: 70 65 20 46 74 73 35 53 65 67 57 72 69 74 65 72  pe Fts5SegWriter
39c0: 20 69 73 20 75 73 65 64 20 74 6f 20 77 72 69 74   is used to writ
39d0: 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  e to segments..*
39e0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 61 67  /.struct Fts5Pag
39f0: 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  eWriter {.  int 
3a00: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3a20: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
3a30: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 46 74  his page */.  Ft
3a40: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a60: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3a70: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
3a80: 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
3a90: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
3aa0: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
3ab0: 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73 20  aining previous 
3ac0: 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  term on page */.
3ad0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c  };.struct Fts5Dl
3ae0: 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20 69 6e  idxWriter {.  in
3af0: 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  t pgno;         
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b10: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
3b20: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
3b30: 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64 3b 20  int bPrevValid; 
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b50: 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72 65 76  /* True if iPrev
3b60: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69   is valid */.  i
3b70: 36 34 20 69 50 72 65 76 3b 20 20 20 20 20 20 20  64 iPrev;       
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b90: 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64  * Previous docid
3ba0: 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74   value written t
3bb0: 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74 73 35  o page */.  Fts5
3bc0: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3be0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3bf0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b   page data */.};
3c00: 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67 57  .struct Fts5SegW
3c10: 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 69 53  riter {.  int iS
3c20: 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  egid;           
3c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
3c40: 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  id to write to *
3c50: 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 72 3b  /.  int nWriter;
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3c80: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 57 72 69   entries in aWri
3c90: 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 50 61 67  ter */.  Fts5Pag
3ca0: 65 57 72 69 74 65 72 20 2a 61 57 72 69 74 65 72  eWriter *aWriter
3cb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  ;        /* Arra
3cc0: 79 20 6f 66 20 50 61 67 65 57 72 69 74 65 72 20  y of PageWriter 
3cd0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 36 34  objects */.  i64
3ce0: 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20 20 20   iPrevRowid;    
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d00: 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 77  Previous docid w
3d10: 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72 65 6e  ritten to curren
3d20: 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38 20 62  t leaf */.  u8 b
3d30: 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
3d40: 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ist;        /* T
3d50: 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69  rue if next rowi
3d60: 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 64 6f  d is first in do
3d70: 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62 46  clist */.  u8 bF
3d80: 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3b  irstRowidInPage;
3d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3da0: 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69 64  ue if next rowid
3db0: 20 69 73 20 66 69 72 73 74 20 69 6e 20 70 61 67   is first in pag
3dc0: 65 20 2a 2f 0a 20 20 75 38 20 62 46 69 72 73 74  e */.  u8 bFirst
3dd0: 54 65 72 6d 49 6e 50 61 67 65 3b 20 20 20 20 20  TermInPage;     
3de0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3df0: 66 20 6e 65 78 74 20 74 65 72 6d 20 77 69 6c 6c  f next term will
3e00: 20 62 65 20 66 69 72 73 74 20 69 6e 20 6c 65 61   be first in lea
3e10: 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  f */.  int nLeaf
3e20: 57 72 69 74 74 65 6e 3b 20 20 20 20 20 20 20 20  Written;        
3e30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3e40: 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 77   of leaf pages w
3e50: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
3e60: 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20  nEmpty;         
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3e80: 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74 69 67 75  umber of contigu
3e90: 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f  ous term-less no
3ea0: 64 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 44  des */..  int nD
3eb0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  lidx;           
3ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
3ed0: 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
3ee0: 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 2a 2f  Dlidx[] array */
3ef0: 0a 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74  .  Fts5DlidxWrit
3f00: 65 72 20 2a 61 44 6c 69 64 78 3b 20 20 20 20 20  er *aDlidx;     
3f10: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 46     /* Array of F
3f20: 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 6f  ts5DlidxWriter o
3f30: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
3f40: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
3f50: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
3f60: 20 74 68 65 20 6d 65 72 67 65 64 20 72 65 73 75   the merged resu
3f70: 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f  lts of one or mo
3f80: 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20  re segments,.** 
3f90: 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65  visiting each te
3fa0: 72 6d 2f 64 6f 63 69 64 20 70 61 69 72 20 69 6e  rm/docid pair in
3fb0: 20 74 68 65 20 6d 65 72 67 65 64 20 64 61 74 61   the merged data
3fc0: 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20  ..**.** nSeg is 
3fd0: 61 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20 6f  always a power o
3fe0: 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68  f two greater th
3ff0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
4000: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
4010: 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74 68  segments that th
4020: 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65 72  is object is mer
4030: 67 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e 20  ging data from. 
4040: 42 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d 20  Both the aSeg[] 
4050: 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20  and.** aFirst[] 
4060: 61 72 72 61 79 73 20 61 72 65 20 73 69 7a 65 64  arrays are sized
4070: 20 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65 73   at nSeg entries
4080: 2e 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72 72  . The aSeg[] arr
4090: 61 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a 20  ay is padded.** 
40a0: 77 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65  with zeroed obje
40b0: 63 74 73 20 2d 20 74 68 65 73 65 20 61 72 65 20  cts - these are 
40c0: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74 68  handled as if th
40d0: 65 79 20 77 65 72 65 20 69 74 65 72 61 74 6f 72  ey were iterator
40e0: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65  s opened.** on e
40f0: 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  mpty segments..*
4100: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
4110: 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73 65   of comparing se
4120: 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61  gments aSeg[N] a
4130: 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68  nd aSeg[N+1], wh
4140: 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65  ere N is an.** e
4150: 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20 73  ven number, is s
4160: 74 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74 5b  tored in aFirst[
4170: 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65  (nSeg+N)/2]. The
4180: 20 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68 65   "result" of the
4190: 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20   .** comparison 
41a0: 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20  in this context 
41b0: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
41c0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61  the iterator tha
41d0: 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
41e0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61  oints to the sma
41f0: 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64 20  ller term/rowid 
4200: 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65  combination. Ite
4210: 72 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61 72  rators at EOF ar
4220: 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  e.** considered 
4230: 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68  to be greater th
4240: 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74 65  an all other ite
4250: 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46  rators..**.** aF
4260: 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73  irst[1] contains
4270: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61 53   the index in aS
4280: 65 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65 72  eg[] of the iter
4290: 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ator that points
42a0: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c   to.** the small
42b0: 65 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e  est key overall.
42c0: 20 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75 6e   aFirst[0] is un
42d0: 75 73 65 64 2e 20 0a 2a 2f 0a 0a 74 79 70 65 64  used. .*/..typed
42e0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43 52  ef struct Fts5CR
42f0: 65 73 75 6c 74 20 46 74 73 35 43 52 65 73 75 6c  esult Fts5CResul
4300: 74 3b 0a 73 74 72 75 63 74 20 46 74 73 35 43 52  t;.struct Fts5CR
4310: 65 73 75 6c 74 20 7b 0a 20 20 75 31 36 20 69 46  esult {.  u16 iF
4320: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
4330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 65            /* aSe
4340: 67 5b 5d 20 69 6e 64 65 78 20 6f 66 20 66 69 72  g[] index of fir
4350: 73 74 65 73 74 20 69 74 65 72 61 74 6f 72 20 2a  stest iterator *
4360: 2f 0a 20 20 75 38 20 62 54 65 72 6d 45 71 3b 20  /.  u8 bTermEq; 
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4380: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4390: 68 65 20 74 65 72 6d 73 20 61 72 65 20 65 71 75  he terms are equ
43a0: 61 6c 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  al */.};..struct
43b0: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
43c0: 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20  r {.  int nSeg; 
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
43f0: 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f   aSeg[] array */
4400: 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74     /* True to it
4430: 65 72 61 74 65 20 69 6e 20 72 65 76 65 72 73 65  erate in reverse
4440: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20   order */.  int 
4450: 62 53 6b 69 70 45 6d 70 74 79 3b 20 20 20 20 20  bSkipEmpty;     
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4470: 72 75 65 20 74 6f 20 73 6b 69 70 20 64 65 6c 65  rue to skip dele
4480: 74 65 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20  ted entries */. 
4490: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 61 53   Fts5SegIter *aS
44a0: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
44b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67   /* Array of seg
44c0: 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a  ment iterators *
44d0: 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  /.  Fts5CResult 
44e0: 2a 61 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *aFirst;        
44f0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d      /* Current m
4500: 65 72 67 65 20 73 74 61 74 65 20 28 73 65 65 20  erge state (see 
4510: 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  above) */.};../*
4520: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
4530: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
4540: 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
4550: 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63 68  t, visiting each
4560: 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a 20 70   term/docid.** p
4570: 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d 65  air in the segme
4580: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a  nt..**.** pSeg:.
4590: 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e 74  **   The segment
45a0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
45b0: 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ugh..**.** iLeaf
45c0: 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65  Pgno:.**   Curre
45d0: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
45e0: 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d 65  ber within segme
45f0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f  nt..**.** iLeafO
4600: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65  ffset:.**   Byte
4610: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74   offset within t
4620: 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
4630: 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72 73  that is the firs
4640: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
4650: 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  *   position lis
4660: 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74 65  t data (one byte
4670: 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73 69   passed the posi
4680: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
4690: 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77 69  ield)..**   rowi
46a0: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  d field of the c
46b0: 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73  urrent entry. Us
46c0: 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68  ually this is th
46d0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e size field of 
46e0: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
46f0: 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65  n list data. The
4700: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
4710: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
4720: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
4730: 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61   .**   is the la
4740: 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20  st thing on the 
4750: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
4760: 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66   pLeaf:.**   Buf
4770: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
4780: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
4790: 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55   data. Set to NU
47a0: 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  LL at EOF..**.**
47b0: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20   iTermLeafPgno, 
47c0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a  iTermLeafOffset:
47d0: 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20  .**   Leaf page 
47e0: 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e  number containin
47f0: 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  g the last term 
4800: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65  read from the se
4810: 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20  gment. And.**   
4820: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
4830: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
4840: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a   the term data..
4850: 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20  **.** flags:.** 
4860: 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53    Mask of FTS5_S
4870: 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65  EGITER_XXX value
4880: 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61  s. Interpreted a
4890: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
48a0: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
48b0: 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20  ONETERM:.**     
48c0: 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  If set, set the 
48d0: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
48e0: 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74  t to EOF after t
48f0: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
4900: 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  st .**     has b
4910: 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44  een exhausted. D
4920: 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f  o not proceed to
4930: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69   the next term i
4940: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
4950: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
4960: 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20  TER_REVERSE:.** 
4970: 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73      This flag is
4980: 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69   only ever set i
4990: 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  f FTS5_SEGITER_O
49a0: 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73  NETERM is also s
49b0: 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74  et. If.**     it
49c0: 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65   is set, iterate
49d0: 20 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73 20   through docids 
49e0: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
49f0: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
4a00: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
4a10: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
4a20: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
4a30: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
4a40: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
4a50: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
4a60: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
4a70: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4a80: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
4a90: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
4aa0: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
4ab0: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
4ac0: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
4ad0: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
4ae0: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
4af0: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
4b00: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
4b10: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
4b20: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
4b30: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
4b40: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
4b50: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
4b60: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   page..*/.struct
4b70: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
4b80: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
4b90: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
4ba0: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
4bb0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
4bc0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
4bf0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
4c00: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
4c10: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4c20: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4c30: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4c40: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4c50: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4c70: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4c80: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
4c90: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
4ca0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
4cb0: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
4cc0: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
4cd0: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4ce0: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4cf0: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
4d00: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
4d10: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
4d20: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
4d30: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
4d40: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
4d50: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
4d60: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
4d70: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
4d80: 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  t;..  /* The fol
4d90: 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20  lowing are only 
4da0: 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35  used if the FTS5
4db0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
4dc0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f   flag is set. */
4dd0: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
4de0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4df0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e     /* Current en
4e00: 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66  try in aRowidOff
4e10: 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  set[] */.  int n
4e20: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4e40: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4e50: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
4e60: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  rray */.  int *a
4e70: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
4e90: 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20  ay of offset to 
4ea0: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a  rowid fields */.
4eb0: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
4ec0: 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20   *pDlidx;       
4ed0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
4ee0: 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
4ef0: 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61  x */..  /* Varia
4f00: 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62  bles populated b
4f10: 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20  ased on current 
4f20: 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35  entry. */.  Fts5
4f30: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4f50: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
4f60: 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
4f90: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b  d */.  int nPos;
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4fc0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75 72   of bytes in cur
4fd0: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  rent position li
4fe0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c  st */.  int bDel
4ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5000: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5010: 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c  if the delete fl
5020: 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a  ag is set */.};.
5030: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45  .#define FTS5_SE
5040: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78  GITER_ONETERM 0x
5050: 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  01.#define FTS5_
5060: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
5070: 30 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  0x02.../*.** Obj
5080: 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e  ect for iteratin
5090: 67 20 74 68 72 6f 75 67 68 20 70 61 67 69 6e 61  g through pagina
50a0: 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 72  ted data..*/.str
50b0: 75 63 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65  uct Fts5ChunkIte
50c0: 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  r {.  Fts5Data *
50d0: 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
50e0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
50f0: 20 6c 65 61 66 20 64 61 74 61 2e 20 4e 55 4c 4c   leaf data. NULL
5100: 20 2d 3e 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 36   -> EOF. */.  i6
5110: 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 20 20 20  4 iLeafRowid;   
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5130: 20 41 62 73 6f 6c 75 74 65 20 72 6f 77 69 64 20   Absolute rowid 
5140: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
5150: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20  */.  int nRem;  
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e       /* Remainin
5180: 67 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  g bytes of data 
5190: 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 2f 2a  to read */..  /*
51a0: 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
51b0: 72 73 20 2a 2f 0a 20 20 75 38 20 2a 70 3b 20 20  rs */.  u8 *p;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
51e0: 65 72 20 74 6f 20 63 68 75 6e 6b 20 6f 66 20 64  er to chunk of d
51f0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ata */.  int n; 
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
5220: 20 6f 66 20 62 75 66 66 65 72 20 70 20 69 6e 20   of buffer p in 
5230: 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  bytes */.};../*.
5240: 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74  ** Object for it
5250: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
5260: 61 20 73 69 6e 67 6c 65 20 70 6f 73 69 74 69 6f  a single positio
5270: 6e 20 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a  n list on disk..
5280: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f  */.struct Fts5Po
5290: 73 49 74 65 72 20 7b 0a 20 20 46 74 73 35 43 68  sIter {.  Fts5Ch
52a0: 75 6e 6b 49 74 65 72 20 63 68 75 6e 6b 3b 20 20  unkIter chunk;  
52b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
52c0: 72 65 6e 74 20 63 68 75 6e 6b 20 6f 66 20 64 61  rent chunk of da
52d0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  ta */.  int iOff
52e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
52f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
5300: 74 20 77 69 74 68 69 6e 20 63 68 75 6e 6b 20 64  t within chunk d
5310: 61 74 61 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43  ata */..  int iC
5320: 6f 6c 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a  ol;.  int iPos;.
5330: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  };../*.** Object
5340: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
5350: 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e  hrough the conen
5360: 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69  ts of a single i
5370: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20  nternal node in 
5380: 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
5390: 74 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74  truct Fts5NodeIt
53a0: 65 72 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e  er {.  /* Intern
53b0: 61 6c 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61  al. Set and mana
53c0: 67 65 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49  ged by fts5NodeI
53d0: 74 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f  terXXX() functio
53e0: 6e 73 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a  ns. Except, .  *
53f0: 2a 20 74 68 65 20 45 4f 46 20 74 65 73 74 20 66  * the EOF test f
5400: 6f 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  or the iterator 
5410: 69 73 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72  is (Fts5NodeIter
5420: 2e 61 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a  .aData==0).  */.
5430: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74    const u8 *aDat
5440: 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a  a;.  int nData;.
5450: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f    int iOff;..  /
5460: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
5470: 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  es */.  Fts5Buff
5480: 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e  er term;.  int n
5490: 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68  Empty;.  int iCh
54a0: 69 6c 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64  ild;.  int bDlid
54b0: 78 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  x;.};../*.** An 
54c0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
54d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69  following type i
54e0: 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
54f0: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  e through the co
5500: 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64  ntents.** of a d
5510: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63  oclist-index rec
5520: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61  ord..**.** pData
5530: 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f  :.**   Record co
5540: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63  ntaining the doc
5550: 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e  list-index data.
5560: 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20  .**.** bEof:.** 
5570: 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e    Set to true on
5580: 63 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20  ce iterator has 
5590: 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a  reached EOF..**.
55a0: 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65  ** iOff:.**   Se
55b0: 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  t to the current
55c0: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72   offset within r
55d0: 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a  ecord pData..*/.
55e0: 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78  struct Fts5Dlidx
55f0: 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61  Lvl {.  Fts5Data
5600: 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
5610: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
5620: 72 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f  r current page o
5630: 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a  f this level */.
5640: 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20    int iOff;     
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  /* Current offse
5670: 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a  t into pData */.
5680: 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20    int bEof;     
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64  /* At EOF alread
56b0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  y */.  int iFirs
56c0: 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tOff;           
56d0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
56e0: 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72  reverse iterator
56f0: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  s */..  /* Outpu
5700: 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  t variables */. 
5710: 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20   int iLeafPgno; 
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5730: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
5740: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
5750: 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ge */.  i64 iRow
5760: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
5770: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
5780: 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65  owid on leaf iLe
5790: 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72  afPgno */.};.str
57a0: 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65  uct Fts5DlidxIte
57b0: 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a  r {.  int nLvl;.
57c0: 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
57d0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76  Fts5DlidxLvl aLv
57e0: 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 0a 0a 2f 2a 0a 2a  l[1];.};..../*.*
57f0: 2a 20 41 6e 20 46 74 73 35 42 74 72 65 65 49 74  * An Fts5BtreeIt
5800: 65 72 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  er object is use
5810: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
5820: 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72 69 65 73  ough all entries
5830: 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65   in the.** b-tre
5840: 65 20 68 69 65 72 61 72 63 68 79 20 62 65 6c 6f  e hierarchy belo
5850: 6e 67 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  nging to a singl
5860: 65 20 66 74 73 35 20 73 65 67 6d 65 6e 74 2e 20  e fts5 segment. 
5870: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
5880: 0a 2a 2a 20 22 62 2d 74 72 65 65 20 68 69 65 72  .** "b-tree hier
5890: 61 72 63 68 79 22 20 69 73 20 61 6c 6c 20 62 2d  archy" is all b-
58a0: 74 72 65 65 20 6e 6f 64 65 73 20 65 78 63 65 70  tree nodes excep
58b0: 74 20 6c 65 61 76 65 73 2e 20 45 61 63 68 20 65  t leaves. Each e
58c0: 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62  ntry in the.** b
58d0: 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
58e0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
58f0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
5900: 20 20 20 69 4c 65 61 66 3a 20 20 54 68 65 20 70     iLeaf:  The p
5910: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
5920: 65 20 6c 65 61 66 20 70 61 67 65 20 74 68 65 20  e leaf page the 
5930: 65 6e 74 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e  entry points to.
5940: 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20  .**.**   term:  
5950: 20 41 20 73 70 6c 69 74 2d 6b 65 79 20 74 68 61   A split-key tha
5960: 74 20 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c  t all terms on l
5970: 65 61 66 20 70 61 67 65 20 24 69 4c 65 61 66 20  eaf page $iLeaf 
5980: 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 0a  must be greater.
5990: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 68 61  **           tha
59a0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 2e 20 54  n or equal to. T
59b0: 68 65 20 22 74 65 72 6d 22 20 61 73 73 6f 63 69  he "term" associ
59c0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
59d0: 72 73 74 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20  rst b-tree.**   
59e0: 20 20 20 20 20 20 20 20 68 69 65 72 61 72 63 68          hierarch
59f0: 79 20 65 6e 74 72 79 20 28 74 68 65 20 6f 6e 65  y entry (the one
5a00: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
5a10: 6c 65 61 66 20 70 61 67 65 20 31 29 20 69 73 20  leaf page 1) is 
5a20: 61 6c 77 61 79 73 20 0a 2a 2a 20 20 20 20 20 20  always .**      
5a30: 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74       an empty st
5a40: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45  ring..**.**   nE
5a50: 6d 70 74 79 3a 20 54 68 65 20 6e 75 6d 62 65 72  mpty: The number
5a60: 20 6f 66 20 65 6d 70 74 79 20 28 74 65 72 6d 6c   of empty (terml
5a70: 65 73 73 29 20 6c 65 61 66 20 70 61 67 65 73 20  ess) leaf pages 
5a80: 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  that immediately
5a90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 66 6f  .**           fo
5aa0: 6c 6c 6f 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a  llowing iLeaf..*
5ab0: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 42 74 72  *.** The Fts5Btr
5ac0: 65 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73  eeIter object is
5ad0: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
5ae0: 72 74 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72  rt of the integr
5af0: 69 74 79 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a  ity-check code..
5b00: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 42 74  */.struct Fts5Bt
5b10: 72 65 65 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20  reeIterLevel {. 
5b20: 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 3b   Fts5NodeIter s;
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
5b50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
5b60: 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  e */.  Fts5Data 
5b70: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5b80: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
5b90: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  or the current n
5ba0: 6f 64 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74  ode */.};.struct
5bb0: 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20 7b   Fts5BtreeIter {
5bc0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b  .  Fts5Index *p;
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
5bf0: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
5c00: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
5c10: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
5c20: 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
5c30: 68 20 74 68 69 73 20 73 65 67 6d 65 6e 74 27 73  h this segment's
5c40: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
5c50: 20 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20   nLvl;          
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5c70: 53 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d 20 61  Size of aLvl[] a
5c80: 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 42 74  rray */.  Fts5Bt
5c90: 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 61 4c  reeIterLevel *aL
5ca0: 76 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65 76  vl;       /* Lev
5cb0: 65 6c 20 66 6f 72 20 65 61 63 68 20 74 69 65 72  el for each tier
5cc0: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20   of b-tree */.. 
5cd0: 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61   /* Output varia
5ce0: 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75  bles */.  Fts5Bu
5cf0: 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
5d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
5d10: 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  rent term */.  i
5d20: 6e 74 20 69 4c 65 61 66 3b 20 20 20 20 20 20 20  nt iLeaf;       
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5d40: 2a 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e 69 6e  * Leaf containin
5d50: 67 20 74 65 72 6d 73 20 3e 3d 20 63 75 72 72 65  g terms >= curre
5d60: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
5d70: 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20   nEmpty;        
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d90: 4e 75 6d 62 65 72 20 6f 66 20 22 65 6d 70 74 79  Number of "empty
5da0: 22 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  " leaves followi
5db0: 6e 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20 69 6e  ng iLeaf */.  in
5dc0: 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20  t bEof;         
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5de0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 61 74 20   Set to true at 
5df0: 45 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62 44 6c  EOF */.  int bDl
5e00: 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
5e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
5e20: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
5e30: 20 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b 0a 0a   a dlidx */.};..
5e40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
5e50: 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75 74  5PutU16(u8 *aOut
5e60: 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61  , u16 iVal){.  a
5e70: 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e  Out[0] = (iVal>>
5e80: 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20  8);.  aOut[1] = 
5e90: 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a  (iVal&0xFF);.}..
5ea0: 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35 47  static u16 fts5G
5eb0: 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a  etU16(const u8 *
5ec0: 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  aIn){.  return (
5ed0: 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38  (u16)aIn[0] << 8
5ee0: 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a 2f  ) + aIn[1];.}../
5ef0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
5f00: 6f 70 79 20 6f 66 20 74 68 65 20 73 71 6c 69 74  opy of the sqlit
5f10: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
5f20: 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74 68 65  routine from the
5f30: 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a 2a 2a   SQLite core..**
5f40: 20 45 78 63 65 70 74 2c 20 74 68 69 73 20 76 65   Except, this ve
5f50: 72 73 69 6f 6e 20 64 6f 65 73 20 68 61 6e 64 6c  rsion does handl
5f60: 65 20 74 68 65 20 73 69 6e 67 6c 65 20 62 79 74  e the single byt
5f70: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
5f80: 63 6f 72 65 0a 2a 2a 20 76 65 72 73 69 6f 6e 20  core.** version 
5f90: 64 65 70 65 6e 64 73 20 6f 6e 20 62 65 69 6e 67  depends on being
5fa0: 20 68 61 6e 64 6c 65 64 20 62 65 66 6f 72 65 20   handled before 
5fb0: 69 74 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  its function is 
5fc0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  called..*/.int s
5fd0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
5fe0: 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69  int32(const unsi
5ff0: 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33  gned char *p, u3
6000: 32 20 2a 76 29 7b 0a 20 20 75 33 32 20 61 2c 62  2 *v){.  u32 a,b
6010: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 31 2d 62 79  ;..  /* The 1-by
6020: 74 65 20 63 61 73 65 2e 20 4f 76 65 72 77 68 65  te case. Overwhe
6030: 6c 6d 69 6e 67 6c 79 20 74 68 65 20 6d 6f 73 74  lmingly the most
6040: 20 63 6f 6d 6d 6f 6e 2e 20 2a 2f 0a 20 20 61 20   common. */.  a 
6050: 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70 30  = *p;.  /* a: p0
6060: 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20   (unmasked) */. 
6070: 20 69 66 20 28 21 28 61 26 30 78 38 30 29 29 0a   if (!(a&0x80)).
6080: 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65    {.    /* Value
6090: 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  s between 0 and 
60a0: 31 32 37 20 2a 2f 0a 20 20 20 20 2a 76 20 3d 20  127 */.    *v = 
60b0: 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  a;.    return 1;
60c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 32  .  }..  /* The 2
60d0: 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20  -byte case */.  
60e0: 70 2b 2b 3b 0a 20 20 62 20 3d 20 2a 70 3b 0a 20  p++;.  b = *p;. 
60f0: 20 2f 2a 20 62 3a 20 70 31 20 28 75 6e 6d 61 73   /* b: p1 (unmas
6100: 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21 28  ked) */.  if (!(
6110: 62 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20 20  b&0x80)).  {.   
6120: 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77 65   /* Values betwe
6130: 65 6e 20 31 32 38 20 61 6e 64 20 31 36 33 38 33  en 128 and 16383
6140: 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20 30 78 37   */.    a &= 0x7
6150: 66 3b 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37 3b  f;.    a = a<<7;
6160: 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20 62 3b  .    *v = a | b;
6170: 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
6180: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 33 2d 62   }..  /* The 3-b
6190: 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20 70 2b  yte case */.  p+
61a0: 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34 3b 0a  +;.  a = a<<14;.
61b0: 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20    a |= *p;.  /* 
61c0: 61 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32 20 28  a: p0<<14 | p2 (
61d0: 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69  unmasked) */.  i
61e0: 66 20 28 21 28 61 26 30 78 38 30 29 29 0a 20 20  f (!(a&0x80)).  
61f0: 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20  {.    /* Values 
6200: 62 65 74 77 65 65 6e 20 31 36 33 38 34 20 61 6e  between 16384 an
6210: 64 20 32 30 39 37 31 35 31 20 2a 2f 0a 20 20 20  d 2097151 */.   
6220: 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29   a &= (0x7f<<14)
6230: 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 62 20 26  |(0x7f);.    b &
6240: 3d 20 30 78 37 66 3b 0a 20 20 20 20 62 20 3d 20  = 0x7f;.    b = 
6250: 62 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61  b<<7;.    *v = a
6260: 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75 72 6e   | b;.    return
6270: 20 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20   3;.  }..  /* A 
6280: 33 32 2d 62 69 74 20 76 61 72 69 6e 74 20 69 73  32-bit varint is
6290: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 73   used to store s
62a0: 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ize information 
62b0: 69 6e 20 62 74 72 65 65 73 2e 0a 20 20 2a 2a 20  in btrees..  ** 
62c0: 4f 62 6a 65 63 74 73 20 61 72 65 20 72 61 72 65  Objects are rare
62d0: 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 32  ly larger than 2
62e0: 4d 69 42 20 6c 69 6d 69 74 20 6f 66 20 61 20 33  MiB limit of a 3
62f0: 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20 20  -byte varint..  
6300: 2a 2a 20 41 20 33 2d 62 79 74 65 20 76 61 72 69  ** A 3-byte vari
6310: 6e 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  nt is sufficient
6320: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
6330: 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 69 7a  o record the siz
6340: 65 0a 20 20 2a 2a 20 6f 66 20 61 20 31 30 34 38  e.  ** of a 1048
6350: 35 36 39 2d 62 79 74 65 20 42 4c 4f 42 20 6f 72  569-byte BLOB or
6360: 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20   string..  **.  
6370: 2a 2a 20 57 65 20 6f 6e 6c 79 20 75 6e 72 6f 6c  ** We only unrol
6380: 6c 20 74 68 65 20 66 69 72 73 74 20 31 2d 2c 20  l the first 1-, 
6390: 32 2d 2c 20 61 6e 64 20 33 2d 20 62 79 74 65 20  2-, and 3- byte 
63a0: 63 61 73 65 73 2e 20 20 54 68 65 20 76 65 72 79  cases.  The very
63b0: 0a 20 20 2a 2a 20 72 61 72 65 20 6c 61 72 67 65  .  ** rare large
63c0: 72 20 63 61 73 65 73 20 63 61 6e 20 62 65 20 68  r cases can be h
63d0: 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 73 6c  andled by the sl
63e0: 6f 77 65 72 20 36 34 2d 62 69 74 20 76 61 72 69  ower 64-bit vari
63f0: 6e 74 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 2e  nt.  ** routine.
6400: 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 36  .  */.  {.    u6
6410: 34 20 76 36 34 3b 0a 20 20 20 20 75 38 20 6e 3b  4 v64;.    u8 n;
6420: 0a 20 20 20 20 70 20 2d 3d 20 32 3b 0a 20 20 20  .    p -= 2;.   
6430: 20 6e 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   n = sqlite3GetV
6440: 61 72 69 6e 74 28 70 2c 20 26 76 36 34 29 3b 0a  arint(p, &v64);.
6450: 20 20 20 20 2a 76 20 3d 20 28 75 33 32 29 76 36      *v = (u32)v6
6460: 34 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  4;.    assert( n
6470: 3e 33 20 26 26 20 6e 3c 3d 39 20 29 3b 0a 20 20  >3 && n<=9 );.  
6480: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 7d 0a    return n;.  }.
6490: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
64a0: 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 75  s5GetVarintLen(u
64b0: 33 32 20 69 56 61 6c 29 7b 0a 20 20 69 66 28 20  32 iVal){.  if( 
64c0: 69 56 61 6c 3c 28 31 20 3c 3c 20 37 20 29 20 29  iVal<(1 << 7 ) )
64d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
64e0: 20 69 56 61 6c 3c 28 31 20 3c 3c 20 31 34 29 20   iVal<(1 << 14) 
64f0: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
6500: 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32 31 29  ( iVal<(1 << 21)
6510: 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 69   ) return 3;.  i
6520: 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32 38  f( iVal<(1 << 28
6530: 29 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  ) ) return 4;.  
6540: 72 65 74 75 72 6e 20 35 3b 0a 7d 0a 0a 2f 2a 0a  return 5;.}../*.
6550: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
6560: 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72 20  return a buffer 
6570: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
6580: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
6590: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
65a0: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
65b0: 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ed, return NULL 
65c0: 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72 6f  and set the erro
65d0: 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65  r code in.** the
65e0: 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
65f0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
6600: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
6610: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
6620: 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74  fts5IdxMalloc(Ft
6630: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
6640: 6e 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e  nByte){.  return
6650: 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c   sqlite3Fts5Mall
6660: 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e  ocZero(&p->rc, n
6670: 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Byte);.}../*.** 
6680: 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74  Compare the cont
6690: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66  ents of the pLef
66a0: 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74 68  t buffer with th
66b0: 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20  e pRight/nRight 
66c0: 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  blob..**.** Retu
66d0: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
66e0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
66f0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
6700: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
6710: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
6720: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
6730: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
6740: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
6750: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
6760: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
6770: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
6780: 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46  CompareBlob(.  F
6790: 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74  ts5Buffer *pLeft
67a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
67b0: 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65  * Left hand side
67c0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a   of comparison *
67d0: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52  /.  const u8 *pR
67e0: 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74  ight, int nRight
67f0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e      /* Right han
6800: 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72  d side of compar
6810: 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ison */.){.  int
6820: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66   nCmp = MIN(pLef
6830: 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20  t->n, nRight);. 
6840: 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d   int res = memcm
6850: 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67  p(pLeft->p, pRig
6860: 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  ht, nCmp);.  ret
6870: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70  urn (res==0 ? (p
6880: 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74  Left->n - nRight
6890: 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a  ) : res);.}.../*
68a0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
68b0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
68c0: 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e  two buffers usin
68d0: 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f  g memcmp(). If o
68e0: 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20  ne buffer.** is 
68f0: 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
6900: 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e  other, it is con
6910: 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73 73  sidered the less
6920: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
6930: 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73   -ve if pLeft is
6940: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52   smaller than pR
6950: 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20  ight, 0 if they 
6960: 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20  are equal or.** 
6970: 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73  +ve if pRight is
6980: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c   smaller than pL
6990: 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  eft. In other wo
69a0: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  rds:.**.**     r
69b0: 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70  es = *pLeft - *p
69c0: 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20  Right.*/.static 
69d0: 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43 6f  int fts5BufferCo
69e0: 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65 72  mpare(Fts5Buffer
69f0: 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66   *pLeft, Fts5Buf
6a00: 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  fer *pRight){.  
6a10: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
6a20: 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d  Left->n, pRight-
6a30: 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  >n);.  int res =
6a40: 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70   memcmp(pLeft->p
6a50: 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d  , pRight->p, nCm
6a60: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
6a70: 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e  s==0 ? (pLeft->n
6a80: 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20   - pRight->n) : 
6a90: 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  res);.}..#ifdef 
6aa0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
6ab0: 74 69 63 20 69 6e 74 20 66 74 73 35 42 6c 6f 62  tic int fts5Blob
6ac0: 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74  Compare(.  const
6ad0: 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74 20   u8 *pLeft, int 
6ae0: 6e 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74 20  nLeft, .  const 
6af0: 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20  u8 *pRight, int 
6b00: 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20  nRight.){.  int 
6b10: 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66 74  nCmp = MIN(nLeft
6b20: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
6b30: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
6b40: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d  eft, pRight, nCm
6b50: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
6b60: 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d 20  s==0 ? (nLeft - 
6b70: 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a  nRight) : res);.
6b80: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
6b90: 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d   Close the read-
6ba0: 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65  only blob handle
6bb0: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
6bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6bd0: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
6be0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
6bf0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20   if( p->pReader 
6c00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
6c10: 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20 70  lob *pReader = p
6c20: 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 70  ->pReader;.    p
6c30: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
6c40: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
6c50: 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b 0a  close(pReader);.
6c60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65    }.}../*.** Che
6c70: 63 6b 20 69 66 20 72 6f 77 20 69 52 6f 77 69 64  ck if row iRowid
6c80: 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 25   exists in the %
6c90: 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 61 6e 64  _data table, and
6ca0: 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e   that it contain
6cb0: 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 76 61 6c 75  s.** a blob valu
6cc0: 65 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e  e. If so, return
6cd0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 28 79   SQLITE_ERROR (y
6ce0: 65 73 20 2d 20 53 51 4c 49 54 45 5f 45 52 52 4f  es - SQLITE_ERRO
6cf0: 52 2c 20 6e 6f 74 20 0a 2a 2a 20 53 51 4c 49 54  R, not .** SQLIT
6d00: 45 5f 4f 4b 29 2e 20 49 66 20 6e 6f 74 2c 20 72  E_OK). If not, r
6d10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6d20: 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2a 0a 2a 2a  RUPT_VTAB..**.**
6d30: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6d40: 75 72 73 20 28 65 2e 67 2e 20 4f 4f 4d 20 6f 72  urs (e.g. OOM or
6d50: 20 49 4f 45 52 52 29 2c 20 72 65 74 75 72 6e 20   IOERR), return 
6d60: 74 68 65 20 72 65 6c 65 76 61 6e 74 20 65 72 72  the relevant err
6d70: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
6d80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
6d90: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
6da0: 20 65 66 66 69 63 69 65 6e 74 2e 20 49 74 20 69   efficient. It i
6db0: 73 20 70 61 72 74 20 6f 66 20 76 61 72 79 20 72  s part of vary r
6dc0: 61 72 65 6c 79 0a 2a 2a 20 69 6e 76 6f 6b 65 64  arely.** invoked
6dd0: 20 65 72 72 6f 72 20 68 61 6e 64 6c 69 6e 67 20   error handling 
6de0: 63 6f 64 65 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  code only..*/.#i
6df0: 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20 66  f 0.static int f
6e00: 74 73 35 43 68 65 63 6b 4d 69 73 73 69 6e 67 52  ts5CheckMissingR
6e10: 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a  owid(Fts5Index *
6e20: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
6e30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
6e40: 6d 74 20 3d 20 22 53 45 4c 45 43 54 20 74 79 70  mt = "SELECT typ
6e50: 65 6f 66 28 62 6c 6f 63 6b 29 3d 3d 27 62 6c 6f  eof(block)=='blo
6e60: 62 27 20 46 52 4f 4d 20 27 25 71 27 2e 25 51 20  b' FROM '%q'.%Q 
6e70: 57 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 3b 0a  WHERE id=%lld";.
6e80: 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20    int bOk = 0;. 
6e90: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
6ea0: 2a 7a 53 71 6c 3b 0a 0a 20 20 7a 53 71 6c 20 3d  *zSql;..  zSql =
6eb0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
6ec0: 28 7a 46 6d 74 2c 20 70 2d 3e 70 43 6f 6e 66 69  (zFmt, p->pConfi
6ed0: 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
6ee0: 54 62 6c 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Tbl, iRowid);.  
6ef0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
6f00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6f10: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
6f20: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
6f30: 2a 70 53 74 6d 74 3b 0a 20 20 20 20 72 63 20 3d  *pStmt;.    rc =
6f40: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6f50: 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  _v2(p->pConfig->
6f60: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
6f70: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
6f80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6f90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
6fa0: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
6fb0: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
6fc0: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 73 71          bOk = sq
6fd0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
6fe0: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
6ff0: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
7000: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
7010: 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
7020: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
7030: 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Sql);.  }..  if(
7040: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7050: 7b 0a 20 20 20 20 72 63 20 3d 20 62 4f 6b 20 3f  {.    rc = bOk ?
7060: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20   SQLITE_ERROR : 
7070: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
7080: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
7090: 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  }.#endif..static
70a0: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
70b0: 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28  ataReadOrBuffer(
70c0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
70d0: 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a   .  Fts5Buffer *
70e0: 70 42 75 66 2c 20 0a 20 20 69 36 34 20 69 52 6f  pBuf, .  i64 iRo
70f0: 77 69 64 0a 29 7b 0a 20 20 46 74 73 35 44 61 74  wid.){.  Fts5Dat
7100: 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  a *pRet = 0;.  i
7110: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
7120: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
7130: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
7140: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64      if( p->pRead
7150: 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  er ){.      /* T
7160: 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74  his call may ret
7170: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
7180: 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
7190: 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20  en a savepoint. 
71a0: 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
71b0: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
71c0: 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73  st used. In this
71d0: 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62   case a new blob
71e0: 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a   handle.      **
71f0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
7200: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
7210: 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d  blob *pBlob = p-
7220: 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20  >pReader;.      
7230: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
7240: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7250: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70  e3_blob_reopen(p
7260: 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20  Blob, iRowid);. 
7270: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
7280: 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20  pReader==0 );.  
7290: 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d      p->pReader =
72a0: 20 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66   pBlob;.      if
72b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
72c0: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43  ){.        fts5C
72d0: 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
72e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
72f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52   rc==SQLITE_ABOR
7300: 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
7310: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
7320: 2a 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61  * If the blob ha
7330: 6e 64 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  ndle is not yet 
7340: 6f 70 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73  open, open and s
7350: 65 65 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73  eek it. Otherwis
7360: 65 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  e, use.    ** th
7370: 65 20 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20  e blob_reopen() 
7380: 41 50 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68  API to reseek th
7390: 65 20 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20  e existing blob 
73a0: 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  handle.  */.    
73b0: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d  if( p->pReader==
73c0: 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
73d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  OK ){.      Fts5
73e0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
73f0: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
7400: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7410: 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66  _blob_open(pConf
7420: 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20  ig->db, .       
7430: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
7440: 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62   p->zDataTbl, "b
7450: 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30  lock", iRowid, 0
7460: 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20  , &p->pReader.  
7470: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
7480: 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f    /* If either o
7490: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  f the sqlite3_bl
74a0: 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c  ob_open() or sql
74b0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
74c0: 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
74d0: 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20 53  above returned S
74e0: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65 74  QLITE_ERROR, ret
74f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7500: 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64 2e  PT_VTAB instead.
7510: 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65 20  .    ** All the 
7520: 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66 75  reasons those fu
7530: 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72 65  nctions might re
7540: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
7550: 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20 20  R - missing.    
7560: 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69 6e  ** table, missin
7570: 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f  g row, non-blob/
7580: 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63 6f  text in block co
7590: 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65 20  lumn - indicate 
75a0: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67 20  .    ** backing 
75b0: 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  store corruption
75c0: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
75d0: 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  ==SQLITE_ERROR )
75e0: 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
75f0: 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  PT;..    if( rc=
7600: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7610: 20 20 20 20 75 38 20 2a 61 4f 75 74 3b 20 20 20      u8 *aOut;   
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61 74  /* Read blob dat
7640: 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  a into this buff
7650: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
7660: 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  nByte = sqlite3_
7670: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52  blob_bytes(p->pR
7680: 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66  eader);.      if
7690: 28 20 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20  ( pBuf ){.      
76a0: 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
76b0: 28 70 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (pBuf);.        
76c0: 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
76d0: 72 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  rc, pBuf, nByte)
76e0: 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d  ;.        aOut =
76f0: 20 70 42 75 66 2d 3e 70 3b 0a 20 20 20 20 20 20   pBuf->p;.      
7700: 20 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79 74    pBuf->n = nByt
7710: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
7720: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61          int nSpa
7730: 63 65 20 3d 20 6e 42 79 74 65 20 2b 20 46 54 53  ce = nByte + FTS
7740: 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
7750: 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 70 52 65  ING;.        pRe
7760: 74 20 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73  t = (Fts5Data*)s
7770: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
7780: 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65  Zero(&rc, nSpace
7790: 2b 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61  +sizeof(Fts5Data
77a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
77b0: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
77c0: 20 20 70 52 65 74 2d 3e 6e 20 3d 20 6e 42 79 74    pRet->n = nByt
77d0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4f 75  e;.          aOu
77e0: 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75  t = pRet->p = (u
77f0: 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20  8*)&pRet[1];.   
7800: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52 65         pRet->nRe
7810: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  f = 1;.        }
7820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7830: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7840: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
7850: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
7860: 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72 2c 20  ead(p->pReader, 
7870: 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30 29 3b  aOut, nByte, 0);
7880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7890: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
78a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
78b0: 74 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b 0a  te3_free(pRet);.
78c0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
78d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
78e0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
78f0: 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a      p->nRead++;.
7900: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
7910: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  et;.}../*.** Ret
7920: 72 69 65 76 65 20 61 20 72 65 63 6f 72 64 20 66  rieve a record f
7930: 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
7940: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  able..**.** If a
7950: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
7960: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
7970: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65   and an error le
7980: 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74  ft in the .** Ft
7990: 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a  s5Index object..
79a0: 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 44 61  */.static Fts5Da
79b0: 74 61 20 2a 66 74 73 35 44 61 74 61 52 65 61 64  ta *fts5DataRead
79c0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
79d0: 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46 74  64 iRowid){.  Ft
79e0: 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20 66  s5Data *pRet = f
79f0: 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66  ts5DataReadOrBuf
7a00: 66 65 72 28 70 2c 20 30 2c 20 69 52 6f 77 69 64  fer(p, 0, iRowid
7a10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 52  );.  assert( (pR
7a20: 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d  et==0)==(p->rc!=
7a30: 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
7a40: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
7a50: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 72 65 63  /*.** Read a rec
7a60: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ord from the %_d
7a70: 61 74 61 20 74 61 62 6c 65 20 69 6e 74 6f 20 74  ata table into t
7a80: 68 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69  he buffer suppli
7a90: 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63  ed as the.** sec
7aa0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
7ab0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
7ac0: 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
7ad0: 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20   is left in the 
7ae0: 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74  Fts5Index object
7af0: 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  . If an.** error
7b00: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
7b10: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
7b20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
7b30: 65 64 2c 20 69 74 20 69 73 20 61 20 0a 2a 2a 20  ed, it is a .** 
7b40: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
7b50: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 42 75   void fts5DataBu
7b60: 66 66 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a  ffer(Fts5Index *
7b70: 70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  p, Fts5Buffer *p
7b80: 42 75 66 2c 20 69 36 34 20 69 52 6f 77 69 64 29  Buf, i64 iRowid)
7b90: 7b 0a 20 20 28 76 6f 69 64 29 66 74 73 35 44 61  {.  (void)fts5Da
7ba0: 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28 70  taReadOrBuffer(p
7bb0: 2c 20 70 42 75 66 2c 20 69 52 6f 77 69 64 29 3b  , pBuf, iRowid);
7bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
7bd0: 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
7be0: 20 64 61 74 61 20 72 65 63 6f 72 64 20 72 65 74   data record ret
7bf0: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
7c00: 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66  ier call to.** f
7c10: 74 73 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a  ts5DataRead()..*
7c20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7c30: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 46 74  s5DataRelease(Ft
7c40: 73 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a  s5Data *pData){.
7c50: 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20    if( pData ){. 
7c60: 20 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61     assert( pData
7c70: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
7c80: 70 44 61 74 61 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pData->nRef--;. 
7c90: 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 6e 52     if( pData->nR
7ca0: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ef==0 ) sqlite3_
7cb0: 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 7d  free(pData);.  }
7cc0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7cd0: 66 74 73 35 44 61 74 61 52 65 66 65 72 65 6e 63  fts5DataReferenc
7ce0: 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61 74  e(Fts5Data *pDat
7cf0: 61 29 7b 0a 20 20 70 44 61 74 61 2d 3e 6e 52 65  a){.  pData->nRe
7d00: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e  f++;.}../*.** IN
7d10: 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
7d20: 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  a record into th
7d30: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
7d40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7d50: 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74 73  ts5DataWrite(Fts
7d60: 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
7d70: 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20  Rowid, const u8 
7d80: 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
7d90: 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  a){.  if( p->rc!
7da0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7db0: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  urn;..  if( p->p
7dc0: 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  Writer==0 ){.   
7dd0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73   int rc;.    Fts
7de0: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
7df0: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
7e00: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
7e10: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
7e20: 0a 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43  .        "REPLAC
7e30: 45 20 49 4e 54 4f 20 27 25 71 27 2e 25 51 28 69  E INTO '%q'.%Q(i
7e40: 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53  d, block) VALUES
7e50: 28 3f 2c 3f 29 22 2c 20 70 43 6f 6e 66 69 67 2d  (?,?)", pConfig-
7e60: 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
7e70: 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
7e80: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
7e90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
7ea0: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
7eb0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7ec0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43  e3_prepare_v2(pC
7ed0: 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c  onfig->db, zSql,
7ee0: 20 2d 31 2c 20 26 70 2d 3e 70 57 72 69 74 65 72   -1, &p->pWriter
7ef0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7f00: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
7f10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
7f20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7f30: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
7f40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
7f50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
7f60: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
7f70: 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69 52  ->pWriter, 1, iR
7f80: 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
7f90: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57  _bind_blob(p->pW
7fa0: 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61 2c  riter, 2, pData,
7fb0: 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 53   nData, SQLITE_S
7fc0: 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
7fd0: 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74 65  3_step(p->pWrite
7fe0: 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71  r);.  p->rc = sq
7ff0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
8000: 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Writer);.}../*.*
8010: 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66 6f  * Execute the fo
8020: 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a  llowing SQL:.**.
8030: 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  **     DELETE FR
8040: 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45 20  OM %_data WHERE 
8050: 69 64 20 42 45 54 57 45 45 4e 20 24 69 46 69 72  id BETWEEN $iFir
8060: 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f  st AND $iLast.*/
8070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8080: 35 44 61 74 61 44 65 6c 65 74 65 28 46 74 73 35  5DataDelete(Fts5
8090: 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46  Index *p, i64 iF
80a0: 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29  irst, i64 iLast)
80b0: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  {.  if( p->rc!=S
80c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
80d0: 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  n;..  if( p->pDe
80e0: 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  leter==0 ){.    
80f0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35  int rc;.    Fts5
8100: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
8110: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
8120: 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
8130: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
8140: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
8150: 46 52 4f 4d 20 27 25 71 27 2e 25 51 20 57 48 45  FROM '%q'.%Q WHE
8160: 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c  RE id>=? AND id<
8170: 3d 3f 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44  =?", pConfig->zD
8180: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 0a 20  b, p->zDataTbl. 
8190: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53     );.    if( zS
81a0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
81b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
81c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
81d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
81e0: 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66  prepare_v2(pConf
81f0: 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ig->db, zSql, -1
8200: 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  , &p->pDeleter, 
8210: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8220: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
8230: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
8240: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8250: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
8260: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8270: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
8280: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
8290: 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69  pDeleter, 1, iFi
82a0: 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rst);.  sqlite3_
82b0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44  bind_int64(p->pD
82c0: 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74  eleter, 2, iLast
82d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
82e0: 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a  p(p->pDeleter);.
82f0: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
8300: 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65  3_reset(p->pDele
8310: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ter);.}../*.** C
8320: 6c 6f 73 65 20 74 68 65 20 73 71 6c 69 74 65 33  lose the sqlite3
8330: 5f 62 6c 6f 62 20 68 61 6e 64 6c 65 20 75 73 65  _blob handle use
8340: 64 20 74 6f 20 72 65 61 64 20 72 65 63 6f 72 64  d to read record
8350: 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  s from the %_dat
8360: 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 41 6e 64 20  a table..** And 
8370: 64 69 73 63 61 72 64 20 61 6e 79 20 63 61 63 68  discard any cach
8380: 65 64 20 72 65 61 64 73 2e 20 54 68 69 73 20 66  ed reads. This f
8390: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
83a0: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a  d at the end of.
83b0: 2a 2a 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  ** a read transa
83c0: 63 74 69 6f 6e 20 6f 72 20 77 68 65 6e 20 61 6e  ction or when an
83d0: 79 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  y sub-transactio
83e0: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
83f0: 2e 0a 2a 2f 0a 23 69 66 20 30 0a 73 74 61 74 69  ..*/.#if 0.stati
8400: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
8410: 65 73 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a  eset(Fts5Index *
8420: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65  p){.  if( p->pRe
8430: 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ader ){.    sqli
8440: 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
8450: 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20  ->pReader);.    
8460: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
8470: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
8480: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72  .** Remove all r
8490: 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74 65  ecords associate
84a0: 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20 69  d with segment i
84b0: 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  Segid..*/.static
84c0: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
84d0: 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35  moveSegment(Fts5
84e0: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 53  Index *p, int iS
84f0: 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69  egid){.  i64 iFi
8500: 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  rst = FTS5_SEGME
8510: 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
8520: 20 30 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c   0, 0);.  i64 iL
8530: 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  ast = FTS5_SEGME
8540: 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b  NT_ROWID(iSegid+
8550: 31 2c 20 30 2c 20 30 29 2d 31 3b 0a 20 20 66 74  1, 0, 0)-1;.  ft
8560: 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20  s5DataDelete(p, 
8570: 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a  iFirst, iLast);.
8580: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
8590: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
85a0: 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65  an Fts5Structure
85b0: 20 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64   object returned
85c0: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a   by an earlier .
85d0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53  ** call to fts5S
85e0: 74 72 75 63 74 75 72 65 52 65 61 64 28 29 20 6f  tructureRead() o
85f0: 72 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  r fts5StructureD
8600: 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ecode()..*/.stat
8610: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
8620: 63 74 75 72 65 52 65 6c 65 61 73 65 28 46 74 73  ctureRelease(Fts
8630: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8640: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72  uct){.  if( pStr
8650: 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uct ){.    int i
8660: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8670: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
8680: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
8690: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
86a0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53  ct->aLevel[i].aS
86b0: 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eg);.    }.    s
86c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72  qlite3_free(pStr
86d0: 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  uct);.  }.}../*.
86e0: 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61  ** Deserialize a
86f0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74  nd return the st
8700: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 63  ructure record c
8710: 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
8720: 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a  in serialized.**
8730: 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66   form within buf
8740: 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e  fer pData/nData.
8750: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53  .**.** The Fts5S
8760: 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b  tructure.aLevel[
8770: 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53  ] and each Fts5S
8780: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53  tructureLevel.aS
8790: 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  eg[] array.** ar
87a0: 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64  e over-allocated
87b0: 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68   by one slot. Th
87c0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74  is allows the st
87d0: 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73  ructure contents
87e0: 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65  .** to be more e
87f0: 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a  asily edited..**
8800: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
8810: 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69  occurs, *ppOut i
8820: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
8830: 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  d an SQLite erro
8840: 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e  r code.** return
8850: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a  ed. Otherwise, *
8860: 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  ppOut is set to 
8870: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
8880: 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53   object and.** S
8890: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
88a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
88b0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
88c0: 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38  code(.  const u8
88d0: 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
88e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
88f0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72  r containing ser
8900: 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72  ialized structur
8910: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  e */.  int nData
8920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8930: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8940: 66 20 62 75 66 66 65 72 20 70 44 61 74 61 20 69  f buffer pData i
8950: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
8960: 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20   *piCookie,     
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8980: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  Configuration co
8990: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
89a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
89b0: 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
89c0: 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c  /* OUT: Deserial
89d0: 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  ized object */.)
89e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
89f0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20  ITE_OK;.  int i 
8a00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b  = 0;.  int iLvl;
8a10: 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20  .  int nLevel = 
8a20: 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  0;.  int nSegmen
8a30: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79  t = 0;.  int nBy
8a40: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
8a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
8a60: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
8a70: 6c 6f 63 61 74 65 20 61 74 20 70 52 65 74 20 2a  locate at pRet *
8a80: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
8a90: 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  e *pRet = 0;    
8aa0: 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65      /* Structure
8ab0: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   object to retur
8ac0: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20  n */..  /* Grab 
8ad0: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
8ae0: 20 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b   */.  if( piCook
8af0: 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d  ie ) *piCookie =
8b00: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 33   sqlite3Fts5Get3
8b10: 32 28 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20  2(pData);.  i = 
8b20: 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  4;..  /* Read th
8b30: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8b40: 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67  f levels and seg
8b50: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73  ments from the s
8b60: 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tart of the.  **
8b70: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
8b80: 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74  d.  */.  i += ft
8b90: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8ba0: 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29  Data[i], nLevel)
8bb0: 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  ;.  i += fts5Get
8bc0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8bd0: 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20  i], nSegment);. 
8be0: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
8bf0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8c00: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8c20: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
8c30: 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
8c40: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
8c50: 29 20 2a 20 28 6e 4c 65 76 65 6c 29 20 20 20 20  ) * (nLevel)    
8c60: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
8c70: 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52  ray */.  );.  pR
8c80: 65 74 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  et = (Fts5Struct
8c90: 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ure*)sqlite3Fts5
8ca0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
8cb0: 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  nByte);..  if( p
8cc0: 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d  Ret ){.    pRet-
8cd0: 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c  >nLevel = nLevel
8ce0: 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67  ;.    pRet->nSeg
8cf0: 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b  ment = nSegment;
8d00: 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  .    i += sqlite
8d10: 33 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  3GetVarint(&pDat
8d20: 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72  a[i], &pRet->nWr
8d30: 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  iteCounter);..  
8d40: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63    for(iLvl=0; rc
8d50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
8d60: 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  Lvl<nLevel; iLvl
8d70: 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
8d80: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
8d90: 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65  Lvl = &pRet->aLe
8da0: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
8db0: 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a 20 20 20   int nTotal;.   
8dc0: 20 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20     int iSeg;..  
8dd0: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8de0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8df0: 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  i], pLvl->nMerge
8e00: 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  );.      i += ft
8e10: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8e20: 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29  Data[i], nTotal)
8e30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8e40: 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d  nTotal>=pLvl->nM
8e50: 65 72 67 65 20 29 3b 0a 20 20 20 20 20 20 70 4c  erge );.      pL
8e60: 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  vl->aSeg = (Fts5
8e70: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8e80: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
8e90: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20  locZero(&rc, .  
8ea0: 20 20 20 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a          nTotal *
8eb0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8ec0: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 0a 20 20  ctureSegment).  
8ed0: 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66      );..      if
8ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8ef0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  ){.        pLvl-
8f00: 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a  >nSeg = nTotal;.
8f10: 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
8f20: 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b  =0; iSeg<nTotal;
8f30: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
8f40: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8f50: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8f60: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
8f70: 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  Seg].iSegid);.  
8f80: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
8f90: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
8fa0: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
8fb0: 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74  eg[iSeg].nHeight
8fc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
8fd0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
8fe0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
8ff0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
9000: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
9010: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
9020: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
9030: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
9040: 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg].pgnoLast);.
9050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9060: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
9070: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
9080: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
9090: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
90a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
90b0: 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b    *ppOut = pRet;
90c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
90d0: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
90e0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
90f0: 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20  ureAddLevel(int 
9100: 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74  *pRc, Fts5Struct
9110: 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b  ure **ppStruct){
9120: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
9130: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
9140: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9150: 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
9160: 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c  ;.    int nLevel
9170: 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   = pStruct->nLev
9180: 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  el;.    int nByt
9190: 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69  e = (.        si
91a0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
91b0: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
91c0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
91d0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
91e0: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
91f0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
9200: 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20   (nLevel+1)  /* 
9210: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
9220: 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53  /.    );..    pS
9230: 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f  truct = sqlite3_
9240: 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c  realloc(pStruct,
9250: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
9260: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
9270: 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63    memset(&pStruc
9280: 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c  t->aLevel[nLevel
9290: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  ], 0, sizeof(Fts
92a0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
92b0: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
92c0: 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20  ->nLevel++;.    
92d0: 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
92e0: 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65  truct;.    }else
92f0: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
9300: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9310: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9320: 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76  Extend level iLv
9330: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  l so that there 
9340: 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c  is room for at l
9350: 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65  east nExtra more
9360: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f  .** segments..*/
9370: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9380: 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
9390: 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52  Level(.  int *pR
93a0: 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74  c, .  Fts5Struct
93b0: 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20  ure *pStruct, . 
93c0: 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e   int iLvl, .  in
93d0: 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74  t nExtra, .  int
93e0: 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66   bInsert.){.  if
93f0: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
9400: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
9410: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
9420: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
9430: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
9440: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9450: 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20  ment *aNew;.    
9460: 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  int nByte;..    
9470: 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nByte = (pLvl->n
9480: 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20  Seg + nExtra) * 
9490: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
94a0: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
94b0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
94c0: 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61  _realloc(pLvl->a
94d0: 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Seg, nByte);.   
94e0: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
94f0: 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d     if( bInsert==
9500: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ){.        mem
9510: 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e  set(&aNew[pLvl->
9520: 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSeg], 0, sizeof
9530: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
9540: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
9550: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9560: 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65         int nMove
9570: 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20   = pLvl->nSeg * 
9580: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
9590: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
95a0: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61        memmove(&a
95b0: 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65  New[nExtra], aNe
95c0: 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20  w, nMove);.     
95d0: 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20     memset(aNew, 
95e0: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
95f0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20  ructureSegment) 
9600: 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  * nExtra);.     
9610: 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61   }.      pLvl->a
9620: 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  Seg = aNew;.    
9630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
9640: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
9650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9660: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
9670: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
9680: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
9690: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  record..**.** Th
96a0: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
96b0: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
96c0: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
96d0: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
96e0: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
96f0: 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72  located as descr
9700: 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f  ibed for functio
9710: 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  n fts5StructureD
9720: 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76  ecode() .** abov
9730: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
9740: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
9750: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
9760: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
9770: 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46  left in the.** F
9780: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
9790: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
97a0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
97b0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
97c0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
97d0: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
97e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
97f0: 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53  Structure *fts5S
9800: 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73  tructureRead(Fts
9810: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
9820: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
9830: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
9840: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
9850: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
9860: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72    /* Object to r
9870: 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73 35 44  eturn */.  Fts5D
9880: 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20  ata *pData;     
9890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 25 5f             /* %_
98a0: 64 61 74 61 20 65 6e 74 72 79 20 63 6f 6e 74 61  data entry conta
98b0: 69 6e 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  ining structure 
98c0: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
98d0: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
98f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
9900: 6b 69 65 20 2a 2f 0a 0a 20 20 70 44 61 74 61 20  kie */..  pData 
9910: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
9920: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
9930: 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 21  _ROWID);.  if( !
9940: 70 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 30  pData ) return 0
9950: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35  ;.  p->rc = fts5
9960: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
9970: 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d  pData->p, pData-
9980: 3e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70  >n, &iCookie, &p
9990: 52 65 74 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  Ret);..  if( p->
99a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
99b0: 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69   pConfig->iCooki
99c0: 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20  e!=iCookie ){.  
99d0: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
99e0: 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28  3Fts5ConfigLoad(
99f0: 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65  pConfig, iCookie
9a00: 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61  );.  }..  fts5Da
9a10: 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
9a20: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ;.  if( p->rc!=S
9a30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9a40: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
9a50: 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20  ease(pRet);.    
9a60: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
9a70: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
9a80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9a90: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9aa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64   segments in ind
9ab0: 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74  ex structure pSt
9ac0: 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ruct. This.** fu
9ad0: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
9ae0: 76 65 72 20 75 73 65 64 20 61 73 20 70 61 72 74  ver used as part
9af0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e   of assert() con
9b00: 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64  ditions..*/.#ifd
9b10: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9b20: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
9b30: 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67  tructureCountSeg
9b40: 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63 74  ments(Fts5Struct
9b50: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
9b60: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
9b70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9b80: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
9b90: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a   of segments */.
9ba0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
9bb0: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
9be0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
9bf0: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  vels */.    for(
9c00: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
9c10: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
9c20: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65  vl++){.      nSe
9c30: 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74  gment += pStruct
9c40: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
9c50: 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Seg;.    }.  }..
9c60: 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e    return nSegmen
9c70: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t;.}.#endif../*.
9c80: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64  ** Serialize and
9c90: 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75   store the "stru
9ca0: 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a  cture" record..*
9cb0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
9cc0: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
9cd0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  n error code in 
9ce0: 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62  the Fts5Index ob
9cf0: 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65  ject. If an.** e
9d00: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
9d10: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
9d20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
9d30: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
9d40: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
9d50: 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  eWrite(Fts5Index
9d60: 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75   *p, Fts5Structu
9d70: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
9d80: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9d90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
9da0: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
9db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
9dc0: 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65  fer to serialize
9dd0: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a   record into */.
9de0: 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
9e10: 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
9e20: 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  els */.    int i
9e30: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
9e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b           /* Cook
9e50: 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72  ie value to stor
9e60: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
9e70: 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
9e80: 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
9e90: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
9ea0: 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
9eb0: 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
9ec0: 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
9ed0: 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  r));..    /* App
9ee0: 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  end the current 
9ef0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  configuration co
9f00: 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f  okie */.    iCoo
9f10: 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  kie = p->pConfig
9f20: 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69  ->iCookie;.    i
9f30: 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69  f( iCookie<0 ) i
9f40: 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 20 20  Cookie = 0;.    
9f50: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9f60: 33 32 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  32(&p->rc, &buf,
9f70: 20 69 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20 20 20   iCookie);..    
9f80: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9f90: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9fa0: 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  buf, pStruct->nL
9fb0: 65 76 65 6c 29 3b 0a 20 20 20 20 66 74 73 35 42  evel);.    fts5B
9fc0: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
9fd0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
9fe0: 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
9ff0: 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  t);.    fts5Buff
a000: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
a010: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36  p->rc, &buf, (i6
a020: 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  4)pStruct->nWrit
a030: 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  eCounter);..    
a040: 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
a050: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
a060: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
a070: 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20   int iSeg;      
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a090: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
a0a0: 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
a0b0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  ts */.      Fts5
a0c0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
a0d0: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
a0e0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
a0f0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
a100: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
a110: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
a120: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66  nMerge);.      f
a130: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
a140: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
a150: 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b  uf, pLvl->nSeg);
a160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a170: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
a180: 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20  l->nSeg );..    
a190: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
a1a0: 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
a1b0: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
a1c0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
a1d0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
a1e0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
a1f0: 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20  iSeg].iSegid);. 
a200: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
a210: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
a220: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
a230: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65  ->aSeg[iSeg].nHe
a240: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 66  ight);.        f
a250: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
a260: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
a270: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
a280: 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg].pgnoFirst);
a290: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
a2a0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
a2b0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
a2c0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
a2d0: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
a2e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
a2f0: 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
a300: 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57  S5_STRUCTURE_ROW
a310: 49 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e  ID, buf.p, buf.n
a320: 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
a330: 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d  rFree(&buf);.  }
a340: 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63  .}..#if 0.static
a350: 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 53   void fts5DebugS
a360: 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74  tructure(int*,Ft
a370: 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74  s5Buffer*,Fts5St
a380: 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69  ructure*);.stati
a390: 63 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74  c void fts5Print
a3a0: 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20  Structure(const 
a3b0: 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20  char *zCaption, 
a3c0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
a3d0: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72  Struct){.  int r
a3e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a3f0: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
a400: 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20  .  memset(&buf, 
a410: 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b  0, sizeof(buf));
a420: 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75  .  fts5DebugStru
a430: 63 74 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c  cture(&rc, &buf,
a440: 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72   pStruct);.  fpr
a450: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73  intf(stdout, "%s
a460: 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f  : %s\n", zCaptio
a470: 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c  n, buf.p);.  ffl
a480: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66  ush(stdout);.  f
a490: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
a4a0: 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  uf);.}.#else.# d
a4b0: 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53  efine fts5PrintS
a4c0: 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65  tructure(x,y).#e
a4d0: 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74  ndif..static int
a4e0: 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65   fts5SegmentSize
a4f0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
a500: 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20  gment *pSeg){.  
a510: 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d  return 1 + pSeg-
a520: 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67  >pgnoLast - pSeg
a530: 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a  ->pgnoFirst;.}..
a540: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63  /*.** Return a c
a550: 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72  opy of index str
a560: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
a570: 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20  Except, promote 
a580: 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d  as many .** segm
a590: 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ents as possible
a5a0: 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f   to level iPromo
a5b0: 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63  te. If an OOM oc
a5c0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a  curs, NULL is .*
a5d0: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
a5e0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
a5f0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
a600: 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  o(.  Fts5Index *
a610: 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74  p,.  int iPromot
a620: 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f  e,.  int szPromo
a630: 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  te,.  Fts5Struct
a640: 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a  ure *pStruct.){.
a650: 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20    int il, is;.  
a660: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
a670: 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72  el *pOut = &pStr
a680: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f  uct->aLevel[iPro
a690: 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f  mote];..  if( pO
a6a0: 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  ut->nMerge==0 ){
a6b0: 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f  .    for(il=iPro
a6c0: 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75  mote+1; il<pStru
a6d0: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b  ct->nLevel; il++
a6e0: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
a6f0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
a700: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
a710: 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20  evel[il];.      
a720: 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
a730: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
a740: 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53   for(is=pLvl->nS
a750: 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d  eg-1; is>=0; is-
a760: 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  -){.        int 
a770: 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74  sz = fts5Segment
a780: 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67  Size(&pLvl->aSeg
a790: 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  [is]);.        i
a7a0: 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20  f( sz>szPromote 
a7b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
a7c0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
a7d0: 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
a7e0: 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f  c, pStruct, iPro
a7f0: 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  mote, 1, 1);.   
a800: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
a810: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a820: 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53   memcpy(pOut->aS
a830: 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  eg, &pLvl->aSeg[
a840: 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  is], sizeof(Fts5
a850: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
a860: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74  ));.        pOut
a870: 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20  ->nSeg++;.      
a880: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a    pLvl->nSeg--;.
a890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a8a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77  }.}../*.** A new
a8b0: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73   segment has jus
a8c0: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
a8d0: 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20  o level iLvl of 
a8e0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 0a  index structure.
a8f0: 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69 73  ** pStruct. This
a900: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
a910: 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d  ines if any segm
a920: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ents should be p
a930: 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20  romoted.** as a 
a940: 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73  result. Segments
a950: 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e   are promoted in
a960: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
a970: 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68  **.**   a) If th
a980: 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  e segment just w
a990: 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65  ritten is smalle
a9a0: 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f  r than one or mo
a9b0: 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20  re segments.**  
a9c0: 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70      within the p
a9d0: 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65  revious populate
a9e0: 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70  d level, it is p
a9f0: 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70  romoted to the p
aa00: 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20  revious.**      
aa10: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e  populated level.
aa20: 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74  .**.**   b) If t
aa30: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
aa40: 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65  written is large
aa50: 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73  r than the newes
aa60: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20  t segment on.** 
aa70: 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f       the next po
aa80: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74  pulated level, t
aa90: 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74  hen that segment
aaa0: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
aab0: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20  adjacent.**     
aac0: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61   segments that a
aad0: 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20  re also smaller 
aae0: 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73  than the one jus
aaf0: 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a  t written, are .
ab00: 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64  **      promoted
ab10: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  . .**.** If one 
ab20: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
ab30: 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74   are promoted, t
ab40: 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  he structure obj
ab50: 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a  ect is updated.*
ab60: 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69  * to reflect thi
ab70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
ab80: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50  d fts5StructureP
ab90: 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e  romote(.  Fts5In
aba0: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
abb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
abc0: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
abd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20   */.  int iLvl, 
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c        /* Index l
ac00: 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65  evel just update
ac10: 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  d */.  Fts5Struc
ac20: 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20 20  ture *pStruct   
ac30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
ac40: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
ac50: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ac60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
ac70: 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20  t iTst;.    int 
ac80: 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20  iPromote = -1;. 
ac90: 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65     int szPromote
aca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
acb0: 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74   /* Promote anyt
acc0: 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f  hing this size o
acd0: 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  r smaller */.   
ace0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
acf0: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f  gment *pSeg;   /
ad00: 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  * Segment just w
ad10: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
ad20: 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20  t szSeg;        
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ad40: 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a  ize of segment j
ad50: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a  ust written */..
ad60: 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74  .    pSeg = &pSt
ad70: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
ad80: 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74 2d  l].aSeg[pStruct-
ad90: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
ada0: 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67  eg-1];.    szSeg
adb0: 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70 67   = (1 + pSeg->pg
adc0: 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70  noLast - pSeg->p
add0: 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20 20  gnoFirst);..    
ade0: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e  /* Check for con
adf0: 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20  dition (a) */.  
ae00: 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d    for(iTst=iLvl-
ae10: 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70 53  1; iTst>=0 && pS
ae20: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54  truct->aLevel[iT
ae30: 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73  st].nSeg==0; iTs
ae40: 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20 69 54  t--);.    if( iT
ae50: 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  st>=0 ){.      i
ae60: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
ae70: 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  szMax = 0;.     
ae80: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
ae90: 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70 53 74  vel *pTst = &pSt
aea0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73  ruct->aLevel[iTs
aeb0: 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t];.      assert
aec0: 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d  ( pTst->nMerge==
aed0: 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
aee0: 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67  =0; i<pTst->nSeg
aef0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
af00: 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61  int sz = pTst->a
af10: 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20  Seg[i].pgnoLast 
af20: 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  - pTst->aSeg[i].
af30: 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20  pgnoFirst + 1;. 
af40: 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a         if( sz>sz
af50: 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a  Max ) szMax = sz
af60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
af70: 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67  if( szMax>=szSeg
af80: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
af90: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20  ondition (a) is 
afa0: 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68  true. Promote th
afb0: 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74  e newest segment
afc0: 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20 20   on level .     
afd0: 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65     ** iLvl to le
afe0: 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20  vel iTst.  */.  
aff0: 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d        iPromote =
b000: 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20 73   iTst;.        s
b010: 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78  zPromote = szMax
b020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b030: 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69  .    /* If condi
b040: 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74 20  tion (a) is not 
b050: 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62 29 20  met, assume (b) 
b060: 69 73 20 74 72 75 65 2e 20 53 74 72 75 63 74 75  is true. Structu
b070: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20  rePromoteTo().  
b080: 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
b090: 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a  if it is not.  *
b0a0: 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d 6f  /.    if( iPromo
b0b0: 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 50  te<0 ){.      iP
b0c0: 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20  romote = iLvl;. 
b0d0: 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d       szPromote =
b0e0: 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20   szSeg;.    }.  
b0f0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
b100: 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f  romoteTo(p, iPro
b110: 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c  mote, szPromote,
b120: 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d   pStruct);.  }.}
b130: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
b140: 70 49 74 65 72 2d 3e 69 4f 66 66 20 6f 66 66 73  pIter->iOff offs
b150: 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  et currently poi
b160: 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
b170: 69 6e 64 69 63 61 74 69 6e 67 20 6f 6e 65 0a 2a  indicating one.*
b180: 2a 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 2d 6c  * or more term-l
b190: 65 73 73 20 6e 6f 64 65 73 2c 20 61 64 76 61 6e  ess nodes, advan
b1a0: 63 65 20 70 61 73 74 20 69 74 20 61 6e 64 20 73  ce past it and s
b1b0: 65 74 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79  et pIter->nEmpty
b1c0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   to.** the numbe
b1d0: 72 20 6f 66 20 65 6d 70 74 79 20 63 68 69 6c 64  r of empty child
b1e0: 20 6e 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   nodes..*/.stati
b1f0: 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49  c void fts5NodeI
b200: 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28  terGobbleNEmpty(
b210: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49  Fts5NodeIter *pI
b220: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
b230: 72 2d 3e 69 4f 66 66 3c 70 49 74 65 72 2d 3e 6e  r->iOff<pIter->n
b240: 44 61 74 61 20 26 26 20 30 3d 3d 28 70 49 74 65  Data && 0==(pIte
b250: 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e  r->aData[pIter->
b260: 69 4f 66 66 5d 20 26 20 30 78 66 65 29 20 29 7b  iOff] & 0xfe) ){
b270: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69  .    pIter->bDli
b280: 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 44 61 74  dx = pIter->aDat
b290: 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26  a[pIter->iOff] &
b2a0: 20 30 78 30 31 3b 0a 20 20 20 20 70 49 74 65 72   0x01;.    pIter
b2b0: 2d 3e 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 70 49  ->iOff++;.    pI
b2c0: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  ter->iOff += fts
b2d0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49  5GetVarint32(&pI
b2e0: 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72  ter->aData[pIter
b2f0: 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72 2d 3e  ->iOff], pIter->
b300: 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c 73 65  nEmpty);.  }else
b310: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d  {.    pIter->nEm
b320: 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  pty = 0;.    pIt
b330: 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30 3b 0a  er->bDlidx = 0;.
b340: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76    }.}../*.** Adv
b350: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
b360: 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20 74 68   entry within th
b370: 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e node..*/.stati
b380: 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49  c void fts5NodeI
b390: 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70 52 63  terNext(int *pRc
b3a0: 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a  , Fts5NodeIter *
b3b0: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
b3c0: 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72  ter->iOff>=pIter
b3d0: 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 70  ->nData ){.    p
b3e0: 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b  Iter->aData = 0;
b3f0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69  .    pIter->iChi
b400: 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 45 6d  ld += pIter->nEm
b410: 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pty;.  }else{.  
b420: 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e 65 77    int nPre, nNew
b430: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66  ;.    pIter->iOf
b440: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
b450: 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61  nt32(&pIter->aDa
b460: 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c  ta[pIter->iOff],
b470: 20 6e 50 72 65 29 3b 0a 20 20 20 20 70 49 74 65   nPre);.    pIte
b480: 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  r->iOff += fts5G
b490: 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
b4a0: 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e  r->aData[pIter->
b4b0: 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
b4c0: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
b4d0: 3d 20 6e 50 72 65 2d 32 3b 0a 20 20 20 20 66 74  = nPre-2;.    ft
b4e0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
b4f0: 6f 62 28 70 52 63 2c 20 26 70 49 74 65 72 2d 3e  ob(pRc, &pIter->
b500: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 70 49 74 65  term, nNew, pIte
b510: 72 2d 3e 61 44 61 74 61 2b 70 49 74 65 72 2d 3e  r->aData+pIter->
b520: 69 4f 66 66 29 3b 0a 20 20 20 20 70 49 74 65 72  iOff);.    pIter
b530: 2d 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a  ->iOff += nNew;.
b540: 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69 6c      pIter->iChil
b550: 64 20 2b 3d 20 28 31 20 2b 20 70 49 74 65 72 2d  d += (1 + pIter-
b560: 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 66 74  >nEmpty);.    ft
b570: 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65  s5NodeIterGobble
b580: 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a 20  NEmpty(pIter);. 
b590: 20 20 20 69 66 28 20 2a 70 52 63 20 29 20 70 49     if( *pRc ) pI
b5a0: 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b 0a  ter->aData = 0;.
b5b0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e    }.}.../*.** In
b5c0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65  itialize the ite
b5d0: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74  rator object pIt
b5e0: 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  er to iterate th
b5f0: 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72 6e  rough the intern
b600: 61 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6e 6f  al.** segment no
b610: 64 65 20 69 6e 20 70 44 61 74 61 2e 0a 2a 2f 0a  de in pData..*/.
b620: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b630: 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 63 6f 6e  NodeIterInit(con
b640: 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 69 6e  st u8 *aData, in
b650: 74 20 6e 44 61 74 61 2c 20 46 74 73 35 4e 6f 64  t nData, Fts5Nod
b660: 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  eIter *pIter){. 
b670: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
b680: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
b690: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 44 61 74  );.  pIter->aDat
b6a0: 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 49 74  a = aData;.  pIt
b6b0: 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74  er->nData = nDat
b6c0: 61 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  a;.  pIter->iOff
b6d0: 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
b6e0: 33 32 28 61 44 61 74 61 2c 20 70 49 74 65 72 2d  32(aData, pIter-
b6f0: 3e 69 43 68 69 6c 64 29 3b 0a 20 20 66 74 73 35  >iChild);.  fts5
b700: 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e 45  NodeIterGobbleNE
b710: 6d 70 74 79 28 70 49 74 65 72 29 3b 0a 7d 0a 0a  mpty(pIter);.}..
b720: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6d  /*.** Free any m
b730: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
b740: 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  by the iterator 
b750: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
b760: 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49  c void fts5NodeI
b770: 74 65 72 46 72 65 65 28 46 74 73 35 4e 6f 64 65  terFree(Fts5Node
b780: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b790: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
b7a0: 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a  pIter->term);.}.
b7b0: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
b7c0: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
b7d0: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
b7e0: 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  rgument. If the 
b7f0: 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64  end of the .** d
b800: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67  oclist-index pag
b810: 65 20 69 73 20 72 65 61 63 68 65 64 2c 20 72 65  e is reached, re
b820: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
b830: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
b840: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74  5DlidxLvlNext(Ft
b850: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
b860: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
b870: 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61  Data = pLvl->pDa
b880: 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d  ta;..  if( pLvl-
b890: 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >iOff==0 ){.    
b8a0: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45  assert( pLvl->bE
b8b0: 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  of==0 );.    pLv
b8c0: 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20  l->iOff = 1;.   
b8d0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66   pLvl->iOff += f
b8e0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
b8f0: 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76  pData->p[1], pLv
b900: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  l->iLeafPgno);. 
b910: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d     pLvl->iOff +=
b920: 20 67 65 74 56 61 72 69 6e 74 28 26 70 44 61 74   getVarint(&pDat
b930: 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d  a->p[pLvl->iOff]
b940: 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69  , (u64*)&pLvl->i
b950: 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c  Rowid);.    pLvl
b960: 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c  ->iFirstOff = pL
b970: 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73  vl->iOff;.  }els
b980: 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  e{.    int iOff;
b990: 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c  .    for(iOff=pL
b9a0: 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70  vl->iOff; iOff<p
b9b0: 44 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29  Data->n; iOff++)
b9c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  {.      if( pDat
b9d0: 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65  a->p[iOff] ) bre
b9e0: 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ak; .    }..    
b9f0: 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  if( iOff<pData->
ba00: 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  n ){.      i64 i
ba10: 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  Val;.      pLvl-
ba20: 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69  >iLeafPgno += (i
ba30: 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off - pLvl->iOff
ba40: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66  ) + 1;.      iOf
ba50: 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  f += getVarint(&
ba60: 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pData->p[iOff], 
ba70: 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20  (u64*)&iVal);.  
ba80: 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64      pLvl->iRowid
ba90: 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20   += iVal;.      
baa0: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  pLvl->iOff = iOf
bab0: 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  f;.    }else{.  
bac0: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
bad0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
bae0: 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45   return pLvl->bE
baf0: 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  of;.}../*.** Adv
bb00: 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
bb10: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
bb20: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
bb30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
bb40: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28  5DlidxIterNextR(
bb50: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
bb60: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bb70: 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20  er, int iLvl){. 
bb80: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
bb90: 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
bba0: 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73  vl[iLvl];..  ass
bbb0: 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d  ert( iLvl<pIter-
bbc0: 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66  >nLvl );.  if( f
bbd0: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
bbe0: 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  pLvl) ){.    if(
bbf0: 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65   (iLvl+1) < pIte
bc00: 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20  r->nLvl ){.     
bc10: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
bc20: 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  xtR(p, pIter, iL
bc30: 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  vl+1);.      if(
bc40: 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30   pLvl[1].bEof==0
bc50: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
bc60: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c  DataRelease(pLvl
bc70: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
bc80: 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30    memset(pLvl, 0
bc90: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
bca0: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20  dxLvl));.       
bcb0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
bcc0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35              FTS5
bce0: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74  _DLIDX_ROWID(pIt
bcf0: 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c  er->iSegid, iLvl
bd00: 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50  , pLvl[1].iLeafP
bd10: 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
bd20: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
bd30: 2d 3e 70 44 61 74 61 20 29 20 66 74 73 35 44 6c  ->pData ) fts5Dl
bd40: 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29  idxLvlNext(pLvl)
bd50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bd60: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
bd70: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
bd80: 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  f;.}.static int 
bd90: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
bda0: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
bdb0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
bdc0: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
bdd0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
bde0: 74 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  tR(p, pIter, 0);
bdf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
be00: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
be10: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
be20: 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c  ent has the foll
be30: 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74  owing fields set
be40: 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20  .** as follows. 
be50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
be60: 74 73 20 75 70 20 74 68 65 20 72 65 73 74 20 6f  ts up the rest o
be70: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  f the iterator s
be80: 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69  o that it.** poi
be90: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
bea0: 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f   rowid in the do
beb0: 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a  clist-index..**.
bec0: 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20  **   pData:.**  
bed0: 20 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f     pointer to do
bee0: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
bef0: 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  rd, .**.** When 
bf00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
bf10: 20 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69   called pIter->i
bf20: 4c 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20  LeafPgno is the 
bf30: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a  page number the.
bf40: 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73  ** doclist is as
bf50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 28 74  sociated with (t
bf60: 68 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67  he one featuring
bf70: 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73   the term)..*/.s
bf80: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
bf90: 69 64 78 49 74 65 72 46 69 72 73 74 28 46 74 73  idxIterFirst(Fts
bfa0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
bfb0: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
bfc0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
bfd0: 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
bfe0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
bff0: 74 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  t(&pIter->aLvl[i
c000: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
c010: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
c020: 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  bEof;.}...static
c030: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
c040: 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20  erEof(Fts5Index 
c050: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
c060: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
c070: 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  urn p->rc!=SQLIT
c080: 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61  E_OK || pIter->a
c090: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a  Lvl[0].bEof;.}..
c0a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c0b0: 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46 74  DlidxIterLast(Ft
c0c0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
c0d0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
c0e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
c0f0: 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c  * Advance each l
c100: 65 76 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74  evel to the last
c110: 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61   entry on the la
c120: 73 74 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72  st page */.  for
c130: 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31  (i=pIter->nLvl-1
c140: 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
c150: 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29  OK && i>=0; i--)
c160: 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c  {.    Fts5DlidxL
c170: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
c180: 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20  r->aLvl[i];.    
c190: 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
c1a0: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30  LvlNext(pLvl)==0
c1b0: 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45   );.    pLvl->bE
c1c0: 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  of = 0;..    if(
c1d0: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74   i>0 ){.      Ft
c1e0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69  s5DlidxLvl *pChi
c1f0: 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a  ld = &pLvl[-1];.
c200: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
c210: 6c 65 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44  lease(pChild->pD
c220: 61 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  ata);.      mems
c230: 65 74 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69  et(pChild, 0, si
c240: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
c250: 6c 29 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c  l));.      pChil
c260: 64 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44  d->pData = fts5D
c270: 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20  ataRead(p, .    
c280: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
c290: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
c2a0: 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d  egid, i-1, pLvl-
c2b0: 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20  >iLeafPgno).    
c2c0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
c2d0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
c2e0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
c2f0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
c300: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65  ument to the pre
c310: 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a  vious entry..*/.
c320: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
c330: 6c 69 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35  lidxLvlPrev(Fts5
c340: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b  DlidxLvl *pLvl){
c350: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c  .  int iOff = pL
c360: 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73  vl->iOff;..  ass
c370: 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d  ert( pLvl->bEof=
c380: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66  =0 );.  if( iOff
c390: 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  <=pLvl->iFirstOf
c3a0: 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62  f ){.    pLvl->b
c3b0: 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Eof = 1;.  }else
c3c0: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c  {.    u8 *a = pL
c3d0: 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20  vl->pData->p;.  
c3e0: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
c3f0: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
c400: 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20  int ii;.    int 
c410: 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20  nZero = 0;..    
c420: 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66  /* Currently iOf
c430: 66 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  f points to the 
c440: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 20  first byte of a 
c450: 76 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f  varint. This blo
c460: 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65  ck .    ** decre
c470: 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c  ments iOff until
c480: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
c490: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c4a0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20  the previous .  
c4b0: 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b    ** varint. Tak
c4c0: 69 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20  ing care not to 
c4d0: 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20  read any memory 
c4e0: 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f  locations that o
c4f0: 63 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f  ccur.    ** befo
c500: 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  re the buffer in
c510: 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20   memory.  */.   
c520: 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e   iLimit = (iOff>
c530: 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b  9 ? iOff-9 : 0);
c540: 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b  .    for(iOff--;
c550: 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f   iOff>iLimit; iO
c560: 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  ff--){.      if(
c570: 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78   (a[iOff-1] & 0x
c580: 38 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  80)==0 ) break;.
c590: 20 20 20 20 7d 0a 0a 20 20 20 20 67 65 74 56 61      }..    getVa
c5a0: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
c5b0: 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20  u64*)&iVal);.   
c5c0: 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d   pLvl->iRowid -=
c5d0: 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d   iVal;.    pLvl-
c5e0: 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20  >iLeafPgno--;.. 
c5f0: 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77     /* Skip backw
c600: 61 72 64 73 20 70 61 73 74 20 61 6e 79 20 30 78  ards past any 0x
c610: 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20  00 varints. */. 
c620: 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31     for(ii=iOff-1
c630: 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72  ; ii>=pLvl->iFir
c640: 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d  stOff && a[ii]==
c650: 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20  0x00; ii--){.   
c660: 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20     nZero++;.    
c670: 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d 70 4c  }.    if( ii>=pL
c680: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26  vl->iFirstOff &&
c690: 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30 29 20   (a[ii] & 0x80) 
c6a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
c6b0: 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  byte immediately
c6c0: 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74   before the last
c6d0: 20 30 78 30 30 20 62 79 74 65 20 68 61 73 20 74   0x00 byte has t
c6e0: 68 65 20 30 78 38 30 20 62 69 74 0a 20 20 20 20  he 0x80 bit.    
c6f0: 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68 65    ** set. So the
c700: 20 6c 61 73 74 20 30 78 30 30 20 69 73 20 6f 6e   last 0x00 is on
c710: 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20 69 66  ly a varint 0 if
c720: 20 74 68 65 72 65 20 61 72 65 20 38 20 6d 6f 72   there are 8 mor
c730: 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a 2a 20  e 0x80.      ** 
c740: 62 79 74 65 73 20 62 65 66 6f 72 65 20 61 5b 69  bytes before a[i
c750: 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  i]. */.      int
c760: 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20   bZero = 0;     
c770: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
c780: 20 69 66 20 6c 61 73 74 20 30 78 30 30 20 63 6f   if last 0x00 co
c790: 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  unts */.      if
c7a0: 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e  ( (ii-8)>=pLvl->
c7b0: 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20  iFirstOff ){.   
c7c0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
c7d0: 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d      for(j=1; j<=
c7e0: 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20  8 && (a[ii-j] & 
c7f0: 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20  0x80); j++);.   
c800: 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e       bZero = (j>
c810: 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
c820: 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29    if( bZero==0 )
c830: 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a   nZero--;.    }.
c840: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
c850: 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20  gno -= nZero;.  
c860: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69    pLvl->iOff = i
c870: 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d  Off - nZero;.  }
c880: 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d  ..  return pLvl-
c890: 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63  >bEof;.}..static
c8a0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
c8b0: 65 72 50 72 65 76 52 28 46 74 73 35 49 6e 64 65  erPrevR(Fts5Inde
c8c0: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
c8d0: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
c8e0: 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69  iLvl){.  Fts5Dli
c8f0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
c900: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d  Iter->aLvl[iLvl]
c910: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
c920: 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b  l<pIter->nLvl );
c930: 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78  .  if( fts5Dlidx
c940: 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20 29 7b  LvlPrev(pLvl) ){
c950: 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31  .    if( (iLvl+1
c960: 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  ) < pIter->nLvl 
c970: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
c980: 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20 70  dxIterPrevR(p, p
c990: 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20  Iter, iLvl+1);. 
c9a0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d       if( pLvl[1]
c9b0: 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  .bEof==0 ){.    
c9c0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
c9d0: 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
c9e0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
c9f0: 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pLvl, 0, sizeof
ca00: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
ca10: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  .        pLvl->p
ca20: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
ca30: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
ca40: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
ca50: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
ca60: 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31  id, iLvl, pLvl[1
ca70: 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ].iLeafPgno).   
ca80: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
ca90: 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20  if( pLvl->pData 
caa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
cab0: 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  le( fts5DlidxLvl
cac0: 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b  Next(pLvl)==0 );
cad0: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  .          pLvl-
cae0: 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20  >bEof = 0;.     
caf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
cb00: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
cb10: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
cb20: 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bEof;.}.static i
cb30: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
cb40: 50 72 65 76 28 46 74 73 35 49 6e 64 65 78 20 2a  Prev(Fts5Index *
cb50: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
cb60: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
cb70: 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  rn fts5DlidxIter
cb80: 50 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20  PrevR(p, pIter, 
cb90: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  0);.}../*.** Fre
cba0: 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  e a doclist-inde
cbb0: 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  x iterator objec
cbc0: 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  t allocated by f
cbd0: 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
cbe0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
cbf0: 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  id fts5DlidxIter
cc00: 46 72 65 65 28 46 74 73 35 44 6c 69 64 78 49 74  Free(Fts5DlidxIt
cc10: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
cc20: 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69  ( pIter ){.    i
cc30: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
cc40: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c  0; i<pIter->nLvl
cc50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
cc60: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
cc70: 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61  ter->aLvl[i].pDa
cc80: 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ta);.    }.    s
cc90: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
cca0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
ccb0: 63 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  c Fts5DlidxIter 
ccc0: 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  *fts5DlidxIterIn
ccd0: 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
cce0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ccf0: 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61        /* Fts5 Ba
cd00: 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
cd10: 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74   within */.  int
cd20: 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd40: 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42  True for ORDER B
cd50: 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69  Y ASC */.  int i
cd60: 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
cd70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
cd80: 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
cd90: 74 20 69 4c 65 61 66 50 67 20 20 20 20 20 20 20  t iLeafPg       
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cdb0: 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   Leaf page numbe
cdc0: 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20  r to load dlidx 
cdd0: 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  for */.){.  Fts5
cde0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
cdf0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
ce00: 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
ce10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
ce20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ce30: 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a  bDone==0; i++){.
ce40: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
ce50: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
ce60: 49 74 65 72 29 20 2b 20 69 20 2a 20 73 69 7a 65  Iter) + i * size
ce70: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
ce80: 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 49  ;.    Fts5DlidxI
ce90: 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20  ter *pNew;..    
cea0: 70 4e 65 77 20 3d 20 28 46 74 73 35 44 6c 69 64  pNew = (Fts5Dlid
ceb0: 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72  xIter*)sqlite3_r
cec0: 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42  ealloc(pIter, nB
ced0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  yte);.    if( pN
cee0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
cef0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
cf00: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
cf10: 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
cf20: 20 3d 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f   = FTS5_DLIDX_RO
cf30: 57 49 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69  WID(iSegid, i, i
cf40: 4c 65 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46  LeafPg);.      F
cf50: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
cf60: 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b  l = &pNew->aLvl[
cf70: 69 5d 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20  i];.      pIter 
cf80: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65  = pNew;.      me
cf90: 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69  mset(pLvl, 0, si
cfa0: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
cfb0: 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  l));.      pLvl-
cfc0: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
cfd0: 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29  aRead(p, iRowid)
cfe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
cff0: 2d 3e 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c  ->pData && (pLvl
d000: 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20  ->pData->p[0] & 
d010: 30 78 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20  0x0001)==0 ){.  
d020: 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b        bDone = 1;
d030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d040: 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31  Iter->nLvl = i+1
d050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
d060: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
d070: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
d080: 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
d090: 64 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d  d;.    if( bRev=
d0a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
d0b0: 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 70  DlidxIterFirst(p
d0c0: 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Iter);.    }else
d0d0: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
d0e0: 78 49 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74  xIterLast(p, pIt
d0f0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
d100: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
d110: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
d120: 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
d130: 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65  pIter);.    pIte
d140: 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  r = 0;.  }..  re
d150: 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73  turn pIter;.}..s
d160: 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c  tatic i64 fts5Dl
d170: 69 64 78 49 74 65 72 52 6f 77 69 64 28 46 74 73  idxIterRowid(Fts
d180: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
d190: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74  r){.  return pIt
d1a0: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77  er->aLvl[0].iRow
d1b0: 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  id;.}.static int
d1c0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
d1d0: 6e 6f 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  no(Fts5DlidxIter
d1e0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
d1f0: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
d200: 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a  ].iLeafPgno;.}..
d210: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d220: 4c 65 61 66 48 65 61 64 65 72 28 46 74 73 35 44  LeafHeader(Fts5D
d230: 61 74 61 20 2a 70 4c 65 61 66 2c 20 69 6e 74 20  ata *pLeaf, int 
d240: 2a 70 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70  *piRowid, int *p
d250: 69 54 65 72 6d 29 7b 0a 20 20 2a 70 69 52 6f 77  iTerm){.  *piRow
d260: 69 64 20 3d 20 28 69 6e 74 29 66 74 73 35 47 65  id = (int)fts5Ge
d270: 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30  tU16(&pLeaf->p[0
d280: 5d 29 3b 0a 20 20 2a 70 69 54 65 72 6d 20 3d 20  ]);.  *piTerm = 
d290: 28 69 6e 74 29 66 74 73 35 47 65 74 55 31 36 28  (int)fts5GetU16(
d2a0: 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d  &pLeaf->p[2]);.}
d2b0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
d2c0: 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65 20   next leaf page 
d2d0: 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  into the segment
d2e0: 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74   iterator..*/.st
d2f0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d300: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20  gIterNextPage(. 
d310: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
d340: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
d350: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d370: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
d380: 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65  nce to next page
d390: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72   */.){.  Fts5Str
d3a0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
d3b0: 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  Seg = pIter->pSe
d3c0: 67 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  g;.  fts5DataRel
d3d0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
d3e0: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  f);.  pIter->iLe
d3f0: 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  afPgno++;.  if( 
d400: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d410: 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  <=pSeg->pgnoLast
d420: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70   ){.    pIter->p
d430: 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
d440: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
d450: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
d460: 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
d470: 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   0, pIter->iLeaf
d480: 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d  Pgno).    );.  }
d490: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
d4a0: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a  >pLeaf = 0;.  }.
d4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
d4c0: 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  t p points to a 
d4d0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
d4e0: 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20 62 65  g a varint to be
d4f0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
d500: 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69  a.** position li
d510: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52  st size field. R
d520: 65 61 64 20 74 68 65 20 76 61 72 69 6e 74 20 61  ead the varint a
d530: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  nd return the nu
d540: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a  mber of bytes.**
d550: 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20 72 65   read. Before re
d560: 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e  turning, set *pn
d570: 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  Sz to the number
d580: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
d590: 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73   position.** lis
d5a0: 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f  t, and *pbDel to
d5b0: 20 74 72 75 65 20 69 66 20 74 68 65 20 64 65 6c   true if the del
d5c0: 65 74 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ete flag is set,
d5d0: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
d5e0: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
d5f0: 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  nt fts5GetPoslis
d600: 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a  tSize(const u8 *
d610: 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e  p, int *pnSz, in
d620: 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74  t *pbDel){.  int
d630: 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   nSz;.  int n = 
d640: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
d650: 70 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72  p, nSz);.  asser
d660: 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a  t_nc( nSz>=0 );.
d670: 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b    *pnSz = nSz/2;
d680: 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20  .  *pbDel = nSz 
d690: 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75  & 0x0001;.  retu
d6a0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn n;.}../*.** F
d6b0: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
d6c0: 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79  Offset currently
d6d0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
d6e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a  irst byte of a.*
d6f0: 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  * position-list 
d700: 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64  size field. Read
d710: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
d720: 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72  e field and stor
d730: 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66  e it.** in the f
d740: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
d750: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35  es:.**.**   Fts5
d760: 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20  SegIter.nPos.** 
d770: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62 44    Fts5SegIter.bD
d780: 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46  el.**.** Leave F
d790: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
d7a0: 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20  Offset pointing 
d7b0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
d7c0: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73  e of the .** pos
d7d0: 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65  ition list conte
d7e0: 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a  nt (if any)..*/.
d7f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d800: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
d810: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d820: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d830: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
d840: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d850: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
d860: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  r->iLeafOffset; 
d870: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65   /* Offset to re
d880: 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 69 66 28  ad at */.    if(
d890: 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c   iOff>=pIter->pL
d8a0: 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  eaf->n ){.      
d8b0: 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
d8c0: 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RUPT;.    }else{
d8d0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
d8e0: 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65  *a = &pIter->pLe
d8f0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 3b 0a 20 20 20  af->p[iOff];.   
d900: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
d910: 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74  ffset += fts5Get
d920: 50 6f 73 6c 69 73 74 53 69 7a 65 28 61 2c 20 26  PoslistSize(a, &
d930: 70 49 74 65 72 2d 3e 6e 50 6f 73 2c 20 26 70 49  pIter->nPos, &pI
d940: 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20 20 20  ter->bDel);.    
d950: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
d960: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
d970: 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79  Offset currently
d980: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
d990: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d9a0: 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66   .** "nSuffix" f
d9b0: 69 65 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20  ield of a term. 
d9c0: 46 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  Function paramet
d9d0: 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e  er nKeep contain
d9e0: 73 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  s the value.** o
d9f0: 66 20 74 68 65 20 22 6e 50 72 65 66 69 78 22 20  f the "nPrefix" 
da00: 66 69 65 6c 64 20 28 69 66 20 74 68 65 72 65 20  field (if there 
da10: 77 61 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20  was one - it is 
da20: 70 61 73 73 65 64 20 30 20 69 66 20 74 68 69 73  passed 0 if this
da30: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
da40: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67   term in the seg
da50: 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ment)..**.** Thi
da60: 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c  s function popul
da70: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74  ates:.**.**   Ft
da80: 73 35 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a  s5SegIter.term.*
da90: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
daa0: 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f  rowid.**.** acco
dab0: 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76  rdingly and leav
dac0: 65 73 20 28 46 74 73 35 53 65 67 49 74 65 72 2e  es (Fts5SegIter.
dad0: 69 4c 65 61 66 4f 66 66 73 65 74 29 20 73 65 74  iLeafOffset) set
dae0: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   to the content 
daf0: 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  of.** the first 
db00: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54  position list. T
db10: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
db20: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f   belonging to do
db30: 63 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35  cument .** (Fts5
db40: 53 65 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e  SegIter.iRowid).
db50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
db60: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
db70: 65 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70  erm(Fts5Index *p
db80: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
db90: 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29  Iter, int nKeep)
dba0: 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65  {.  u8 *a = pIte
dbb0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20  r->pLeaf->p;    
dbc0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
dbd0: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
dbe0: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  */.  int iOff = 
dbf0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
dc00: 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  et;  /* Offset t
dc10: 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69  o read at */.  i
dc20: 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc40: 2a 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64  * Bytes of new d
dc50: 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b  ata */..  iOff +
dc60: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
dc70: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77  2(&a[iOff], nNew
dc80: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d  );.  pIter->term
dc90: 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74  .n = nKeep;.  ft
dca0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
dcb0: 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  ob(&p->rc, &pIte
dcc0: 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26  r->term, nNew, &
dcd0: 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66  a[iOff]);.  iOff
dce0: 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65   += nNew;.  pIte
dcf0: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
dd00: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74  et = iOff;.  pIt
dd10: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
dd20: 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  o = pIter->iLeaf
dd30: 50 67 6e 6f 3b 0a 20 20 69 66 28 20 69 4f 66 66  Pgno;.  if( iOff
dd40: 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  >=pIter->pLeaf->
dd50: 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67  n ){.    fts5Seg
dd60: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
dd70: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
dd80: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
dd90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
dda0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
ddb0: 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
ddc0: 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  RUPT;.      retu
ddd0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f  rn;.    }.    iO
dde0: 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20  ff = 4;.    a = 
ddf0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
de00: 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73  .  }.  iOff += s
de10: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
de20: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
de30: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
de40: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  .  pIter->iLeafO
de50: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a  ffset = iOff;.}.
de60: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
de70: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
de80: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
de90: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
dea0: 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  he entries in.**
deb0: 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54   segment pSeg. T
dec0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
ded0: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
dee0: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
def0: 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  when .** this fu
df00: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
df10: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
df20: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
df30: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
df40: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
df50: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
df60: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
df70: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
df80: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
df90: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
dfa0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
dfb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
dfc0: 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20  5SegIterInit(.  
dfd0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a  /* FTS index obj
e000: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
e010: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
e020: 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
e030: 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
e040: 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
e050: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
e060: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
e070: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
e080: 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  .){.  if( pSeg->
e090: 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a  pgnoFirst==0 ){.
e0a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
e0b0: 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65  ens if the segme
e0c0: 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  nt is being used
e0d0: 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20   as an input to 
e0e0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20  an incremental. 
e0f0: 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20     ** merge and 
e100: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72  all data has alr
e110: 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d  eady been "trimm
e120: 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f  ed". See functio
e130: 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69  n.    ** fts5Tri
e140: 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20  mSegments() for 
e150: 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  details. In this
e160: 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20   case leave the 
e170: 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a  iterator empty..
e180: 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
e190: 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28  r will see the (
e1a0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
e1b0: 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20   and assume the 
e1c0: 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  iterator is.    
e1d0: 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64  ** at EOF alread
e1e0: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
e1f0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
e200: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
e210: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
e220: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e230: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72      memset(pIter
e240: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
e250: 65 72 29 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  er));.    pIter-
e260: 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20  >pSeg = pSeg;.  
e270: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
e280: 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  no = pSeg->pgnoF
e290: 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35  irst-1;.    fts5
e2a0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
e2b0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a  p, pIter);.  }..
e2c0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
e2d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38  ITE_OK ){.    u8
e2e0: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
e2f0: 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74 65 72  af->p;.    pIter
e300: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
e310: 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d  fts5GetU16(&a[2]
e320: 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  );.    fts5SegIt
e330: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
e340: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73  ter, 0);.    fts
e350: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
e360: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
e370: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
e380: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
e390: 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74  ver called on it
e3a0: 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20  erators created 
e3b0: 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46  by calls to.** F
e3c0: 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20  ts5IndexQuery() 
e3d0: 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44  with the FTS5IND
e3e0: 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c  EX_QUERY_DESC fl
e3f0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ag set..**.** Th
e400: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e  e iterator is in
e410: 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74   an unusual stat
e420: 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
e430: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20  tion is called: 
e440: 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  the.** Fts5SegIt
e450: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76  er.iLeafOffset v
e460: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
e470: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  o the offset of 
e480: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
e490: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
e4a0: 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72  t size field for
e4b0: 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76   the first relev
e4c0: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
e4d0: 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65   page..** Fts5Se
e4e0: 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73  gIter.rowid is s
e4f0: 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64  et, but nPos and
e500: 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a   bDel are not..*
e510: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
e520: 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  on advances the 
e530: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
e540: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
e550: 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76  e last .** relev
e560: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
e570: 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65   page and, if ne
e580: 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c  cessary, initial
e590: 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f  izes the .** aRo
e5a0: 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20  widOffset[] and 
e5b0: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72  iRowidOffset var
e5c0: 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20  iables. At this 
e5d0: 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61 74  point the iterat
e5e0: 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20  or.** is in its 
e5f0: 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20  regular state - 
e600: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
e610: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74  fOffset points t
e620: 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62  o the first.** b
e630: 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74  yte of the posit
e640: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion list content
e650: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
e660: 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a   said rowid..*/.
e670: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e680: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
e690: 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  itPage(Fts5Index
e6a0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
e6b0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
e6c0: 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
e6d0: 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  ->n;.  int i = p
e6e0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e6f0: 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  t;.  u8 *a = pIt
e700: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
e710: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74  int iRowidOffset
e720: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
e730: 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65  1 ){.    i64 iDe
e740: 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  lta = 0;.    int
e750: 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62   nPos;.    int b
e760: 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 69 20 2b 3d  Dummy;..    i +=
e770: 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
e780: 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73  ize(&a[i], &nPos
e790: 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
e7a0: 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 69  i += nPos;.    i
e7b0: 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b  f( i>=n ) break;
e7c0: 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72  .    i += getVar
e7d0: 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a  int(&a[i], (u64*
e7e0: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 69  )&iDelta);.    i
e7f0: 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62  f( iDelta==0 ) b
e800: 72 65 61 6b 3b 0a 20 20 20 20 70 49 74 65 72 2d  reak;.    pIter-
e810: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
e820: 61 3b 0a 0a 20 20 20 20 69 66 28 20 69 52 6f 77  a;..    if( iRow
e830: 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d  idOffset>=pIter-
e840: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b  >nRowidOffset ){
e850: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  .      int nNew 
e860: 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  = pIter->nRowidO
e870: 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20  ffset + 8;.     
e880: 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e   int *aNew = (in
e890: 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  t*)sqlite3_reall
e8a0: 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64  oc(pIter->aRowid
e8b0: 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a  Offset, nNew*siz
e8c0: 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  eof(int));.     
e8d0: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
e8e0: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
e8f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e910: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72     }.      pIter
e920: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->aRowidOffset =
e930: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74   aNew;.      pIt
e940: 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74  er->nRowidOffset
e950: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a   = nNew;.    }..
e960: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
e970: 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66  dOffset[iRowidOf
e980: 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d  fset++] = pIter-
e990: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
e9a0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e9b0: 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  fset = i;.  }.  
e9c0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
e9d0: 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73  set = iRowidOffs
e9e0: 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65  et;.  fts5SegIte
e9f0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
ea00: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  er);.}../*.**.*/
ea10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ea20: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
ea30: 65 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  ewPage(Fts5Index
ea40: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
ea50: 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
ea60: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
ea70: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
ea80: 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73  REVERSE );.  ass
ea90: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
eaa0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
eab0: 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66  _ONETERM );..  f
eac0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
ead0: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
eae0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
eaf0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
eb00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
eb10: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e  Iter->iLeafPgno>
eb20: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
eb30: 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35  Pgno ){.    Fts5
eb40: 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Data *pNew;.    
eb50: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
eb60: 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66  --;.    pNew = f
eb70: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
eb80: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
eb90: 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  D(.          pIt
eba0: 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
ebb0: 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61  , 0, pIter->iLea
ebc0: 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20  fPgno.    ));.  
ebd0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
ebe0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
ebf0: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
ec00: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
ec10: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
ec20: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
ec30: 66 73 65 74 3c 70 4e 65 77 2d 3e 6e 20 29 7b 0a  fset<pNew->n ){.
ec40: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
ec50: 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20  >pLeaf = pNew;. 
ec60: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ec70: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49  iLeafOffset = pI
ec80: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
ec90: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
eca0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ecb0: 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
ecc0: 66 66 2c 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  ff, dummy;.     
ecd0: 20 20 20 66 74 73 35 4c 65 61 66 48 65 61 64 65     fts5LeafHeade
ece0: 72 28 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 4f  r(pNew, &iRowidO
ecf0: 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ff, &dummy);.   
ed00: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
ed10: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
ed20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
ed30: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
ed40: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ed50: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  t = iRowidOff;. 
ed60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ed70: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
ed80: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
ed90: 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74      u8 *a = &pIt
eda0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74  er->pLeaf->p[pIt
edb0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  er->iLeafOffset]
edc0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
edd0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20  >iLeafOffset += 
ede0: 67 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36  getVarint(a, (u6
edf0: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
ee00: 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
ee10: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
ee20: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
ee30: 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20  Release(pNew);. 
ee40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ee50: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ..  if( pIter->p
ee60: 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
ee70: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
ee80: 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
ee90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
eea0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
eeb0: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
eec0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
eed0: 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74  argument current
eee0: 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ly.** points to 
eef0: 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e  a delete marker.
ef00: 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72   A delete marker
ef10: 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74   is an entry wit
ef20: 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f  h a 0 byte.** po
ef30: 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a  sition-list..*/.
ef40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
ef50: 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
ef60: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ef70: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
ef80: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65  pIter){.  Fts5Se
ef90: 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
efa0: 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
efb0: 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
efc0: 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  st];.  return (p
efd0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
efe0: 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26  && pSeg->pLeaf &
eff0: 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29  & pSeg->nPos==0)
f000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
f010: 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  ce iterator pIte
f020: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
f030: 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  try. .**.** If a
f040: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
f050: 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
f060: 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
f070: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
f080: 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  . It .** is not 
f090: 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
f0a0: 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61  ror if the itera
f0b0: 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e  tor reaches EOF.
f0c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
f0d0: 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
f0e0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
f0f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
f100: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
f110: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
f120: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
f130: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
f140: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
f150: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
f160: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
f170: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
f180: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
f190: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
f1a0: 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
f1b0: 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20   *pbNewTerm     
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f1d0: 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77  OUT: Set for new
f1e0: 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73   term */.){.  as
f1f0: 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d  sert( pbNewTerm=
f200: 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d  =0 || *pbNewTerm
f210: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
f220: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f230: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
f240: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
f250: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a  ITER_REVERSE ){.
f260: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
f270: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30  ->iRowidOffset>0
f280: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
f290: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
f2a0: 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ->p;.        int
f2b0: 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69   iOff;.        i
f2c0: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  nt nPos;.       
f2d0: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
f2e0: 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
f2f0: 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ..        pIter-
f300: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b  >iRowidOffset--;
f310: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
f320: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
f330: 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77  ff = pIter->aRow
f340: 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e  idOffset[pIter->
f350: 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20  iRowidOffset];. 
f360: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
f370: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
f380: 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  e(&a[iOff], &nPo
f390: 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
f3a0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f       iOff += nPo
f3b0: 73 3b 0a 20 20 20 20 20 20 20 20 67 65 74 56 61  s;.        getVa
f3c0: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
f3d0: 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
f3e0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
f3f0: 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  owid -= iDelta;.
f400: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
f410: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
f420: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
f430: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
f440: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
f450: 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
f460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f470: 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 44 61  se{.      Fts5Da
f480: 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
f490: 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20  r->pLeaf;.      
f4a0: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
f4b0: 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
f4c0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65  ;.      int nKee
f4d0: 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  p = 0;..      /*
f4e0: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
f4f0: 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74  end of the posit
f500: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20  ion list within 
f510: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f520: 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 61  . */.      u8 *a
f530: 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20   = pLeaf->p;.   
f540: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65 61 66     int n = pLeaf
f550: 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66  ->n;..      iOff
f560: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
f570: 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e  ffset + pIter->n
f580: 50 6f 73 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  Pos;..      if( 
f590: 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  iOff<n ){.      
f5a0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e    /* The next en
f5b0: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75  try is on the cu
f5c0: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
f5d0: 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74 61        u64 iDelta
f5e0: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
f5f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
f600: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44  nt(&a[iOff], &iD
f610: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70  elta);.        p
f620: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f630: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
f640: 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
f650: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65  ){.          bNe
f660: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
f670: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e       if( iOff>=n
f680: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f690: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
f6a0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
f6b0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
f6c0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
f6d0: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  4;.          }el
f6e0: 73 65 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73  se if( iOff!=fts
f6f0: 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 20 29  5GetU16(&a[2]) )
f700: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
f710: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
f720: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
f730: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
f740: 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eep);.          
f750: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
f760: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
f770: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
f780: 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ta;.        }.  
f790: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
f7a0: 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a  ter->pSeg==0 ){.
f7b0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38          const u8
f7c0: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
f7d0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
f7e0: 2a 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  *zTerm;.        
f7f0: 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  int nList;.     
f800: 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65 72     if( 0==(pIter
f810: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
f820: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
f830: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f840: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
f850: 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a  Next(p->pHash);.
f860: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f870: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
f880: 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54  ry(p->pHash, &zT
f890: 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
f8a0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
f8b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73          if( pLis
f8c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
f8d0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f8e0: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f8f0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
f900: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
f910: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f920: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f930: 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
f940: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  st;.          pI
f950: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 3d 20  ter->pLeaf->n = 
f960: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  nList;.         
f970: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
f980: 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
f990: 49 74 65 72 2d 3e 74 65 72 6d 2c 20 73 74 72 6c  Iter->term, strl
f9a0: 65 6e 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29  en(zTerm), (u8*)
f9b0: 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  zTerm);.        
f9c0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
f9d0: 66 73 65 74 20 3d 20 67 65 74 56 61 72 69 6e 74  fset = getVarint
f9e0: 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70  (pList, (u64*)&p
f9f0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
fa00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fa10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
fa20: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
fa30: 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73  /* Next entry is
fa40: 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72   not on the curr
fa50: 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ent page */.    
fa60: 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d      while( iOff=
fa70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
fa80: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
fa90: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
faa0: 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d           pLeaf =
fab0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
fac0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
fad0: 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  af==0 ) break;. 
fae0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f           if( (iO
faf0: 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
fb00: 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20 29  &pLeaf->p[0])) )
fb10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f  {.            iO
fb20: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74  ff += sqlite3Get
fb30: 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70  Varint(&pLeaf->p
fb40: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
fb50: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
fb60: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
fb70: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
fb80: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
fb90: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65  }.          else
fba0: 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73   if( (iOff = fts
fbb0: 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
fbc0: 70 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 20 20  p[2])) ){.      
fbd0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
fbe0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
fbf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 4e 65  .            bNe
fc00: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
fc10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
fc20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
fc30: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
fc40: 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20  iterator is now 
fc50: 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72  at EOF. If so, r
fc60: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a  eturn early. */.
fc70: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
fc80: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
fc90: 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29    if( bNewTerm )
fca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
fcb0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
fcc0: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
fcd0: 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ERM ){.         
fce0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
fcf0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
fd00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
fd10: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
fd20: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
fd30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
fd40: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
fd50: 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70  (p, pIter, nKeep
fd60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
fd70: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
fd80: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
fd90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 62            if( pb
fda0: 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77  NewTerm ) *pbNew
fdb0: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
fdc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
fdd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
fde0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
fdf0: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
fe00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
fe10: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65      }.  }.}..#de
fe20: 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20  fine SWAPVAL(T, 
fe30: 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74  a, b) { T tmp; t
fe40: 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70  mp=a; a=b; b=tmp
fe50: 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  ; }../*.** Itera
fe60: 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
fe70: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
fe80: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  e first rowid in
fe90: 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73   a doclist. This
fea0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  .** function set
feb0: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75  s the iterator u
fec0: 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74  p so that iterat
fed0: 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
fee0: 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  der through.** t
fef0: 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73  he doclist..*/.s
ff00: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
ff10: 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74  egIterReverse(Ft
ff20: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
ff30: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
ff40: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
ff50: 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72   *pDlidx = pIter
ff60: 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35  ->pDlidx;.  Fts5
ff70: 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b  Data *pLast = 0;
ff80: 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
ff90: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69  = 0;..  if( pDli
ffa0: 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  dx ){.    int iS
ffb0: 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53  egid = pIter->pS
ffc0: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
ffd0: 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44  pgnoLast = fts5D
ffe0: 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
fff0: 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20  idx);.    pLast 
10000 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
10010 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
10020 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20  OWID(iSegid, 0, 
10030 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65  pgnoLast));.  }e
10040 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  lse{.    int iOf
10050 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
10080 77 69 74 68 69 6e 20 70 4c 65 61 66 20 2a 2f 0a  within pLeaf */.
10090 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
100a0 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
100b0 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  af;         /* C
100c0 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61  urrent leaf data
100d0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72   */..    /* Curr
100e0 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74  ently, Fts5SegIt
100f0 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 28  er.iLeafOffset (
10100 61 6e 64 20 69 4f 66 66 29 20 70 6f 69 6e 74 73  and iOff) points
10110 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 0a 20   to the first . 
10120 20 20 20 2a 2a 20 62 79 74 65 20 6f 66 20 70 6f     ** byte of po
10130 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74  sition-list cont
10140 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  ent for the curr
10150 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20  ent rowid. Back 
10160 69 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 6f 20  it up.    ** so 
10170 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
10180 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
10190 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
101a0 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a   size field. */.
101b0 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
101c0 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69 74 65  Offset -= sqlite
101d0 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65  3Fts5GetVarintLe
101e0 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b  n(pIter->nPos*2+
101f0 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20  pIter->bDel);.  
10200 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
10210 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
10220 20 61 73 73 65 72 74 28 20 69 4f 66 66 3e 3d 34   assert( iOff>=4
10230 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72   );..    /* Sear
10240 63 68 20 66 6f 72 20 61 20 6e 65 77 20 74 65 72  ch for a new ter
10250 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  m within the cur
10260 72 65 6e 74 20 6c 65 61 66 2e 20 49 66 20 6f 6e  rent leaf. If on
10270 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 0a  e can be found,.
10280 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73      ** then this
10290 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74   page contains t
102a0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64  he largest rowid
102b0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
102c0 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 77 68   term. */.    wh
102d0 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d  ile( iOff<pLeaf-
102e0 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >n ){.      int 
102f0 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 36 34 20  nPos;.      i64 
10300 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 6e  iDelta;.      in
10310 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 20  t bDummy;..     
10320 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 6f 73   /* Read the pos
10330 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
10340 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 69  field */.      i
10350 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f  Off += fts5GetPo
10360 73 6c 69 73 74 53 69 7a 65 28 26 70 4c 65 61 66  slistSize(&pLeaf
10370 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73  ->p[iOff], &nPos
10380 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
10390 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a    iOff += nPos;.
103a0 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
103b0 70 4c 65 61 66 2d 3e 6e 20 29 20 62 72 65 61 6b  pLeaf->n ) break
103c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;..      /* Rowi
103d0 64 20 64 65 6c 74 61 2e 20 4f 72 2c 20 69 66 20  d delta. Or, if 
103e0 30 78 30 30 2c 20 74 68 65 20 65 6e 64 20 6f 66  0x00, the end of
103f0 20 64 6f 63 6c 69 73 74 20 6d 61 72 6b 65 72 2e   doclist marker.
10400 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d   */.      nPos =
10410 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61   getVarint(&pLea
10420 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
10430 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
10440 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
10450 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
10460 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  Off += nPos;.   
10470 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
10480 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
10490 74 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c 61  true then the la
104a0 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20  rgest rowid for 
104b0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
104c0 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20  ** term may not 
104d0 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  be stored on the
104e0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53   current page. S
104f0 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61 72 64  o search forward
10500 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20 77   to.    ** see w
10510 68 65 72 65 20 73 61 69 64 20 72 6f 77 69 64 20  here said rowid 
10520 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20  really is.  */. 
10530 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
10540 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69  af->n ){.      i
10550 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46  nt pgno;.      F
10560 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
10570 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
10580 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20  r->pSeg;..      
10590 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69  /* The last rowi
105a0 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
105b0 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74   may not be on t
105c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
105d0 20 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a   Search.      **
105e0 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64   forward to find
105f0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
10600 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f  ning the last ro
10610 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  wid.  */.      f
10620 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69  or(pgno=pIter->i
10630 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e  LeafPgno+1; !p->
10640 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67  rc && pgno<=pSeg
10650 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f  ->pgnoLast; pgno
10660 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ++){.        i64
10670 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47   iAbs = FTS5_SEG
10680 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
10690 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f  >iSegid, 0, pgno
106a0 29 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44  );.        Fts5D
106b0 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35  ata *pNew = fts5
106c0 44 61 74 61 52 65 61 64 28 70 2c 20 69 41 62 73  DataRead(p, iAbs
106d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
106e0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
106f0 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 69 54 65   int iRowid, iTe
10700 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  rm;.          ft
10710 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4e 65  s5LeafHeader(pNe
10720 77 2c 20 26 69 52 6f 77 69 64 2c 20 26 69 54 65  w, &iRowid, &iTe
10730 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rm);.          i
10740 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  f( iRowid ){.   
10750 20 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c           SWAPVAL
10760 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77  (Fts5Data*, pNew
10770 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  , pLast);.      
10780 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d        pgnoLast =
10790 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20   pgno;.         
107a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
107b0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
107c0 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
107d0 28 20 69 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ( iTerm ) break;
107e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
107f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
10800 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e  /* If pLast is N
10810 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ULL at this poin
10820 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  t, then the last
10830 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   rowid for this 
10840 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65  doclist.  ** lie
10850 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75  s on the page cu
10860 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65  rrently indicate
10870 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
10880 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
10890 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65  .  ** pIter->iLe
108a0 61 66 4f 66 66 73 65 74 20 69 73 20 61 6c 72 65  afOffset is alre
108b0 61 64 79 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ady set to point
108c0 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
108d0 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20  -list size.  ** 
108e0 66 69 65 6c 64 20 61 73 73 6f 63 69 61 74 65 64  field associated
108f0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
10900 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f  relevant rowid o
10910 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  n the page..  **
10920 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61  .  ** Or, if pLa
10930 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  st is non-NULL, 
10940 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 70  then it is the p
10950 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
10960 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20  s the last.  ** 
10970 72 6f 77 69 64 2e 20 49 6e 20 74 68 69 73 20 63  rowid. In this c
10980 61 73 65 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ase configure th
10990 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68  e iterator so th
109a0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
109b0 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 72  the.  ** first r
109c0 6f 77 69 64 20 6f 6e 20 74 68 69 73 20 70 61 67  owid on this pag
109d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  e..  */.  if( pL
109e0 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ast ){.    int d
109f0 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74 20 69 4f  ummy;.    int iO
10a00 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  ff;.    fts5Data
10a10 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
10a20 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72  Leaf);.    pIter
10a30 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b  ->pLeaf = pLast;
10a40 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
10a50 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74  fPgno = pgnoLast
10a60 3b 0a 20 20 20 20 66 74 73 35 4c 65 61 66 48 65  ;.    fts5LeafHe
10a70 61 64 65 72 28 70 4c 61 73 74 2c 20 26 69 4f 66  ader(pLast, &iOf
10a80 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  f, &dummy);.    
10a90 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
10aa0 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66  t(&pLast->p[iOff
10ab0 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
10ac0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49  >iRowid);.    pI
10ad0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
10ae0 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20   = iOff;.  }..  
10af0 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
10b00 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
10b10 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ter);.}../*.** I
10b20 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
10b30 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
10b40 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
10b50 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a  d of a doclist..
10b60 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 64 6f  ** There is a do
10b70 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f  clist-index asso
10b80 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
10b90 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68  final term on th
10ba0 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61  e current .** pa
10bb0 67 65 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ge. If the curre
10bc0 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c  nt term is the l
10bd0 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  ast term on the 
10be0 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a  page, load the .
10bf0 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
10c00 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69   from disk and i
10c10 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65  nitialize an ite
10c20 72 61 74 6f 72 20 61 74 20 28 70 49 74 65 72 2d  rator at (pIter-
10c30 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61  >pDlidx)..*/.sta
10c40 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
10c50 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74  IterLoadDlidx(Ft
10c60 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
10c70 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
10c80 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70 49  .  int iSeg = pI
10c90 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
10ca0 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20  d;.  int bRev = 
10cb0 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
10cc0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
10cd0 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61 74  ERSE);.  Fts5Dat
10ce0 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
10cf0 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72  ->pLeaf; /* Curr
10d00 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
10d10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
10d20 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
10d30 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
10d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
10d50 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b  er->pDlidx==0 );
10d60 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
10d70 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
10d80 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73  ist ends on this
10d90 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65   page. If it doe
10da0 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65  s, return.  ** e
10db0 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61  arly without loa
10dc0 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74  ding the doclist
10dd0 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62 65  -index (as it be
10de0 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65  longs to a diffe
10df0 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  rent.  ** term. 
10e00 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
10e10 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70  iTermLeafPgno==p
10e20 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
10e30 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  ){.    int iOff 
10e40 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
10e50 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50  fset + pIter->nP
10e60 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  os;.    while( i
10e70 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a  Off<pLeaf->n ){.
10e80 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
10e90 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73  ;.      int nPos
10ea0 3b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  ;.      i64 iDel
10eb0 74 61 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 4f  ta;..      /* iO
10ec0 66 66 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ff is currently 
10ed0 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
10ee0 65 20 73 74 61 72 74 20 6f 66 20 70 6f 73 69 74  e start of posit
10ef0 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 2a 2f  ion list data */
10f00 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
10f10 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
10f20 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
10f30 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
10f40 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20  if( iDelta==0 ) 
10f50 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73  return;.      as
10f60 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c  sert_nc( iOff<pL
10f70 65 61 66 2d 3e 6e 20 29 3b 0a 20 20 20 20 20 20  eaf->n );.      
10f80 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50  iOff += fts5GetP
10f90 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 4c 65 61  oslistSize(&pLea
10fa0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  f->p[iOff], &nPo
10fb0 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
10fc0 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b     iOff += nPos;
10fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49  .    }.  }..  pI
10fe0 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74  ter->pDlidx = ft
10ff0 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
11000 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70  p, bRev, iSeg, p
11010 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
11020 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  gno);.}../*.** I
11030 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62  nitialize the ob
11040 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f  ject pIter to po
11050 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72  int to term pTer
11060 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73  m/nTerm within s
11070 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20  egment.** pSeg. 
11080 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
11090 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
110a0 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72 61  index, the itera
110b0 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f  tor is set to EO
110c0 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  F..**.** If an e
110d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
110e0 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
110f0 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
11100 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
11110 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
11120 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
11130 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
11140 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11150 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
11160 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11170 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
11180 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
11190 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
111a0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
111b0 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  ackend */.  cons
111c0 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
111d0 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
111e0 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a  erm to seek to *
111f0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
11220 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61  TS5INDEX_XXX fla
11230 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  gs */.  Fts5Stru
11240 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
11250 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  eg,     /* Descr
11260 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e  iption of segmen
11270 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
11280 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
11290 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
112a0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
112b0 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20 31  ){.  int iPg = 1
112c0 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74  ;.  int h;.  int
112d0 20 62 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20   bGe = (flags & 
112e0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
112f0 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c  SCAN);.  int bDl
11300 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  idx = 0;        
11310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11320 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
11330 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
11340 0a 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d  .  assert( bGe==
11350 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
11360 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
11370 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  SC)==0 );.  asse
11380 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65  rt( pTerm && nTe
11390 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  rm );.  memset(p
113a0 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
113b0 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
113c0 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
113d0 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
113e0 20 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69   sets stack vari
113f0 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20  able iPg to the 
11400 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
11410 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63   that may.  ** c
11420 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65  ontain term (pTe
11430 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74  rm/nTerm), if it
11440 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
11450 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  he segment. */. 
11460 20 66 6f 72 28 68 3d 70 53 65 67 2d 3e 6e 48 65   for(h=pSeg->nHe
11470 69 67 68 74 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d  ight-1; h>0; h--
11480 29 7b 0a 20 20 20 20 46 74 73 35 4e 6f 64 65 49  ){.    Fts5NodeI
11490 74 65 72 20 6e 6f 64 65 3b 20 20 20 20 20 20 20  ter node;       
114a0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74         /* For it
114b0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
114c0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 2a  internal nodes *
114d0 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
114e0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
114f0 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
11500 69 64 2c 20 68 2c 20 69 50 67 29 3b 0a 20 20 20  id, h, iPg);.   
11510 20 46 74 73 35 44 61 74 61 20 2a 70 4e 6f 64 65   Fts5Data *pNode
11520 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
11530 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  p, iRowid);.    
11540 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62  if( pNode==0 ) b
11550 72 65 61 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e  reak;..    fts5N
11560 6f 64 65 49 74 65 72 49 6e 69 74 28 70 4e 6f 64  odeIterInit(pNod
11570 65 2d 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20  e->p, pNode->n, 
11580 26 6e 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65  &node);.    asse
11590 72 74 28 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d  rt( node.term.n=
115a0 3d 30 20 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d  =0 );..    iPg =
115b0 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20   node.iChild;.  
115c0 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e    bDlidx = node.
115d0 62 44 6c 69 64 78 3b 0a 20 20 20 20 66 6f 72 28  bDlidx;.    for(
115e0 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74  fts5NodeIterNext
115f0 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b  (&p->rc, &node);
11600 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 2e 61 44  .        node.aD
11610 61 74 61 20 26 26 20 66 74 73 35 42 75 66 66 65  ata && fts5Buffe
11620 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f  rCompareBlob(&no
11630 64 65 2e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20  de.term, pTerm, 
11640 6e 54 65 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20  nTerm)<=0;.     
11650 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e     fts5NodeIterN
11660 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64  ext(&p->rc, &nod
11670 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
11680 69 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c  iPg = node.iChil
11690 64 3b 0a 20 20 20 20 20 20 62 44 6c 69 64 78 20  d;.      bDlidx 
116a0 3d 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20  = node.bDlidx;. 
116b0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64     }.    fts5Nod
116c0 65 49 74 65 72 46 72 65 65 28 26 6e 6f 64 65 29  eIterFree(&node)
116d0 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
116e0 6c 65 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20  lease(pNode);.  
116f0 7d 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65  }..  if( iPg<pSe
11700 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a  g->pgnoFirst ){.
11710 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e      iPg = pSeg->
11720 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62  pgnoFirst;.    b
11730 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Dlidx = 0;.  }..
11740 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
11750 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20  no = iPg - 1;.  
11760 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
11770 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  age(p, pIter);..
11780 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
11790 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  af ){.    int re
117a0 73 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  s;.    pIter->iL
117b0 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
117c0 47 65 74 55 31 36 28 26 70 49 74 65 72 2d 3e 70  GetU16(&pIter->p
117d0 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20  Leaf->p[2]);.   
117e0 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
117f0 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30  Term(p, pIter, 0
11800 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  );.    fts5SegIt
11810 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
11820 74 65 72 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  ter);.    do {. 
11830 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35 42       res = fts5B
11840 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
11850 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70  (&pIter->term, p
11860 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
11870 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
11880 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 74   break;.      ft
11890 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
118a0 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20   pIter, 0);.    
118b0 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 70  }while( pIter->p
118c0 4c 65 61 66 20 26 26 20 70 2d 3e 72 63 3d 3d 53  Leaf && p->rc==S
118d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
118e0 20 69 66 28 20 62 47 65 3d 3d 30 20 26 26 20 72   if( bGe==0 && r
118f0 65 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  es ){.      /* S
11900 65 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70  et iterator to p
11910 6f 69 6e 74 20 74 6f 20 45 4f 46 20 2a 2f 0a 20  oint to EOF */. 
11920 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
11930 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
11940 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  f);.      pIter-
11950 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
11960 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
11970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11980 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70   bGe==0 ){.    p
11990 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
119a0 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
119b0 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74  ERM;.    if( pIt
119c0 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
119d0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
119e0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
119f0 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ESC ){.        p
11a00 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
11a10 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
11a20 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RSE;.      }.   
11a30 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b     if( bDlidx ){
11a40 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
11a50 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c  IterLoadDlidx(p,
11a60 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
11a70 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
11a80 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
11a90 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  RY_DESC ){.     
11aa0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
11ab0 76 65 72 73 65 28 70 2c 20 70 49 74 65 72 29 3b  verse(p, pIter);
11ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11ad0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
11ae0 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
11af0 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
11b00 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
11b10 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 0a  Term within the.
11b20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  ** in-memory has
11b30 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 72  h table. If ther
11b40 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72  e is no such ter
11b50 6d 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61  m in the hash-ta
11b60 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65  ble, the .** ite
11b70 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20  rator is set to 
11b80 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  EOF..**.** If an
11b90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
11ba0 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
11bb0 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
11bc0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
11bd0 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
11be0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
11bf0 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
11c00 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11c10 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
11c20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
11c30 64 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73  d fts5SegIterHas
11c40 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  hInit(.  Fts5Ind
11c50 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
11c60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
11c70 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f   backend */.  co
11c80 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
11c90 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
11ca0 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
11cb0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
11ce0 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66   FTS5INDEX_XXX f
11cf0 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 65  lags */.  Fts5Se
11d00 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
11d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
11d20 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
11d30 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
11d40 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69   *pList = 0;.  i
11d50 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20  nt nList = 0;.  
11d60 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b  const u8 *z = 0;
11d70 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20  .  int n = 0;.. 
11d80 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73   assert( p->pHas
11d90 68 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  h );.  assert( p
11da0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11db0 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d 3d  );..  if( pTerm=
11dc0 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46  =0 || (flags & F
11dd0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
11de0 43 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72  CAN) ){.    p->r
11df0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
11e00 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70  ashScanInit(p->p
11e10 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
11e20 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  r*)pTerm, nTerm)
11e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
11e40 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
11e50 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20  ->pHash, (const 
11e60 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73  char**)&z, &pLis
11e70 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
11e80 6e 20 3d 20 28 7a 20 3f 20 73 74 72 6c 65 6e 28  n = (z ? strlen(
11e90 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 29 20  (const char*)z) 
11ea0 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  : 0);.  }else{. 
11eb0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
11ec0 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
11ed0 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c  ONETERM;.    sql
11ee0 69 74 65 33 46 74 73 35 48 61 73 68 51 75 65 72  ite3Fts5HashQuer
11ef0 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  y(p->pHash, (con
11f00 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
11f10 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  nTerm, &pList, &
11f20 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20  nList);.    z = 
11f30 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e  pTerm;.    n = n
11f40 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Term;.  }..  if(
11f50 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74   pList ){.    Ft
11f60 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
11f70 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
11f80 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
11f90 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c  &pIter->term, n,
11fa0 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d   z);.    pLeaf =
11fb0 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
11fc0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  , sizeof(Fts5Dat
11fd0 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  a));.    if( pLe
11fe0 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  af==0 ) return;.
11ff0 20 20 20 20 70 4c 65 61 66 2d 3e 6e 52 65 66 20      pLeaf->nRef 
12000 3d 20 31 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e  = 1;.    pLeaf->
12010 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
12020 20 20 20 20 70 4c 65 61 66 2d 3e 6e 20 3d 20 6e      pLeaf->n = n
12030 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  List;.    pIter-
12040 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a  >pLeaf = pLeaf;.
12050 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
12060 4f 66 66 73 65 74 20 3d 20 67 65 74 56 61 72 69  Offset = getVari
12070 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36  nt(pLeaf->p, (u6
12080 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
12090 64 29 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61  d);..    if( fla
120a0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
120b0 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
120c0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
120d0 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
120e0 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66  REVERSE;.      f
120f0 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
12100 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
12110 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
12120 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12130 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
12140 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  er);.    }.  }.}
12150 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65  ../*.** Zero the
12160 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
12170 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
12180 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
12190 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
121a0 72 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74  rClear(Fts5SegIt
121b0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74  er *pIter){.  ft
121c0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
121d0 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  ter->term);.  ft
121e0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
121f0 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66  ter->pLeaf);.  f
12200 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
12210 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b  (pIter->pDlidx);
12220 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12230 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
12240 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  set);.  memset(p
12250 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
12260 46 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d  Fts5SegIter));.}
12270 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12280 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  DEBUG../*.** Thi
12290 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
122a0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
122b0 65 20 62 69 67 20 61 73 73 65 72 74 28 29 20 70  e big assert() p
122c0 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65  rocedure impleme
122d0 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41  nted by.** fts5A
122e0 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
122f0 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65  tup(). It ensure
12300 73 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  s that the resul
12310 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  t currently stor
12320 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69  ed.** in *pRes i
12330 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  s the correct re
12340 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
12350 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
12360 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a  sitions of the.*
12370 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e  * two iterators.
12380 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12390 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
123a0 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74  isonResult(.  Ft
123b0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
123c0 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65  pIter, .  Fts5Se
123d0 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73  gIter *p1,.  Fts
123e0 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20  5SegIter *p2,.  
123f0 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
12400 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20  s.){.  int i1 = 
12410 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  p1 - pIter->aSeg
12420 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20  ;.  int i2 = p2 
12430 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a  - pIter->aSeg;..
12440 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20    if( p1->pLeaf 
12450 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a  || p2->pLeaf ){.
12460 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61      if( p1->pLea
12470 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
12480 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
12490 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65  st==i2 );.    }e
124a0 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61  lse if( p2->pLea
124b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
124c0 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
124d0 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65  st==i1 );.    }e
124e0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
124f0 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65  Min = MIN(p1->te
12500 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e  rm.n, p2->term.n
12510 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  );.      int res
12520 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65   = memcmp(p1->te
12530 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70  rm.p, p2->term.p
12540 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69  , nMin);.      i
12550 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
12560 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70  = p1->term.n - p
12570 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20  2->term.n;..    
12580 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
12590 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
125a0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31  pRes->bTermEq==1
125b0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
125c0 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d  rt( p1->iRowid!=
125d0 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20  p2->iRowid );.  
125e0 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31        res = ((p1
125f0 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69  ->iRowid > p2->i
12600 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
12610 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20  Rev) ? -1 : 1;. 
12620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12630 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12640 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a  ->bTermEq==0 );.
12650 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
12660 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
12670 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12680 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a  ->iFirst==i1 );.
12690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
126a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
126b0 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b  s->iFirst==i2 );
126c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
126d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
126e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
126f0 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49  o-op unless SQLI
12700 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
12710 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f  ned when this mo
12720 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69  dule.** is compi
12730 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73  led. In that cas
12740 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
12750 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20   is essentially 
12760 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  an assert() .** 
12770 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  statement used t
12780 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
12790 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
127a0 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
127b0 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63  ] array.** are c
127c0 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
127d0 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
127e0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
127f0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
12800 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
12810 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
12820 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
12830 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
12840 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
12850 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a  r->nSeg; i+=2){.
12860 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
12870 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  r *p1 = &pIter->
12880 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46  aSeg[i];.      F
12890 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d  ts5SegIter *p2 =
128a0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b   &pIter->aSeg[i+
128b0 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52  1];.      Fts5CR
128c0 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
128d0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49  Iter->aFirst[(pI
128e0 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f  ter->nSeg + i) /
128f0 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41   2];.      fts5A
12900 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
12910 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c  esult(pIter, p1,
12920 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20   p2, pRes);.    
12930 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  }..    for(i=1; 
12940 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f  i<(pIter->nSeg /
12950 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20   2); i+=2){.    
12960 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
12970 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
12980 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 46  irst[i];.      F
12990 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d  ts5SegIter *p1 =
129a0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
129b0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32  Iter->aFirst[i*2
129c0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
129d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
129e0 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  2 = &pIter->aSeg
129f0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
12a00 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  i*2+1].iFirst ];
12a10 0a 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  ..      fts5Asse
12a20 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75  rtComparisonResu
12a30 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32  lt(pIter, p1, p2
12a40 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20  , pRes);.    }. 
12a50 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
12a60 69 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d 75  ine fts5AssertMu
12a70 6c 74 69 49 74 65 72 53 65 74 75 70 28 78 2c 79  ltiIterSetup(x,y
12a80 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12a90 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
12aa0 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70  n necessary to p
12ab0 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61  opulate pIter->a
12ac0 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a  First[iOut]..**.
12ad0 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
12ae0 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  ed value is non-
12af0 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
12b00 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e   the index of an
12b10 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65   entry.** in the
12b20 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61   pIter->aSeg[] a
12b30 72 72 61 79 20 74 68 61 74 20 69 73 20 28 61 29  rray that is (a)
12b40 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64   not at EOF, and
12b50 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   (b) pointing.**
12b60 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69   to a key that i
12b70 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
12b80 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72   another, higher
12b90 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73   priority, .** s
12ba0 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20  egment-iterator 
12bb0 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65  in the pSeg->aSe
12bc0 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  g[] array..*/.st
12bd0 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
12be0 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
12bf0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
12c00 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75   *pIter, int iOu
12c10 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20  t){.  int i1;   
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12c40 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35  f left-hand Fts5
12c50 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74  SegIter */.  int
12c60 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   i2;            
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c80 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68  Index of right-h
12c90 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
12ca0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20  */.  int iRes;. 
12cb0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
12cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12cd0 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74   /* Left-hand Ft
12ce0 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46  s5SegIter */.  F
12cf0 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20  ts5SegIter *p2; 
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d10 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73  * Right-hand Fts
12d20 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
12d30 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
12d40 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
12d50 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72  [iOut];..  asser
12d60 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e  t( iOut<pIter->n
12d70 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b  Seg && iOut>0 );
12d80 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
12d90 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74  ->bRev==0 || pIt
12da0 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a  er->bRev==1 );..
12db0 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74    if( iOut>=(pIt
12dc0 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20  er->nSeg/2) ){. 
12dd0 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20     i1 = (iOut - 
12de0 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a  pIter->nSeg/2) *
12df0 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20   2;.    i2 = i1 
12e00 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  + 1;.  }else{.  
12e10 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46    i1 = pIter->aF
12e20 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69  irst[iOut*2].iFi
12e30 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49  rst;.    i2 = pI
12e40 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
12e50 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  *2+1].iFirst;.  
12e60 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d  }.  p1 = &pIter-
12e70 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20  >aSeg[i1];.  p2 
12e80 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
12e90 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65  2];..  pRes->bTe
12ea0 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20  rmEq = 0;.  if( 
12eb0 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20  p1->pLeaf==0 ){ 
12ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
12ed0 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  p1 is at EOF */.
12ee0 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
12ef0 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70   }else if( p2->p
12f00 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f  Leaf==0 ){     /
12f10 2a 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f  * If p2 is at EO
12f20 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20  F */.    iRes = 
12f30 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  i1;.  }else{.   
12f40 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42   int res = fts5B
12f50 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31  ufferCompare(&p1
12f60 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72  ->term, &p2->ter
12f70 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d  m);.    if( res=
12f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
12f90 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20  rt( i2>i1 );.   
12fa0 20 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30     assert( i2!=0
12fb0 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e   );.      pRes->
12fc0 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20  bTermEq = 1;.   
12fd0 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69     if( p1->iRowi
12fe0 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b  d==p2->iRowid ){
12ff0 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65  .        p1->bDe
13000 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20  l = p2->bDel;.  
13010 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b        return i2;
13020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
13030 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69  es = ((p1->iRowi
13040 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d  d > p2->iRowid)=
13050 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20  =pIter->bRev) ? 
13060 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  -1 : +1;.    }. 
13070 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d     assert( res!=
13080 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  0 );.    if( res
13090 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73  <0 ){.      iRes
130a0 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = i1;.    }else
130b0 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
130c0 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
130d0 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 69  pRes->iFirst = i
130e0 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  Res;.  return 0;
130f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
13100 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74  he seg-iter so t
13110 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
13120 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
13130 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67   on page iLeafPg
13140 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  no..** It is an 
13150 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c  error if leaf iL
13160 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74  eafPgno does not
13170 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
13180 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f  ns no rowids..*/
13190 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
131a0 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65  5SegIterGotoPage
131b0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
131c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
131d0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
131e0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
131f0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
13200 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
13210 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
13220 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
13230 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61  iLeafPgno.){.  a
13240 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f  ssert( iLeafPgno
13250 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
13260 6f 20 29 3b 0a 20 20 69 66 28 20 69 4c 65 61 66  o );.  if( iLeaf
13270 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67  Pgno>pIter->pSeg
13280 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
13290 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
132a0 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  ORRUPT;.  }else{
132b0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
132c0 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
132d0 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  o-1;.    fts5Seg
132e0 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
132f0 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  pIter);.    asse
13300 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
13310 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69  E_OK || pIter->i
13320 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50  LeafPgno==iLeafP
13330 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  gno );..    if( 
13340 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13350 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f   ){.      int iO
13360 66 66 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 20  ff;.      u8 *a 
13370 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
13380 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  p;.      int n =
13390 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
133a0 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ;..      iOff = 
133b0 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d  fts5GetU16(&a[0]
133c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  );.      if( iOf
133d0 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29  f<4 || iOff>=n )
133e0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
133f0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
13400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13410 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74       iOff += get
13420 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
13430 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
13440 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
13450 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
13460 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
13470 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
13480 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
13490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
134a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76    }.}../*.** Adv
134b0 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
134c0 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
134d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
134e0 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f  until it is at o
134f0 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64  r .** past rowid
13500 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65   iFrom. Regardle
13510 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
13520 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74  of iFrom, the it
13530 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77  erator is.** alw
13540 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74 20  ays advanced at 
13550 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73  least once..*/.s
13560 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
13570 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a  egIterNextFrom(.
13580 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135a0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
135b0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
135c0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
135d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
135e0 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
135f0 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d  ance */.  i64 iM
13600 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  atch            
13610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76            /* Adv
13620 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61 74  ance iterator at
13630 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72 20   least this far 
13640 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76  */.){.  int bRev
13650 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73   = (pIter->flags
13660 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
13670 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35  REVERSE);.  Fts5
13680 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
13690 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  x = pIter->pDlid
136a0 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  x;.  int iLeafPg
136b0 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  no = pIter->iLea
136c0 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f  fPgno;.  int bMo
136d0 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72  ve = 1;..  asser
136e0 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
136f0 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
13700 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
13710 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
13720 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x );.  assert( p
13730 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a  Iter->pLeaf );..
13740 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b    if( bRev==0 ){
13750 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73  .    while( !fts
13760 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
13770 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74   pDlidx) && iMat
13780 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72  ch>fts5DlidxIter
13790 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b  Rowid(pDlidx) ){
137a0 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f  .      iLeafPgno
137b0 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
137c0 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
137d0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
137e0 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29  rNext(p, pDlidx)
137f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
13800 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f  rt_nc( iLeafPgno
13810 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  >=pIter->iLeafPg
13820 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20  no || p->rc );. 
13830 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f     if( iLeafPgno
13840 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
13850 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  o ){.      fts5S
13860 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70  egIterGotoPage(p
13870 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67  , pIter, iLeafPg
13880 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  no);.      bMove
13890 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
138a0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
138b0 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69   iMatch<pIter->i
138c0 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69  Rowid );.    whi
138d0 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74  le( !fts5DlidxIt
138e0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
138f0 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35 44   && iMatch<fts5D
13900 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
13910 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 66  lidx) ){.      f
13920 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
13930 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20  (p, pDlidx);.   
13940 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f   }.    iLeafPgno
13950 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
13960 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
13970 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44     assert( fts5D
13980 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
13990 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50  Dlidx) || iLeafP
139a0 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno<=pIter->iLea
139b0 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66  fPgno );..    if
139c0 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65  ( iLeafPgno<pIte
139d0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
139e0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
139f0 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
13a00 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35  no+1;.      fts5
13a10 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
13a20 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
13a30 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30  .      bMove = 0
13a40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
13a50 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
13a60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
13a70 28 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65  ( bMove ) fts5Se
13a80 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  gIterNext(p, pIt
13a90 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
13aa0 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
13ab0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
13ac0 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65   bRev==0 && pIte
13ad0 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  r->iRowid>=iMatc
13ae0 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
13af0 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49  f( bRev!=0 && pI
13b00 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61  ter->iRowid<=iMa
13b10 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
13b20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a   bMove = 1;.  }.
13b30 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  }.../*.** Free t
13b40 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
13b50 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
13b60 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13b80 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
13b90 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ee(Fts5Index *p,
13ba0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
13bb0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
13bc0 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e   pIter ){.    in
13bd0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
13be0 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
13bf0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
13c00 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70  5SegIterClear(&p
13c10 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a  Iter->aSeg[i]);.
13c20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13c30 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20  3_free(pIter);. 
13c40 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
13c50 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  d fts5MultiIterA
13c60 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49  dvanced(.  Fts5I
13c70 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
13c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
13c90 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
13ca0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
13cb0 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
13cc0 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
13cd0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
13ce0 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
13cf0 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
13d00 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20  int iChanged,   
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
13d30 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
13d40 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  vanced */.  int 
13d50 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20  iMinset         
13d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
13d70 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20  inimum entry in 
13d80 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20  aFirst[] to set 
13d90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
13da0 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
13db0 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
13dc0 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70   i>=iMinset && p
13dd0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  ->rc==SQLITE_OK;
13de0 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74   i=i/2){.    int
13df0 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69   iEq;.    if( (i
13e00 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
13e10 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65  erDoCompare(pIte
13e20 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20  r, i)) ){.      
13e30 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
13e40 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
13e50 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iEq], 0);.      
13e60 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20  i = pIter->nSeg 
13e70 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  + iEq;.    }.  }
13e80 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
13e90 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
13ea0 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35  nceRowid(.  Fts5
13eb0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
13ed0 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
13ee0 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
13ef0 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
13f00 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
13f10 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
13f20 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
13f30 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
13f40 20 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20   int iChanged   
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
13f70 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
13f80 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20  dvanced */.){.  
13f90 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 53 65 67  int i;.  Fts5Seg
13fa0 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49  Iter *pNew = &pI
13fb0 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
13fc0 65 64 5d 3b 0a 20 20 46 74 73 35 53 65 67 49 74  ed];.  Fts5SegIt
13fd0 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49  er *pOther = &pI
13fe0 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
13ff0 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 0a 20  ed ^ 0x0001];.. 
14000 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
14010 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
14020 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14030 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 46  K; i=i/2){.    F
14040 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
14050 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
14060 74 5b 69 5d 3b 0a 0a 20 20 20 20 61 73 73 65 72  t[i];..    asser
14070 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29  t( pNew->pLeaf )
14080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
14090 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c  es->bTermEq==0 |
140a0 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20  | pOther->pLeaf 
140b0 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
140c0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b  pRes->bTermEq ){
140d0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
140e0 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d  >iRowid==pOther-
140f0 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
14100 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14110 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
14120 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65  ther->iRowid>pNe
14130 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  w->iRowid)==pIte
14140 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  r->bRev ){.     
14150 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72     pNew = pOther
14160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14170 20 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74      pRes->iFirst
14180 20 3d 20 28 70 4e 65 77 20 2d 20 70 49 74 65 72   = (pNew - pIter
14190 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 69 66 28  ->aSeg);.    if(
141a0 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a   i==1 ) break;..
141b0 20 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49      pOther = &pI
141c0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
141d0 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30  ->aFirst[i ^ 0x0
141e0 30 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  001].iFirst ];. 
141f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
14200 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
14210 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
14220 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
14230 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
14240 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
14250 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
14260 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  n Fts5Index.rc. 
14270 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  It is not .** co
14280 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
14290 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
142a0 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f  r reaches EOF, o
142b0 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
142c0 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68  dy at .** EOF wh
142d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
142e0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
142f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
14300 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20  ultiIterNext(.  
14310 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
14320 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
14330 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
14340 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  bFrom,          
14350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14360 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20  rue if argument 
14370 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a  iFrom is valid *
14380 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20  /.  i64 iFrom   
14390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143a0 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61      /* Advance a
143b0 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61  t least as far a
143c0 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69  s this */.){.  i
143d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
143e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  _OK ){.    int b
143f0 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b  UseFrom = bFrom;
14400 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
14410 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
14420 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
14430 69 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  irst;.      int 
14440 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
14450 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
14460 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
14470 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
14480 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
14490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
144a0 20 20 20 20 20 20 69 66 28 20 62 55 73 65 46 72        if( bUseFr
144b0 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69  om && pSeg->pDli
144c0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  dx ){.        ft
144d0 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
144e0 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d  m(p, pSeg, iFrom
144f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14500 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
14510 74 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  terNext(p, pSeg,
14520 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
14530 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
14540 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c  pSeg->pLeaf==0 |
14550 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20  | bNewTerm .    
14560 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49     || fts5MultiI
14570 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
14580 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
14590 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
145a0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
145b0 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65  Advanced(p, pIte
145c0 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20  r, iFirst, 1);. 
145d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
145e0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
145f0 53 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b  Setup(p, pIter);
14600 0a 0a 20 20 20 20 20 20 62 55 73 65 46 72 6f 6d  ..      bUseFrom
14610 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
14620 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
14630 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69  pty && fts5Multi
14640 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
14650 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  Iter) );.  }.}..
14660 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
14670 20 6e 65 77 20 46 74 73 35 4d 75 6c 74 69 53 65   new Fts5MultiSe
14680 67 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  gIter object..**
14690 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
146a0 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ct will be used 
146b0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
146c0 67 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63  gh data in struc
146d0 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a  ture pStruct..**
146e0 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76   If iLevel is -v
146f0 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61  e, then all data
14700 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73   in all segments
14710 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20   is merged. Or, 
14720 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  if iLevel.** is 
14730 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c  zero or greater,
14740 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66   data from the f
14750 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65  irst nSegment se
14760 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20  gments on level 
14770 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72  iLevel.** is mer
14780 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ged..**.** The i
14790 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c  terator initiall
147a0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
147b0 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64  first term/rowid
147c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a   entry in the .*
147d0 2a 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e  * iterated data.
147e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
147f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
14800 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
14810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14820 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
14830 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
14840 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53  ithin */.  Fts5S
14850 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
14860 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  t,         /* St
14870 72 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69  ructure of speci
14880 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  fic index */.  i
14890 6e 74 20 62 53 6b 69 70 45 6d 70 74 79 2c 20 20  nt bSkipEmpty,  
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
148b0 2a 20 54 72 75 65 20 74 6f 20 69 67 6e 6f 72 65  * True to ignore
148c0 20 64 65 6c 65 74 65 2d 6b 65 79 73 20 2a 2f 0a   delete-keys */.
148d0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f 51    /* FTS5INDEX_Q
14900 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20 2a  UERY_XXX flags *
14910 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
14920 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
14930 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
14940 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f  eek to (or NULL/
14950 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  0) */.  int iLev
14960 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
14970 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
14980 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d 31 20   to iterate (-1 
14990 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e  for all) */.  in
149a0 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  t nSegment,     
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
149c0 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
149d0 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28 69 4c  nts to merge (iL
149e0 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46 74  evel>=0) */.  Ft
149f0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
14a00 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 2f 2a  *ppOut        /*
14a10 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29   New object */.)
14a20 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20  {.  int nSeg;   
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14a50 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 73 20 69   segment-iters i
14a60 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  n use */.  int n
14a70 53 6c 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Slot = 0;       
14a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14a90 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53  wer of two >= nS
14aa0 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65  eg */.  int iIte
14ab0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
14ac0 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20          /* */.  
14ad0 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20  int iSeg;       
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14af0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
14b00 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
14b10 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  nts */.  Fts5Str
14b20 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
14b30 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  l;.  Fts5MultiSe
14b40 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20  gIter *pNew;..  
14b50 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d  assert( (pTerm==
14b60 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c  0 && nTerm==0) |
14b70 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20  | iLevel<0 );.. 
14b80 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
14b90 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d  ce for the new m
14ba0 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f  ulti-seg-iterato
14bb0 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  r. */.  if( p->r
14bc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14bd0 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
14be0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14bf0 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
14c00 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
14c10 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
14c20 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
14c30 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74    nSeg = pStruct
14c40 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  ->nSegment;.    
14c50 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48    nSeg += (p->pH
14c60 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ash ? 1 : 0);.  
14c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
14c80 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63  Seg = MIN(pStruc
14c90 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
14ca0 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74  ].nSeg, nSegment
14cb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
14cc0 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c  (nSlot=2; nSlot<
14cd0 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f  nSeg; nSlot=nSlo
14ce0 74 2a 32 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  t*2);.  }..  *pp
14cf0 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
14d00 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20  5IdxMalloc(p, . 
14d10 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
14d20 4d 75 6c 74 69 53 65 67 49 74 65 72 29 20 2b 20  MultiSegIter) + 
14d30 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
14d40 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
14d50 28 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20  (Fts5SegIter) * 
14d60 6e 53 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a  nSlot +       /*
14d70 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f   pNew->aSeg[] */
14d80 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
14d90 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c  s5CResult) * nSl
14da0 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e  ot         /* pN
14db0 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a  ew->aFirst[] */.
14dc0 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d    );.  if( pNew=
14dd0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
14de0 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f  New->nSeg = nSlo
14df0 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67 20  t;.  pNew->aSeg 
14e00 3d 20 28 46 74 73 35 53 65 67 49 74 65 72 2a 29  = (Fts5SegIter*)
14e10 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77  &pNew[1];.  pNew
14e20 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35  ->aFirst = (Fts5
14e30 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e  CResult*)&pNew->
14e40 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 70  aSeg[nSlot];.  p
14e50 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d  New->bRev = (0!=
14e60 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
14e70 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b  EX_QUERY_DESC));
14e80 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  .  pNew->bSkipEm
14e90 70 74 79 20 3d 20 62 53 6b 69 70 45 6d 70 74 79  pty = bSkipEmpty
14ea0 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
14eb0 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  ze each of the c
14ec0 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74  omponent segment
14ed0 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20   iterators. */. 
14ee0 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
14ef0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
14f00 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20  reLevel *pEnd = 
14f10 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
14f20 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
14f30 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 48  ];.    if( p->pH
14f40 61 73 68 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ash ){.      /* 
14f50 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74  Add a segment it
14f60 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63  erator for the c
14f70 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
14f80 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  of the hash tabl
14f90 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  e. */.      Fts5
14fa0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
14fb0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
14fc0 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 66 74 73  er++];.      fts
14fd0 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69 74  5SegIterHashInit
14fe0 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  (p, pTerm, nTerm
14ff0 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72 29 3b  , flags, pIter);
15000 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
15010 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c  Lvl=&pStruct->aL
15020 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45  evel[0]; pLvl<pE
15030 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20  nd; pLvl++){.   
15040 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c     for(iSeg=pLvl
15050 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  ->nSeg-1; iSeg>=
15060 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
15070 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
15080 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
15090 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
150a0 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  g];.        Fts5
150b0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
150c0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
150d0 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 69  er++];.        i
150e0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
150f0 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
15100 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67  IterInit(p, pSeg
15110 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
15120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15130 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65     fts5SegIterSe
15140 65 6b 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c  ekInit(p, pTerm,
15150 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70   nTerm, flags, p
15160 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  Seg, pIter);.   
15170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15180 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
15190 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
151a0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
151b0 5d 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d  ];.    for(iSeg=
151c0 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b  nSeg-1; iSeg>=0;
151d0 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20   iSeg--){.      
151e0 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
151f0 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  p, &pLvl->aSeg[i
15200 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65  Seg], &pNew->aSe
15210 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20  g[iIter++]);.   
15220 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
15230 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a   iIter==nSeg );.
15240 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
15250 76 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ve was successfu
15260 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  l, each componen
15270 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20  t iterators now 
15280 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20  points .  ** to 
15290 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
152a0 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20  in its segment. 
152b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 69  In this case ini
152c0 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a  tialize the .  *
152d0 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  * aFirst[] array
152e0 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
152f0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
15300 66 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f  free the iterato
15310 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e  r.  ** object an
15320 64 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  d set the output
15330 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
15340 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  L.  */.  if( p->
15350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15360 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72 3d 6e  .    for(iIter=n
15370 53 6c 6f 74 2d 31 3b 20 69 49 74 65 72 3e 30 3b  Slot-1; iIter>0;
15380 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20   iIter--){.     
15390 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20 20   int iEq;.      
153a0 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d  if( (iEq = fts5M
153b0 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72  ultiIterDoCompar
153c0 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29 20  e(pNew, iIter)) 
153d0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
153e0 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70  egIterNext(p, &p
153f0 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d 2c 20  New->aSeg[iEq], 
15400 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  0);.        fts5
15410 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
15420 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20  d(p, pNew, iEq, 
15430 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  iIter);.      }.
15440 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 41 73      }.    fts5As
15450 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
15460 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  up(p, pNew);..  
15470 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
15480 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
15490 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
154a0 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20  , pNew) ){.     
154b0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
154c0 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
154d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
154e0 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  {.    fts5MultiI
154f0 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29  terFree(p, pNew)
15500 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30  ;.    *ppOut = 0
15510 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
15520 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
15530 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74  e iterator is at
15540 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72   EOF or if an er
15550 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
15560 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65  . .** False othe
15570 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
15580 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74   int fts5MultiIt
15590 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20  erEof(Fts5Index 
155a0 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
155b0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
155c0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c  return (p->rc ||
155d0 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
155e0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
155f0 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30  First ].pLeaf==0
15600 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
15610 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  rn the rowid of 
15620 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
15630 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
15640 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  ently points.** 
15650 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61  to. If the itera
15660 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
15670 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
15680 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
15690 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72  he.** results ar
156a0 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  e undefined..*/.
156b0 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d  static i64 fts5M
156c0 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74  ultiIterRowid(Ft
156d0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
156e0 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
156f0 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  ( pIter->aSeg[ p
15700 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15710 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 20 29  iFirst ].pLeaf )
15720 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ;.  return pIter
15730 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
15740 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
15750 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  ].iRowid;.}../*.
15760 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
15770 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
15780 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66 6f 6c   entry at or fol
15790 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a  lowing iMatch..*
157a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
157b0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46  s5MultiIterNextF
157c0 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
157d0 20 2a 70 2c 20 0a 20 20 46 74 73 35 4d 75 6c 74   *p, .  Fts5Mult
157e0 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
157f0 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29   .  i64 iMatch.)
15800 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  {.  while( 1 ){.
15810 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
15820 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
15830 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
15840 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20  1, iMatch);.    
15850 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
15860 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
15870 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77   break;.    iRow
15880 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
15890 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
158a0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
158b0 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev==0 && iRowid
158c0 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
158d0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
158e0 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77  >bRev!=0 && iRow
158f0 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
15900 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ak;.  }.}../*.**
15910 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
15920 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
15930 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
15940 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  m associated wit
15950 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20  h the .** entry 
15960 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
15970 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
15980 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ts to..*/.static
15990 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d   const u8 *fts5M
159a0 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73  ultiIterTerm(Fts
159b0 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
159c0 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a  Iter, int *pn){.
159d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
159e0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
159f0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15a00 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70  ].iFirst ];.  *p
15a10 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20  n = p->term.n;. 
15a20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e   return p->term.
15a30 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
15a40 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 63  rn true if the c
15a50 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20 70 61  hunk iterator pa
15a60 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
15a70 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a  nd argument is.*
15a80 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20  * at EOF. Or if 
15a90 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
15aa0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f  eady occurred. O
15ab0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
15ac0 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   false..*/.stati
15ad0 63 20 69 6e 74 20 66 74 73 35 43 68 75 6e 6b 49  c int fts5ChunkI
15ae0 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
15af0 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b 49 74   *p, Fts5ChunkIt
15b00 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
15b10 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
15b20 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 3b  Iter->pLeaf==0);
15b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
15b40 65 20 74 68 65 20 63 68 75 6e 6b 2d 69 74 65 72  e the chunk-iter
15b50 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
15b60 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61 20 74   chunk of data t
15b70 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69  o read..*/.stati
15b80 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
15b90 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
15ba0 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b  ex *p, Fts5Chunk
15bb0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
15bc0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 6e  assert( pIter->n
15bd0 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20 29 3b  Rem>=pIter->n );
15be0 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20 2d  .  pIter->nRem -
15bf0 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20 20 66 74  = pIter->n;.  ft
15c00 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
15c10 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
15c20 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
15c30 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 30 3b  .  pIter->p = 0;
15c40 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 52  .  if( pIter->nR
15c50 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  em>0 ){.    Fts5
15c60 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
15c70 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77   pIter->iLeafRow
15c80 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66 20  id++;.    pLeaf 
15c90 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d  = pIter->pLeaf =
15ca0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
15cb0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77   pIter->iLeafRow
15cc0 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  id);.    if( pLe
15cd0 61 66 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  af ){.      pIte
15ce0 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49 74 65 72  r->n = MIN(pIter
15cf0 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66 2d 3e 6e  ->nRem, pLeaf->n
15d00 2d 34 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  -4);.      pIter
15d10 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70 2b 34  ->p = pLeaf->p+4
15d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15d30 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a 65 20 74  *.** Intialize t
15d40 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f  he chunk iterato
15d50 72 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 6f  r to read the po
15d60 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61  sition list data
15d70 20 66 6f 72 20 77 68 69 63 68 20 0a 2a 2a 20 74   for which .** t
15d80 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 69 73  he size field is
15d90 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66 66 20   at offset iOff 
15da0 6f 66 20 6c 65 61 66 20 70 4c 65 61 66 2e 20 0a  of leaf pLeaf. .
15db0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15dc0 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74  ts5ChunkIterInit
15dd0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15df0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
15e00 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
15e10 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
15e20 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
15e30 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74 65 72 61  /* Segment itera
15e40 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73 6c  tor to read posl
15e50 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 74  ist from */.  Ft
15e60 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74  s5ChunkIter *pIt
15e70 65 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er            /*
15e80 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
15e90 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
15ea0 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
15eb0 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3b 0a 20  = pSeg->pLeaf;. 
15ec0 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67   int iOff = pSeg
15ed0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a  ->iLeafOffset;..
15ee0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
15ef0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
15f00 29 29 3b 0a 20 20 2f 2a 20 49 66 20 46 74 73 35  ));.  /* If Fts5
15f10 53 65 67 49 74 65 72 2e 70 53 65 67 20 69 73 20  SegIter.pSeg is 
15f20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
15f30 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65  iterator iterate
15f40 73 20 74 68 72 6f 75 67 68 20 64 61 74 61 0a 20  s through data. 
15f50 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 73 74   ** currently st
15f60 6f 72 65 64 20 69 6e 20 61 20 68 61 73 68 20 74  ored in a hash t
15f70 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  able. In this ca
15f80 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  se there is no l
15f90 65 61 66 2d 72 6f 77 69 64 0a 20 20 2a 2a 20 74  eaf-rowid.  ** t
15fa0 6f 20 63 61 6c 63 75 6c 61 74 65 2e 20 20 2a 2f  o calculate.  */
15fb0 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65  .  if( pSeg->pSe
15fc0 67 20 29 7b 0a 20 20 20 20 69 36 34 20 72 6f 77  g ){.    i64 row
15fd0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
15fe0 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 70 53  T_ROWID(pSeg->pS
15ff0 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  eg->iSegid, 0, p
16000 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b  Seg->iLeafPgno);
16010 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
16020 66 52 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a  fRowid = rowid;.
16030 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52    }..  fts5DataR
16040 65 66 65 72 65 6e 63 65 28 70 4c 65 61 66 29 3b  eference(pLeaf);
16050 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
16060 3d 20 70 4c 65 61 66 3b 0a 20 20 70 49 74 65 72  = pLeaf;.  pIter
16070 2d 3e 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e  ->nRem = pSeg->n
16080 50 6f 73 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20  Pos;.  pIter->n 
16090 3d 20 4d 49 4e 28 70 4c 65 61 66 2d 3e 6e 20 2d  = MIN(pLeaf->n -
160a0 20 69 4f 66 66 2c 20 70 49 74 65 72 2d 3e 6e 52   iOff, pIter->nR
160b0 65 6d 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20  em);.  pIter->p 
160c0 3d 20 70 4c 65 61 66 2d 3e 70 20 2b 20 69 4f 66  = pLeaf->p + iOf
160d0 66 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  f;.  if( pIter->
160e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
160f0 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c  ChunkIterNext(p,
16100 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a   pIter);.  }.}..
16110 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
16120 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65  ChunkIterRelease
16130 28 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a  (Fts5ChunkIter *
16140 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 44 61  pIter){.  fts5Da
16150 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
16160 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
16170 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a  ->pLeaf = 0;.}..
16180 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
16190 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
161a0 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
161b0 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 65 20  re pStruct. The 
161c0 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69  new segment.** i
161d0 64 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  d must be betwee
161e0 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e  n 1 and 65335 in
161f0 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73  clusive, and mus
16200 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79  t not be used by
16210 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74   .** any current
16220 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d  ly existing segm
16230 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65 20 73  ent. If a free s
16240 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74  egment id cannot
16250 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51   be found,.** SQ
16260 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74  LITE_FULL is ret
16270 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
16280 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
16290 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
162a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
162b0 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a  a no-op. 0 is .*
162c0 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  * returned in th
162d0 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
162e0 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63  ic int fts5Alloc
162f0 61 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64  ateSegid(Fts5Ind
16300 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
16310 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
16320 20 20 75 33 32 20 69 53 65 67 69 64 20 3d 20 30    u32 iSegid = 0
16330 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
16340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16350 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53   if( pStruct->nS
16360 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58  egment>=FTS5_MAX
16370 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20  _SEGMENT ){.    
16380 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16390 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _FULL;.    }else
163a0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
163b0 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
163c0 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
163d0 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
163e0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
163f0 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76 6f 69  izeof(u32), (voi
16400 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20 20 20  d*)&iSegid);.   
16410 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 28 69       iSegid = (i
16420 53 65 67 69 64 20 25 20 28 28 31 20 3c 3c 20 46  Segid % ((1 << F
16430 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d  TS5_DATA_ID_B) -
16440 20 32 29 29 20 2b 20 31 3b 0a 20 20 20 20 20 20   2)) + 1;.      
16450 20 20 61 73 73 65 72 74 28 20 69 53 65 67 69 64    assert( iSegid
16460 3e 30 20 26 26 20 69 53 65 67 69 64 3c 3d 36 35  >0 && iSegid<=65
16470 35 33 35 20 29 3b 0a 20 20 20 20 20 20 20 20 66  535 );.        f
16480 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
16490 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
164a0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
164b0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
164c0 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
164d0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
164e0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
164f0 20 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64        if( iSegid
16500 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ==pStruct->aLeve
16510 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
16520 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20  g].iSegid ){.   
16530 20 20 20 20 20 20 20 20 20 20 20 69 53 65 67 69             iSegi
16540 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
16550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
16560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16570 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16580 72 65 74 75 72 6e 20 28 69 6e 74 29 69 53 65 67  return (int)iSeg
16590 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  id;.}../*.** Dis
165a0 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75  card all data cu
165b0 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69  rrently cached i
165c0 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
165d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
165e0 64 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61  d fts5IndexDisca
165f0 72 64 44 61 74 61 28 46 74 73 35 49 6e 64 65 78  rdData(Fts5Index
16600 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
16610 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e  p->pHash || p->n
16620 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29  PendingData==0 )
16630 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68  ;.  if( p->pHash
16640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   ){.    sqlite3F
16650 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e  ts5HashClear(p->
16660 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e  pHash);.    p->n
16670 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b  PendingData = 0;
16680 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
16690 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
166a0 20 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20   the prefix, in 
166b0 62 79 74 65 73 2c 20 74 68 61 74 20 62 75 66 66  bytes, that buff
166c0 65 72 20 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73  er (nNew/pNew) s
166d0 68 61 72 65 73 0a 2a 2a 20 77 69 74 68 20 62 75  hares.** with bu
166e0 66 66 65 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29  ffer (nOld/pOld)
166f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16700 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
16710 73 73 28 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20  ss(.  int nOld, 
16720 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a  const u8 *pOld,.
16730 20 20 69 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73    int nNew, cons
16740 74 20 75 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20  t u8 *pNew.){.  
16750 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
16760 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65   fts5BlobCompare
16770 28 70 4f 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e 65  (pOld, nOld, pNe
16780 77 2c 20 6e 4e 65 77 29 3c 30 20 29 3b 0a 20 20  w, nNew)<0 );.  
16790 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
167a0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
167b0 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20  Old[i]!=pNew[i] 
167c0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
167d0 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74  eturn i;.}..stat
167e0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
167f0 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46  eDlidxClear(.  F
16800 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
16810 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
16820 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46  Writer,.  int bF
16830 6c 75 73 68 20 20 20 20 20 20 20 20 20 20 20 20  lush            
16840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16850 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64  true, write dlid
16860 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a  x to disk */.){.
16870 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
16880 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20  t( bFlush==0 || 
16890 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  (pWriter->nDlidx
168a0 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  >0 && pWriter->a
168b0 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
168c0 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
168d0 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
168e0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  x; i++){.    Fts
168f0 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
16900 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
16910 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20  >aDlidx[i];.    
16920 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  if( pDlidx->buf.
16930 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  n==0 ) break;.  
16940 20 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a    if( bFlush ){.
16950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
16960 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b  lidx->pgno!=0 );
16970 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
16980 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
16990 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
169a0 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
169b0 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e  gid, i, pDlidx->
169c0 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  pgno),.         
169d0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20   pDlidx->buf.p, 
169e0 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20  pDlidx->buf.n.  
169f0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
16a00 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
16a10 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e  erZero(&pDlidx->
16a20 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78  buf);.    pDlidx
16a30 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30  ->bPrevValid = 0
16a40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
16a50 72 6f 77 20 74 68 65 20 70 57 72 69 74 65 72 2d  row the pWriter-
16a60 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20  >aDlidx[] array 
16a70 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c  to at least nLvl
16a80 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a   elements in siz
16a90 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72  e..** Any new ar
16aa0 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  ray elements are
16ab0 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72   zeroed before r
16ac0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
16ad0 74 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74  tic int fts5Writ
16ae0 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74  eDlidxGrow(.  Ft
16af0 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
16b00 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
16b10 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c  iter,.  int nLvl
16b20 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
16b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c  =SQLITE_OK && nL
16b40 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c  vl>=pWriter->nDl
16b50 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
16b60 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69  lidxWriter *aDli
16b70 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57  dx = (Fts5DlidxW
16b80 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72  riter*)sqlite3_r
16b90 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
16ba0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c  pWriter->aDlidx,
16bb0 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
16bc0 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a  xWriter) * nLvl.
16bd0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61      );.    if( a
16be0 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Dlidx==0 ){.    
16bf0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16c00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
16c10 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  e{.      int nBy
16c20 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
16c30 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 28  DlidxWriter) * (
16c40 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e  nLvl - pWriter->
16c50 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d  nDlidx);.      m
16c60 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57  emset(&aDlidx[pW
16c70 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20  riter->nDlidx], 
16c80 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
16c90 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
16ca0 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20   = aDlidx;.     
16cb0 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
16cc0 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20   = nLvl;.    }. 
16cd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72   }.  return p->r
16ce0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  c;.}../*.** If a
16cf0 6e 20 22 6e 45 6d 70 74 79 22 20 72 65 63 6f 72  n "nEmpty" recor
16d00 64 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  d must be writte
16d10 6e 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  n to the b-tree 
16d20 62 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 0a  before the next.
16d30 2a 2a 20 74 65 72 6d 2c 20 77 72 69 74 65 20 69  ** term, write i
16d40 74 20 6e 6f 77 2e 20 0a 2a 2f 0a 73 74 61 74 69  t now. .*/.stati
16d50 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
16d60 42 74 72 65 65 4e 45 6d 70 74 79 28 46 74 73 35  BtreeNEmpty(Fts5
16d70 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
16d80 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
16d90 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ){.  if( pWriter
16da0 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20  ->nEmpty ){.    
16db0 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20  int bFlag = 0;. 
16dc0 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
16dd0 72 20 2a 70 50 67 3b 0a 20 20 20 20 70 50 67 20  r *pPg;.    pPg 
16de0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
16df0 74 65 72 5b 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20  ter[1];..    /* 
16e00 49 66 20 74 68 65 72 65 20 77 65 72 65 20 46 54  If there were FT
16e10 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
16e20 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20  E or more empty 
16e30 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74  leaf pages writt
16e40 65 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  en.    ** to the
16e50 20 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20   database, also 
16e60 77 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73  write the doclis
16e70 74 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e  t-index to disk.
16e80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72    */.    if( pWr
16e90 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
16ea0 62 75 66 2e 6e 3e 30 20 26 26 20 70 57 72 69 74  buf.n>0 && pWrit
16eb0 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35  er->nEmpty>=FTS5
16ec0 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
16ed0 29 7b 0a 20 20 20 20 20 20 62 46 6c 61 67 20 3d  ){.      bFlag =
16ee0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74   1;.    }.    ft
16ef0 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61  s5WriteDlidxClea
16f00 72 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46  r(p, pWriter, bF
16f10 6c 61 67 29 3b 0a 20 20 20 20 66 74 73 35 42 75  lag);.    fts5Bu
16f20 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
16f30 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62  (&p->rc, &pPg->b
16f40 75 66 2c 20 62 46 6c 61 67 29 3b 0a 20 20 20 20  uf, bFlag);.    
16f50 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
16f60 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
16f70 70 50 67 2d 3e 62 75 66 2c 20 70 57 72 69 74 65  pPg->buf, pWrite
16f80 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20  r->nEmpty);.    
16f90 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20  pWriter->nEmpty 
16fa0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
16fb0 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
16fc0 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65 72  Clear(p, pWriter
16fd0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  , 0);.  }..  ass
16fe0 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 6e 44  ert( pWriter->nD
16ff0 6c 69 64 78 3d 3d 30 20 7c 7c 20 70 57 72 69 74  lidx==0 || pWrit
17000 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
17010 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  f.n==0 );.  asse
17020 72 74 28 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c  rt( pWriter->nDl
17030 69 64 78 3d 3d 30 20 7c 7c 20 70 57 72 69 74 65  idx==0 || pWrite
17040 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 50 72  r->aDlidx[0].bPr
17050 65 76 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 7d 0a  evValid==0 );.}.
17060 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17070 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28  5WriteBtreeGrow(
17080 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
17090 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
170a0 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  iter){.  if( p->
170b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
170c0 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69  .    Fts5PageWri
170d0 74 65 72 20 2a 61 4e 65 77 3b 0a 20 20 20 20 46  ter *aNew;.    F
170e0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
170f0 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65  New;.    int nNe
17100 77 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 50  w = sizeof(Fts5P
17110 61 67 65 57 72 69 74 65 72 29 20 2a 20 28 70 57  ageWriter) * (pW
17120 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 2b 31  riter->nWriter+1
17130 29 3b 0a 0a 20 20 20 20 61 4e 65 77 20 3d 20 28  );..    aNew = (
17140 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29  Fts5PageWriter*)
17150 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
17160 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
17170 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , nNew);.    if(
17180 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
17190 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
171a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65  _NOMEM;.      re
171b0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
171c0 20 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 57   pNew = &aNew[pW
171d0 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 5d 3b  riter->nWriter];
171e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
171f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
17200 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20 20  PageWriter));.  
17210 20 20 70 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20 31    pNew->pgno = 1
17220 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
17230 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
17240 3e 72 63 2c 20 26 70 4e 65 77 2d 3e 62 75 66 2c  >rc, &pNew->buf,
17250 20 31 29 3b 0a 0a 20 20 20 20 70 57 72 69 74 65   1);..    pWrite
17260 72 2d 3e 6e 57 72 69 74 65 72 2b 2b 3b 0a 20 20  r->nWriter++;.  
17270 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74    pWriter->aWrit
17280 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d  er = aNew;.  }.}
17290 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
172a0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
172b0 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 65  each leaf page e
172c0 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74 20  xcept the first 
172d0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
172e0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65   at least one te
172f0 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e 54  rm. Argument (nT
17300 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74 68  erm/pTerm) is th
17310 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20  e split-key - a 
17320 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20  term that.** is 
17330 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
17340 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f  terms written to
17350 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73 2c   earlier leaves,
17360 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f 72   and equal to or
17370 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  .** smaller than
17380 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
17390 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66 2e  on the new leaf.
173a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
173b0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
173c0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
173d0 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
173e0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  . If an error.**
173f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
17400 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
17410 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17420 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
17430 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
17440 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
17450 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
17460 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
17470 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
17480 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
17490 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
174a0 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
174b0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
174c0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ject */.  int nT
174d0 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  erm, const u8 *p
174e0 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69 72  Term      /* Fir
174f0 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70  st term on new p
17500 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
17510 69 48 65 69 67 68 74 3b 0a 20 20 66 6f 72 28 69  iHeight;.  for(i
17520 48 65 69 67 68 74 3d 31 3b 20 31 3b 20 69 48 65  Height=1; 1; iHe
17530 69 67 68 74 2b 2b 29 7b 0a 20 20 20 20 46 74 73  ight++){.    Fts
17540 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
17550 67 65 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65  ge;..    if( iHe
17560 69 67 68 74 3e 3d 70 57 72 69 74 65 72 2d 3e 6e  ight>=pWriter->n
17570 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Writer ){.      
17580 66 74 73 35 57 72 69 74 65 42 74 72 65 65 47 72  fts5WriteBtreeGr
17590 6f 77 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ow(p, pWriter);.
175a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
175b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ) return;.    }.
175c0 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72      pPage = &pWr
175d0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 48  iter->aWriter[iH
175e0 65 69 67 68 74 5d 3b 0a 0a 20 20 20 20 66 74 73  eight];..    fts
175f0 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74  5WriteBtreeNEmpt
17600 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a  y(p, pWriter);..
17610 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62      if( pPage->b
17620 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  uf.n>=p->pConfig
17630 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  ->pgsz ){.      
17640 2f 2a 20 70 50 61 67 65 20 77 69 6c 6c 20 62 65  /* pPage will be
17650 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
17660 2e 20 54 68 65 20 74 65 72 6d 20 77 69 6c 6c 20  . The term will 
17670 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
17680 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  the.      ** par
17690 65 6e 74 20 6f 66 20 70 50 61 67 65 2e 20 20 2a  ent of pPage.  *
176a0 2f 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  /.      i64 iRow
176b0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
176c0 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  T_ROWID(pWriter-
176d0 3e 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74  >iSegid, iHeight
176e0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
176f0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
17700 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70  ite(p, iRowid, p
17710 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
17720 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20  ge->buf.n);.    
17730 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
17740 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20  (&pPage->buf);. 
17750 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
17760 65 72 6f 28 26 70 50 61 67 65 2d 3e 74 65 72 6d  ero(&pPage->term
17770 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
17780 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
17790 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
177a0 62 75 66 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70  buf, pPage[-1].p
177b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50 61 67  gno);.      pPag
177c0 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d  e->pgno++;.    }
177d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
177e0 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65 66 69  nPre = fts5Prefi
177f0 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
17800 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
17810 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
17820 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73  Term);.      fts
17830 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
17840 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
17850 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29  ge->buf, nPre+2)
17860 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
17870 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
17880 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
17890 75 66 2c 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b  uf, nTerm-nPre);
178a0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
178b0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
178c0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
178d0 20 6e 54 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65   nTerm-nPre, pTe
178e0 72 6d 2b 6e 50 72 65 29 3b 0a 20 20 20 20 20 20  rm+nPre);.      
178f0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
17900 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65  ->rc, &pPage->te
17910 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
17920 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17930 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
17940 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17950 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
17960 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20  flushing a leaf 
17970 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
17980 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61  ns no.** terms a
17990 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a  t all to disk..*
179a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
179b0 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
179c0 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rm(.  Fts5Index 
179d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
179e0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
179f0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
17a00 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
17a10 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20  *pWriter        
17a20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
17a30 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  ct */.){.  /* If
17a40 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72   there were no r
17a50 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61  owids on the lea
17a60 66 20 70 61 67 65 20 65 69 74 68 65 72 20 61 6e  f page either an
17a70 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  d the doclist-in
17a80 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72  dex.  ** has alr
17a90 65 61 64 79 20 62 65 65 6e 20 73 74 61 72 74 65  eady been starte
17aa0 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30  d, append an 0x0
17ab0 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a  0 byte to it.  *
17ac0 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
17ad0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
17ae0 67 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  ge && pWriter->a
17af0 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
17b00 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64   ){.    Fts5Dlid
17b10 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
17b20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
17b30 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  dx[0];.    asser
17b40 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76  t( pDlidx->bPrev
17b50 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c  Valid );.    sql
17b60 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
17b70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
17b80 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
17b90 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
17ba0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75  ncrement the "nu
17bb0 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69  mber of sequenti
17bc0 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75  al leaves withou
17bd0 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65  t a term" counte
17be0 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  r. */.  pWriter-
17bf0 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74  >nEmpty++;.}..st
17c00 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69  atic i64 fts5Dli
17c10 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
17c20 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a  wid(Fts5Buffer *
17c30 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f  pBuf){.  i64 iRo
17c40 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  wid;.  int iOff;
17c50 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 67  ..  iOff = 1 + g
17c60 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
17c70 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  p[1], (u64*)&iRo
17c80 77 69 64 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  wid);.  getVarin
17c90 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d  t(&pBuf->p[iOff]
17ca0 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29  , (u64*)&iRowid)
17cb0 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69  ;.  return iRowi
17cc0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69  d;.}../*.** Rowi
17cd0 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73  d iRowid has jus
17ce0 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20  t been appended 
17cf0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  to the current l
17d00 65 61 66 20 70 61 67 65 2e 20 49 74 20 69 73 20  eaf page. It is 
17d10 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20  the.** first on 
17d20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  the page. This f
17d30 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
17d40 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
17d50 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75 72 72  ntry to the curr
17d60 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69  ent.** doclist-i
17d70 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
17d80 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c  void fts5WriteDl
17d90 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73  idxAppend(.  Fts
17da0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
17db0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
17dc0 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f  iter, .  i64 iRo
17dd0 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  wid.){.  int i;.
17de0 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
17df0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e  ..  for(i=0; p->
17e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17e10 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b   bDone==0; i++){
17e20 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20  .    i64 iVal;. 
17e30 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
17e40 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57  er *pDlidx = &pW
17e50 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
17e60 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64  ;..    if( pDlid
17e70 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f  x->buf.n>=p->pCo
17e80 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
17e90 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
17ea0 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  nt doclist-index
17eb0 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57   page is full. W
17ec0 72 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20  rite it to disk 
17ed0 61 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a  and push.      *
17ee0 2a 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77  * a copy of iRow
17ef0 69 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  id (which will b
17f00 65 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20  ecome the first 
17f10 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78  rowid on the nex
17f20 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69  t.      ** docli
17f30 73 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st-index leaf pa
17f40 67 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20  ge) up into the 
17f50 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68  next level of th
17f60 65 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20  e b-tree .      
17f70 2a 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49 66  ** hierarchy. If
17f80 20 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20   the node being 
17f90 66 6c 75 73 68 65 64 20 69 73 20 63 75 72 72 65  flushed is curre
17fa0 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f  ntly the root no
17fb0 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73  de,.      ** als
17fc0 6f 20 70 75 73 68 20 69 74 73 20 66 69 72 73 74  o push its first
17fd0 20 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20   rowid upwards. 
17fe0 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  */.      pDlidx-
17ff0 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31  >buf.p[0] = 0x01
18000 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20  ;    /* Not the 
18010 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20  root node */.   
18020 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
18030 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
18040 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
18050 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
18060 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f   i, pDlidx->pgno
18070 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c  ),.          pDl
18080 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69  idx->buf.p, pDli
18090 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20  dx->buf.n.      
180a0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  );.      fts5Wri
180b0 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70  teDlidxGrow(p, p
180c0 57 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20  Writer, i+2);.  
180d0 20 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57      pDlidx = &pW
180e0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
180f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
18100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18110 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d  pDlidx[1].buf.n=
18120 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  =0 ){.        i6
18130 34 20 69 46 69 72 73 74 20 3d 20 66 74 73 35 44  4 iFirst = fts5D
18140 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74  lidxExtractFirst
18150 52 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62  Rowid(&pDlidx->b
18160 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  uf);..        /*
18170 20 54 68 69 73 20 77 61 73 20 74 68 65 20 72 6f   This was the ro
18180 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74  ot node. Push it
18190 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70  s first rowid up
181a0 20 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   to the new root
181b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c  . */.        pDl
181c0 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44  idx[1].pgno = pD
181d0 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  lidx->pgno;.    
181e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
181f0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
18200 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
18210 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20  x[1].buf, 0);.  
18220 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
18230 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
18240 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
18250 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69  idx[1].buf, pDli
18260 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  dx->pgno);.     
18270 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
18280 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
18290 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
182a0 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29  [1].buf, iFirst)
182b0 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  ;.        pDlidx
182c0 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d  [1].bPrevValid =
182d0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69   1;.        pDli
182e0 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46  dx[1].iPrev = iF
182f0 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  irst;.      }.. 
18300 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
18310 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69  BufferZero(&pDli
18320 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20  dx->buf);.      
18330 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
18340 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44  id = 0;.      pD
18350 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20  lidx->pgno++;.  
18360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
18370 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Done = 1;.    }.
18380 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
18390 3e 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20  >bPrevValid ){. 
183a0 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77       iVal = iRow
183b0 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72  id - pDlidx->iPr
183c0 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ev;.    }else{. 
183d0 20 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d       i64 iPgno =
183e0 20 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72   (i==0 ? pWriter
183f0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
18400 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70  o : pDlidx[-1].p
18410 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  gno);.      asse
18420 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  rt( pDlidx->buf.
18430 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  n==0 );.      sq
18440 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
18450 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
18460 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
18470 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20  , !bDone);.     
18480 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
18490 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
184a0 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
184b0 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20  buf, iPgno);.   
184c0 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
184d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
184e0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
184f0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
18500 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
18510 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69   iVal);.    pDli
18520 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
18530 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e   1;.    pDlidx->
18540 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a  iPrev = iRowid;.
18550 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
18560 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  id fts5WriteFlus
18570 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20  hLeaf(Fts5Index 
18580 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
18590 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73  r *pWriter){.  s
185a0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
185b0 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20  ero[] = { 0x00, 
185c0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
185d0 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72   };.  Fts5PageWr
185e0 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
185f0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
18600 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  0];.  i64 iRowid
18610 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ;..  if( pWriter
18620 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
18630 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  ge ){.    /* No 
18640 74 65 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e  term was written
18650 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a   to this page. *
18660 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d  /.    assert( 0=
18670 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61  =fts5GetU16(&pPa
18680 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b  ge->buf.p[2]) );
18690 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74  .    fts5WriteBt
186a0 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72  reeNoTerm(p, pWr
186b0 69 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iter);.  }..  /*
186c0 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
186d0 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  nt page to the d
186e0 62 2e 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d  b. */.  iRowid =
186f0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
18700 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
18710 67 69 64 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  gid, 0, pPage->p
18720 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61  gno);.  fts5Data
18730 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c  Write(p, iRowid,
18740 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70   pPage->buf.p, p
18750 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20  Page->buf.n);.. 
18760 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
18770 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f  he next page. */
18780 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
18790 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a  o(&pPage->buf);.
187a0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
187b0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
187c0 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a  pPage->buf, 4, z
187d0 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  ero);.  pPage->p
187e0 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63  gno++;..  /* Inc
187f0 72 65 61 73 65 20 74 68 65 20 6c 65 61 76 65 73  rease the leaves
18800 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72   written counter
18810 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e   */.  pWriter->n
18820 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a  LeafWritten++;..
18830 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61    /* The new lea
18840 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73  f holds no terms
18850 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20   or rowids */.  
18860 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
18870 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
18880 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
18890 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
188a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
188b0 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
188c0 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  m to the segment
188d0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62   being written b
188e0 79 20 74 68 65 20 77 72 69 74 65 72 20 70 61 73  y the writer pas
188f0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65  sed.** as the se
18900 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
18910 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
18920 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
18930 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
18940 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
18950 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
18960 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
18970 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
18980 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
18990 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
189a0 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20  teAppendTerm(.  
189b0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
189c0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
189d0 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e  pWriter,.  int n
189e0 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a  Term, const u8 *
189f0 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20  pTerm .){.  int 
18a00 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  nPrefix;        
18a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
18a20 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63  ytes of prefix c
18a30 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  ompression for t
18a40 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67  erm */.  Fts5Pag
18a50 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
18a60 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
18a70 65 72 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74  er[0];..  assert
18a80 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d  ( pPage->buf.n==
18a90 30 20 7c 7c 20 70 50 61 67 65 2d 3e 62 75 66 2e  0 || pPage->buf.
18aa0 6e 3e 34 20 29 3b 0a 20 20 69 66 28 20 70 50 61  n>4 );.  if( pPa
18ab0 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a  ge->buf.n==0 ){.
18ac0 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20      /* Zero the 
18ad0 66 69 72 73 74 20 74 65 72 6d 20 61 6e 64 20 66  first term and f
18ae0 69 72 73 74 20 64 6f 63 69 64 20 66 69 65 6c 64  irst docid field
18af0 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  s */.    static 
18b00 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20  const u8 zero[] 
18b10 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20  = { 0x00, 0x00, 
18b20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x00, 0x00 };.  
18b30 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
18b40 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
18b50 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a  pPage->buf, 4, z
18b60 65 72 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ero);.    assert
18b70 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
18b80 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 20  tTermInPage );. 
18b90 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29   }.  if( p->rc )
18ba0 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66   return;.  .  if
18bb0 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
18bc0 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
18bd0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
18be0 20 22 66 69 72 73 74 20 74 65 72 6d 22 20 66 69   "first term" fi
18bf0 65 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  eld of the page 
18c00 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 61  header. */.    a
18c10 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
18c20 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20 70 50 61  f.p[2]==0 && pPa
18c30 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d 3d 30 20  ge->buf.p[3]==0 
18c40 29 3b 0a 20 20 20 20 66 74 73 35 50 75 74 55 31  );.    fts5PutU1
18c50 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
18c60 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  2], pPage->buf.n
18c70 29 3b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  );.    nPrefix =
18c80 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
18c90 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20  e->pgno!=1 ){.  
18ca0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
18cb0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
18cc0 20 61 20 6c 65 61 66 20 74 68 61 74 20 69 73 20   a leaf that is 
18cd0 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74  not the leftmost
18ce0 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a   leaf in.      *
18cf0 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d  * the segment b-
18d00 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  tree. In this ca
18d10 73 65 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  se it is necessa
18d20 72 79 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d  ry to add a term
18d30 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
18d40 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
18d50 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6c 61  y that is (a) la
18d60 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
18d70 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20  rgest term .    
18d80 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69    ** already wri
18d90 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d  tten to the segm
18da0 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c  ent and (b) smal
18db0 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ler than or equa
18dc0 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  l to.      ** th
18dd0 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65  is term. In othe
18de0 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69  r words, a prefi
18df0 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  x of (pTerm/nTer
18e00 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20  m) that is one. 
18e10 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e       ** byte lon
18e20 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e  ger than the lon
18e30 67 65 73 74 20 70 72 65 66 69 78 20 28 70 54 65  gest prefix (pTe
18e40 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73  rm/nTerm) shares
18e50 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20   with the.      
18e60 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ** previous term
18e70 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
18e80 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68    ** Usually, th
18e90 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  e previous term 
18ea0 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
18eb0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65  pPage->term. The
18ec0 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
18ed0 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20 69   ** is if this i
18ee0 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
18ef0 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69   written in an i
18f00 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
18f10 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20   step..      ** 
18f20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
18f30 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69   previous term i
18f40 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
18f50 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61   so just write a
18f60 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
18f70 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  f (pTerm/nTerm) 
18f80 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
18f90 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c  node. This is sl
18fa0 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  ightly.      ** 
18fb0 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74  inefficient, but
18fc0 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20   still correct. 
18fd0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
18fe0 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  = nTerm;.      i
18ff0 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  f( pPage->term.n
19000 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   ){.        n = 
19010 31 20 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f  1 + fts5PrefixCo
19020 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
19030 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
19040 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
19050 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
19060 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
19070 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c  Term(p, pWriter,
19080 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20   n, pTerm);.    
19090 20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74    pPage = &pWrit
190a0 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a  er->aWriter[0];.
190b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
190c0 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73     nPrefix = fts
190d0 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
190e0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70  pPage->term.n, p
190f0 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54  Page->term.p, nT
19100 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
19110 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
19120 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
19130 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72  &pPage->buf, nPr
19140 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  efix);.  }..  /*
19150 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62   Append the numb
19160 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e  er of bytes of n
19170 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68  ew data, then th
19180 65 20 74 65 72 6d 20 64 61 74 61 20 69 74 73 65  e term data itse
19190 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70  lf.  ** to the p
191a0 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
191b0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
191c0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
191d0 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50  >buf, nTerm - nP
191e0 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75  refix);.  fts5Bu
191f0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
19200 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
19210 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65  uf, nTerm - nPre
19220 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65  fix, &pTerm[nPre
19230 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64  fix]);..  /* Upd
19240 61 74 65 20 74 68 65 20 46 74 73 35 50 61 67 65  ate the Fts5Page
19250 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c  Writer.term fiel
19260 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  d. */.  fts5Buff
19270 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
19280 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72  Page->term, nTer
19290 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72  m, pTerm);.  pWr
192a0 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
192b0 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70  InPage = 0;..  p
192c0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
192d0 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20  widInPage = 0;. 
192e0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
192f0 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d  RowidInDoclist =
19300 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   1;..  assert( p
19310 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72  ->rc || (pWriter
19320 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57  ->nDlidx>0 && pW
19330 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
19340 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20  .buf.n==0) );.  
19350 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
19360 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  0].pgno = pPage-
19370 3e 70 67 6e 6f 3b 0a 0a 20 20 2f 2a 20 49 66 20  >pgno;..  /* If 
19380 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
19390 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66   page is full, f
193a0 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e  lush it to disk.
193b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
193c0 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
193d0 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
193e0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
193f0 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
19400 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70    }.}../*.** App
19410 65 6e 64 20 61 20 64 6f 63 69 64 20 61 6e 64 20  end a docid and 
19420 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
19430 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  ze field to the 
19440 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
19450 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19460 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
19470 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
19480 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
19490 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
194a0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20  .  i64 iRowid,. 
194b0 20 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20 20 69   int nPos.){.  i
194c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
194d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50  _OK ){.    Fts5P
194e0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
194f0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
19500 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a  iter[0];..    /*
19510 20 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62   If this is to b
19520 65 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69  e the first doci
19530 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
19540 20 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a   page, set the .
19550 20 20 20 20 2a 2a 20 64 6f 63 69 64 2d 70 6f 69      ** docid-poi
19560 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
19570 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70  -header. Also ap
19580 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20  pend a value to 
19590 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a  the dlidx.    **
195a0 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65   buffer, in case
195b0 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
195c0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
195d0 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  /.    if( pWrite
195e0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
195f0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
19600 73 35 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e  s5PutU16(pPage->
19610 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75  buf.p, pPage->bu
19620 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35  f.n);.      fts5
19630 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
19640 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f  (p, pWriter, iRo
19650 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  wid);.    }..   
19660 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f   /* Write the do
19670 63 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  cid. */.    if( 
19680 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
19690 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c  owidInDoclist ||
196a0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
196b0 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
196c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
196d0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
196e0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
196f0 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65   iRowid);.    }e
19700 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
19710 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77  t( p->rc || iRow
19720 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72 65  id>pWriter->iPre
19730 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  vRowid );.      
19740 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
19750 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
19760 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77  pPage->buf, iRow
19770 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50  id - pWriter->iP
19780 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  revRowid);.    }
19790 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50  .    pWriter->iP
197a0 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  revRowid = iRowi
197b0 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  d;.    pWriter->
197c0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
197d0 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57  list = 0;.    pW
197e0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
197f0 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20  idInPage = 0;.. 
19800 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
19810 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
19820 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
19830 50 6f 73 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  Pos);..    if( p
19840 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e  Page->buf.n>=p->
19850 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
19860 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
19870 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
19880 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  iter);.    }.  }
19890 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63  .}..#if 0.static
198a0 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
198b0 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28  ppendPoslistInt(
198c0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
198d0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
198e0 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
198f0 74 20 69 56 61 6c 0a 29 7b 0a 20 20 69 66 28 20  t iVal.){.  if( 
19900 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19910 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65   ){.    Fts5Page
19920 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
19930 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
19940 72 5b 30 5d 3b 0a 20 20 20 20 66 74 73 35 42 75  r[0];.    fts5Bu
19950 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
19960 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
19970 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20  >buf, iVal);.   
19980 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
19990 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
199a0 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gsz ){.      fts
199b0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
199c0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
199d0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
199e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
199f0 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
19a00 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35 49  istData(.  Fts5I
19a10 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
19a20 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
19a30 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  er, .  const u8 
19a40 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e  *aData, .  int n
19a50 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50 61  Data.){.  Fts5Pa
19a60 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
19a70 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
19a80 74 65 72 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74 20  ter[0];.  const 
19a90 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20  u8 *a = aData;. 
19aa0 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a   int n = nData;.
19ab0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e    .  assert( p->
19ac0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20  pConfig->pgsz>0 
19ad0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
19ae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19af0 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20  (pPage->buf.n + 
19b00 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  n)>=p->pConfig->
19b10 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 6e 74 20  pgsz ){.    int 
19b20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nReq = p->pConfi
19b30 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d  g->pgsz - pPage-
19b40 3e 62 75 66 2e 6e 3b 0a 20 20 20 20 69 6e 74 20  >buf.n;.    int 
19b50 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77  nCopy = 0;.    w
19b60 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71  hile( nCopy<nReq
19b70 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75   ){.      i64 du
19b80 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79  mmy;.      nCopy
19b90 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61   += getVarint(&a
19ba0 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26  [nCopy], (u64*)&
19bb0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20  dummy);.    }.  
19bc0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
19bd0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
19be0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70  pPage->buf, nCop
19bf0 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20  y, a);.    a += 
19c00 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20  nCopy;.    n -= 
19c10 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57  nCopy;.    fts5W
19c20 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
19c30 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20   pWriter);.  }. 
19c40 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
19c50 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
19c60 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
19c70 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b  age->buf, n, a);
19c80 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
19c90 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
19ca0 65 6e 64 5a 65 72 6f 62 79 74 65 28 46 74 73 35  endZerobyte(Fts5
19cb0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
19cc0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
19cd0 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  ){.  fts5BufferA
19ce0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
19cf0 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 61 57  rc, &pWriter->aW
19d00 72 69 74 65 72 5b 30 5d 2e 62 75 66 2c 20 30 29  riter[0].buf, 0)
19d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
19d20 20 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64   any data cached
19d30 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f   by the writer o
19d40 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74  bject to the dat
19d50 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a  abase. Free any.
19d60 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ** allocations a
19d70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
19d80 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74  he writer..*/.st
19d90 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
19da0 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73  iteFinish(.  Fts
19db0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
19dc0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
19dd0 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  iter,         /*
19de0 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
19df0 2f 0a 20 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  /.  int *pnHeigh
19e00 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
19e10 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67      /* OUT: Heig
19e20 68 74 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ht of the b-tree
19e30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61   */.  int *pnLea
19e40 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
19e50 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
19e60 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
19e70 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a  es in b-tree */.
19e80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
19e90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19ea0 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61  OK ){.    Fts5Pa
19eb0 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20  geWriter *pLeaf 
19ec0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
19ed0 74 65 72 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ter[0];.    if( 
19ee0 70 4c 65 61 66 2d 3e 70 67 6e 6f 3d 3d 31 20 26  pLeaf->pgno==1 &
19ef0 26 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3d 3d  & pLeaf->buf.n==
19f00 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 4c 65  0 ){.      *pnLe
19f10 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70  af = 0;.      *p
19f20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  nHeight = 0;.   
19f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
19f40 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e 34  ( pLeaf->buf.n>4
19f50 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
19f60 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
19f70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
19f80 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 4c 65 61    }.      *pnLea
19f90 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d  f = pLeaf->pgno-
19fa0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 72  1;.      if( pWr
19fb0 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3d 3d 31  iter->nWriter==1
19fc0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d   && pWriter->nEm
19fd0 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c  pty>=FTS5_MIN_DL
19fe0 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  IDX_SIZE ){.    
19ff0 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
1a000 65 65 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  eeGrow(p, pWrite
1a010 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1a020 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
1a030 57 72 69 74 65 72 3e 31 20 29 7b 0a 20 20 20 20  Writer>1 ){.    
1a040 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
1a050 65 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72 69  eeNEmpty(p, pWri
1a060 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
1a070 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
1a080 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
1a090 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  ;..      for(i=1
1a0a0 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72  ; i<pWriter->nWr
1a0b0 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iter; i++){.    
1a0c0 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
1a0d0 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74  er *pPg = &pWrit
1a0e0 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a  er->aWriter[i];.
1a0f0 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
1a100 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20  Write(p, .      
1a110 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45        FTS5_SEGME
1a120 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
1a130 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 50 67  ->iSegid, i, pPg
1a140 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20 20 20 20 20  ->pgno), .      
1a150 20 20 20 20 20 20 70 50 67 2d 3e 62 75 66 2e 70        pPg->buf.p
1a160 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 0a 20 20 20  , pPg->buf.n.   
1a170 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
1a180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
1a190 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
1a1a0 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nWriter; i++){. 
1a1b0 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
1a1c0 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65  r *pPg = &pWrite
1a1d0 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20  r->aWriter[i];. 
1a1e0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
1a1f0 65 28 26 70 50 67 2d 3e 74 65 72 6d 29 3b 0a 20  e(&pPg->term);. 
1a200 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
1a210 65 28 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20 20  e(&pPg->buf);.  
1a220 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1a230 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  (pWriter->aWrite
1a240 72 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  r);..  for(i=0; 
1a250 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
1a260 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  x; i++){.    sql
1a270 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
1a280 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c  ee(&pWriter->aDl
1a290 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d  idx[i].buf);.  }
1a2a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1a2b0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29  pWriter->aDlidx)
1a2c0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1a2d0 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a   fts5WriteInit(.
1a2e0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1a2f0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1a300 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e   *pWriter, .  in
1a310 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 6d 65  t iSegid.){.  me
1a320 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c  mset(pWriter, 0,
1a330 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
1a340 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74  riter));.  pWrit
1a350 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  er->iSegid = iSe
1a360 67 69 64 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d  gid;..  pWriter-
1a370 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74 73 35  >aWriter = (Fts5
1a380 50 61 67 65 57 72 69 74 65 72 2a 29 66 74 73 35  PageWriter*)fts5
1a390 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
1a3a0 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
1a3b0 65 72 29 29 3b 0a 20 20 69 66 28 20 66 74 73 35  er));.  if( fts5
1a3c0 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70  WriteDlidxGrow(p
1a3d0 2c 20 70 57 72 69 74 65 72 2c 20 31 29 20 29 20  , pWriter, 1) ) 
1a3e0 72 65 74 75 72 6e 3b 0a 20 20 70 57 72 69 74 65  return;.  pWrite
1a3f0 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20 31 3b 0a  r->nWriter = 1;.
1a400 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64    pWriter->nDlid
1a410 78 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  x = 1;.  pWriter
1a420 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
1a430 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  o = 1;.  pWriter
1a440 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1a450 67 65 20 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69  ge = 1;.}..stati
1a460 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1a470 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28 0a 20  InitForAppend(. 
1a480 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1a4b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1a4c0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1a4d0 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
1a4e0 57 72 69 74 65 72 20 74 6f 20 69 6e 69 74 69 61  Writer to initia
1a4f0 6c 69 7a 65 20 2a 2f 0a 20 20 46 74 73 35 53 74  lize */.  Fts5St
1a500 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1a510 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
1a520 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f 20 61  ment object to a
1a530 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  ppend to */.){. 
1a540 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70 53 65   int nByte = pSe
1a550 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73 69 7a  g->nHeight * siz
1a560 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
1a570 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 57  er);.  memset(pW
1a580 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
1a590 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
1a5a0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65  ;.  pWriter->iSe
1a5b0 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67  gid = pSeg->iSeg
1a5c0 69 64 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61  id;.  pWriter->a
1a5d0 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 50 61  Writer = (Fts5Pa
1a5e0 67 65 57 72 69 74 65 72 2a 29 66 74 73 35 49 64  geWriter*)fts5Id
1a5f0 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65  xMalloc(p, nByte
1a600 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44  );.  pWriter->aD
1a610 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64  lidx = (Fts5Dlid
1a620 78 57 72 69 74 65 72 2a 29 66 74 73 35 49 64 78  xWriter*)fts5Idx
1a630 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
1a640 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
1a650 29 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  ));..  if( p->rc
1a660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a670 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 31 3b     int pgno = 1;
1a680 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1a690 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20  pWriter->nDlidx 
1a6a0 3d 20 31 3b 0a 20 20 20 20 70 57 72 69 74 65 72  = 1;.    pWriter
1a6b0 2d 3e 6e 57 72 69 74 65 72 20 3d 20 70 53 65 67  ->nWriter = pSeg
1a6c0 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 70  ->nHeight;.    p
1a6d0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
1a6e0 30 5d 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  0].pgno = pSeg->
1a6f0 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20  pgnoLast+1;.    
1a700 66 6f 72 28 69 3d 70 53 65 67 2d 3e 6e 48 65 69  for(i=pSeg->nHei
1a710 67 68 74 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  ght-1; i>0; i--)
1a720 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
1a730 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1a740 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  T_ROWID(pWriter-
1a750 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 67 6e 6f  >iSegid, i, pgno
1a760 29 3b 0a 20 20 20 20 20 20 46 74 73 35 50 61 67  );.      Fts5Pag
1a770 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26  eWriter *pPg = &
1a780 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
1a790 5b 69 5d 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  [i];.      pPg->
1a7a0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
1a7b0 20 20 20 66 74 73 35 44 61 74 61 42 75 66 66 65     fts5DataBuffe
1a7c0 72 28 70 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20  r(p, &pPg->buf, 
1a7d0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
1a7e0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a7f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 46  _OK ){.        F
1a800 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a  ts5NodeIter ss;.
1a810 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65          fts5Node
1a820 49 74 65 72 49 6e 69 74 28 70 50 67 2d 3e 62 75  IterInit(pPg->bu
1a830 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 2c  f.p, pPg->buf.n,
1a840 20 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20 77   &ss);.        w
1a850 68 69 6c 65 28 20 73 73 2e 61 44 61 74 61 20 29  hile( ss.aData )
1a860 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
1a870 74 28 26 70 2d 3e 72 63 2c 20 26 73 73 29 3b 0a  t(&p->rc, &ss);.
1a880 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a890 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1a8a0 50 67 2d 3e 74 65 72 6d 2c 20 73 73 2e 74 65 72  Pg->term, ss.ter
1a8b0 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 29 3b  m.n, ss.term.p);
1a8c0 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  .        pgno = 
1a8d0 73 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 20  ss.iChild;.     
1a8e0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46     fts5NodeIterF
1a8f0 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 20 20  ree(&ss);.      
1a900 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1a910 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
1a920 45 5f 4f 4b 20 7c 7c 20 28 70 67 6e 6f 2b 70 57  E_OK || (pgno+pW
1a930 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3d 3d  riter->nEmpty)==
1a940 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
1a950 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
1a960 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
1a970 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 1;.    assert(
1a980 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
1a990 72 5b 30 5d 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29  r[0].term.n==0 )
1a9a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1a9b0 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77 61  terator pIter wa
1a9c0 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
1a9d0 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  e through the in
1a9e0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  put segments of 
1a9f0 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65  on an.** increme
1aa00 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61  ntal merge opera
1aa10 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  tion. This funct
1aa20 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66  ion is called if
1aa30 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1aa40 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68  .** merge step h
1aa50 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74 20  as finished but 
1aa60 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f  the input has no
1aa70 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c  t been completel
1aa80 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a  y exhausted..*/.
1aa90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1aaa0 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73  TrimSegments(Fts
1aab0 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d  5Index *p, Fts5M
1aac0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
1aad0 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
1aae0 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a  Fts5Buffer buf;.
1aaf0 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
1ab00 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1ab10 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  fer));.  for(i=0
1ab20 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
1ab30 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53   i++){.    Fts5S
1ab40 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
1ab50 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a  pIter->aSeg[i];.
1ab60 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53      if( pSeg->pS
1ab70 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  eg==0 ){.      /
1ab80 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d  * no-op */.    }
1ab90 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70  else if( pSeg->p
1aba0 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
1abb0 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f   /* All keys fro
1abc0 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 65 67  m this input seg
1abd0 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74  ment have been t
1abe0 72 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65  ransfered to the
1abf0 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
1ac00 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65 20 66  * Set both the f
1ac10 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61  irst and last pa
1ac20 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20  ge-numbers to 0 
1ac30 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1ac40 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
1ac50 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70  gment is now emp
1ac60 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65  ty. */.      pSe
1ac70 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  g->pSeg->pgnoLas
1ac80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  t = 0;.      pSe
1ac90 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  g->pSeg->pgnoFir
1aca0 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
1acb0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  e{.      int iOf
1acc0 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  f = pSeg->iTermL
1acd0 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f  eafOffset;     /
1ace0 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20  * Offset on new 
1acf0 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  first leaf page 
1ad00 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65  */.      i64 iLe
1ad10 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46  afRowid;.      F
1ad20 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
1ad30 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20        int iId = 
1ad40 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67  pSeg->pSeg->iSeg
1ad50 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64  id;.      u8 aHd
1ad60 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78  r[4] = {0x00, 0x
1ad70 30 30 2c 20 30 78 30 30 2c 20 30 78 30 34 7d 3b  00, 0x00, 0x04};
1ad80 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77  ..      iLeafRow
1ad90 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1ada0 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 30 2c 20  T_ROWID(iId, 0, 
1adb0 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50  pSeg->iTermLeafP
1adc0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74  gno);.      pDat
1add0 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
1ade0 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b  (p, iLeafRowid);
1adf0 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
1ae00 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
1ae10 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29  BufferZero(&buf)
1ae20 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1ae30 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1ae40 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a  p->rc, &buf, siz
1ae50 65 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72 29  eof(aHdr), aHdr)
1ae60 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1ae70 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1ae80 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1ae90 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20  Seg->term.n);.  
1aea0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1aeb0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1aec0 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74  c, &buf, pSeg->t
1aed0 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72  erm.n, pSeg->ter
1aee0 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74  m.p);.        ft
1aef0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1af00 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1af10 20 70 44 61 74 61 2d 3e 6e 20 2d 20 69 4f 66 66   pData->n - iOff
1af20 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  , &pData->p[iOff
1af30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ]);.        fts5
1af40 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
1af50 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67  a);.        pSeg
1af60 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
1af70 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  t = pSeg->iTermL
1af80 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20  eafPgno;.       
1af90 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
1afa0 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
1afb0 52 4f 57 49 44 28 69 49 64 2c 20 30 2c 20 31 29  ROWID(iId, 0, 1)
1afc0 2c 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20  ,iLeafRowid);.  
1afd0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
1afe0 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
1aff0 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
1b000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b010 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1b020 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f  Free(&buf);.}../
1b030 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
1b040 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72  oid fts5IndexMer
1b050 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49  geLevel(.  Fts5I
1b060 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1b070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1b080 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1b090 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
1b0a0 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c  ture **ppStruct,
1b0b0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
1b0c0 3a 20 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e  : Stucture of in
1b0d0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76  dex */.  int iLv
1b0e0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1b0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
1b100 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
1b110 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
1b120 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  nRem            
1b130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1b140 74 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61  te up to this ma
1b150 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73  ny output leaves
1b160 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72   */.){.  Fts5Str
1b170 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
1b180 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46  = *ppStruct;.  F
1b190 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
1b1a0 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
1b1b0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1b1c0 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
1b1d0 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b  eLevel *pLvlOut;
1b1e0 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
1b1f0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20  ter *pIter = 0; 
1b200 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
1b210 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74  o read input dat
1b220 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20  a */.  int nRem 
1b230 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d  = pnRem ? *pnRem
1b240 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74   : 0;  /* Output
1b250 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74   leaf pages left
1b260 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
1b270 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20  nt nInput;      
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  * Number of inpu
1b2a0 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
1b2b0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
1b2c0 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
1b2d0 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1b2e0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1b2f0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
1b300 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  ;     /* Output 
1b310 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
1b320 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20  5Buffer term;.  
1b330 69 6e 74 20 62 52 65 71 75 69 72 65 44 6f 63 6c  int bRequireDocl
1b340 69 73 74 54 65 72 6d 20 3d 20 30 3b 20 20 20 20  istTerm = 0;    
1b350 2f 2a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69  /* Doclist termi
1b360 6e 61 74 6f 72 20 28 30 78 30 30 29 20 72 65 71  nator (0x00) req
1b370 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62  uired */.  int b
1b380 4f 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  Oldest;         
1b390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b3a0 75 65 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ue if the output
1b3b0 20 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20   segment is the 
1b3c0 6f 6c 64 65 73 74 20 2a 2f 0a 0a 20 20 61 73 73  oldest */..  ass
1b3d0 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63  ert( iLvl<pStruc
1b3e0 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61  t->nLevel );.  a
1b3f0 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65  ssert( pLvl->nMe
1b400 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20  rge<=pLvl->nSeg 
1b410 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72  );..  memset(&wr
1b420 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  iter, 0, sizeof(
1b430 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b  Fts5SegWriter));
1b440 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c  .  memset(&term,
1b450 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
1b460 75 66 66 65 72 29 29 3b 0a 20 20 69 66 28 20 70  uffer));.  if( p
1b470 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
1b480 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53     pLvlOut = &pS
1b490 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1b4a0 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  vl+1];.    asser
1b4b0 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  t( pLvlOut->nSeg
1b4c0 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74  >0 );.    nInput
1b4d0 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b   = pLvl->nMerge;
1b4e0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e  .    fts5WriteIn
1b4f0 69 74 46 6f 72 41 70 70 65 6e 64 28 70 2c 20 26  itForAppend(p, &
1b500 77 72 69 74 65 72 2c 20 26 70 4c 76 6c 4f 75 74  writer, &pLvlOut
1b510 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
1b520 6e 53 65 67 2d 31 5d 29 3b 0a 20 20 20 20 70 53  nSeg-1]);.    pS
1b530 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
1b540 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
1b550 67 2d 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  g-1];.  }else{. 
1b560 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
1b570 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
1b580 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a  d(p, pStruct);..
1b590 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68      /* Extend th
1b5a0 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e Fts5Structure 
1b5b0 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72  object as requir
1b5c0 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  ed to ensure the
1b5d0 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73   output.    ** s
1b5e0 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a  egment exists. *
1b5f0 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d  /.    if( iLvl==
1b600 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d  pStruct->nLevel-
1b610 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  1 ){.      fts5S
1b620 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
1b630 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63  (&p->rc, ppStruc
1b640 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  t);.      pStruc
1b650 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1b660 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
1b670 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
1b680 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
1b690 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29  t, iLvl+1, 1, 0)
1b6a0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
1b6b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  ) return;.    pL
1b6c0 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
1b6d0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
1b6e0 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72   pLvlOut = &pStr
1b6f0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1b700 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  +1];..    fts5Wr
1b710 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74  iteInit(p, &writ
1b720 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20  er, iSegid);..  
1b730 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
1b740 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20   segment to the 
1b750 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a  output level */.
1b760 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c      pSeg = &pLvl
1b770 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75  Out->aSeg[pLvlOu
1b780 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c  t->nSeg];.    pL
1b790 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20  vlOut->nSeg++;. 
1b7a0 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
1b7b0 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67  st = 1;.    pSeg
1b7c0 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1b7d0 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e  d;.    pStruct->
1b7e0 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20  nSegment++;..   
1b7f0 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66   /* Read input f
1b800 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rom all segments
1b810 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65   in the input le
1b820 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75  vel */.    nInpu
1b830 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a  t = pLvl->nSeg;.
1b840 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20    }.  bOldest = 
1b850 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d  (pLvlOut->nSeg==
1b860 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c  1 && pStruct->nL
1b870 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a  evel==iLvl+2);..
1b880 23 69 66 20 30 0a 66 70 72 69 6e 74 66 28 73 74  #if 0.fprintf(st
1b890 64 6f 75 74 2c 20 22 6d 65 72 67 69 6e 67 20 25  dout, "merging %
1b8a0 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  d segments from 
1b8b0 6c 65 76 65 6c 20 25 64 21 22 2c 20 6e 49 6e 70  level %d!", nInp
1b8c0 75 74 2c 20 69 4c 76 6c 29 3b 0a 66 66 6c 75 73  ut, iLvl);.fflus
1b8d0 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69  h(stdout);.#endi
1b8e0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  f..  assert( iLv
1b8f0 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74  l>=0 );.  for(ft
1b900 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
1b910 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c  , pStruct, 0, 0,
1b920 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e   0, 0, iLvl, nIn
1b930 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  put, &pIter);.  
1b940 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1b950 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d  rEof(p, pIter)==
1b960 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  0;.      fts5Mul
1b970 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
1b980 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a  ter, 0, 0).  ){.
1b990 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1b9a0 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
1b9b0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
1b9c0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
1b9d0 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49 74  .    Fts5ChunkIt
1b9e0 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20 20  er sPos;        
1b9f0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
1ba00 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 6f  erate through po
1ba10 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
1ba20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20     int nPos;    
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73   /* position-lis
1ba50 74 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61 6c  t size field val
1ba60 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54  ue */.    int nT
1ba70 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  erm;.    const u
1ba80 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20 2f  8 *pTerm;..    /
1ba90 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b 65 79 20  * Check for key 
1baa0 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f  annihilation. */
1bab0 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e  .    if( pSeg->n
1bac0 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65  Pos==0 && (bOlde
1bad0 73 74 20 7c 7c 20 70 53 65 67 2d 3e 62 44 65 6c  st || pSeg->bDel
1bae0 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
1baf0 0a 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49  ..    fts5ChunkI
1bb00 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c  terInit(p, pSeg,
1bb10 20 26 73 50 6f 73 29 3b 0a 0a 20 20 20 20 70 54   &sPos);..    pT
1bb20 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  erm = fts5MultiI
1bb30 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
1bb40 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
1bb50 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c  nTerm!=term.n ||
1bb60 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74   memcmp(pTerm, t
1bb70 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b  erm.p, nTerm) ){
1bb80 0a 20 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d  .      if( pnRem
1bb90 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66   && writer.nLeaf
1bba0 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a  Written>nRem ){.
1bbb0 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e          fts5Chun
1bbc0 6b 49 74 65 72 52 65 6c 65 61 73 65 28 26 73 50  kIterRelease(&sP
1bbd0 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  os);.        bre
1bbe0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
1bbf0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
1bc00 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64  new term. Append
1bc10 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f   a term to the o
1bc20 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a  utput segment. *
1bc30 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 71  /.      if( bReq
1bc40 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20  uireDoclistTerm 
1bc50 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57  ){.        fts5W
1bc60 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79  riteAppendZeroby
1bc70 74 65 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a  te(p, &writer);.
1bc80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1bc90 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
1bca0 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54  m(p, &writer, nT
1bcb0 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
1bcc0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
1bcd0 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20  (&p->rc, &term, 
1bce0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1bcf0 20 20 20 20 20 62 52 65 71 75 69 72 65 44 6f 63       bRequireDoc
1bd00 6c 69 73 74 54 65 72 6d 20 3d 20 31 3b 0a 20 20  listTerm = 1;.  
1bd10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65    }..    /* Appe
1bd20 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20  nd the rowid to 
1bd30 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
1bd40 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
1bd50 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 6e 50 6f  TSIZE */.    nPo
1bd60 73 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 2a 32  s = pSeg->nPos*2
1bd70 20 2b 20 70 53 65 67 2d 3e 62 44 65 6c 3b 0a 20   + pSeg->bDel;. 
1bd80 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
1bd90 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74  ndRowid(p, &writ
1bda0 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  er, fts5MultiIte
1bdb0 72 52 6f 77 69 64 28 70 49 74 65 72 29 2c 20 6e  rRowid(pIter), n
1bdc0 50 6f 73 29 3b 0a 0a 20 20 20 20 66 6f 72 28 2f  Pos);..    for(/
1bdd0 2a 20 6e 6f 6f 70 20 2a 2f 3b 20 21 66 74 73 35  * noop */; !fts5
1bde0 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20  ChunkIterEof(p, 
1bdf0 26 73 50 6f 73 29 3b 20 66 74 73 35 43 68 75 6e  &sPos); fts5Chun
1be00 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 26 73 50  kIterNext(p, &sP
1be10 6f 73 29 29 7b 0a 20 20 20 20 20 20 66 74 73 35  os)){.      fts5
1be20 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69  WriteAppendPosli
1be30 73 74 44 61 74 61 28 70 2c 20 26 77 72 69 74 65  stData(p, &write
1be40 72 2c 20 73 50 6f 73 2e 70 2c 20 73 50 6f 73 2e  r, sPos.p, sPos.
1be50 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  n);.    }..    f
1be60 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c 65  ts5ChunkIterRele
1be70 61 73 65 28 26 73 50 6f 73 29 3b 0a 20 20 7d 0a  ase(&sPos);.  }.
1be80 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20  .  /* Flush the 
1be90 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 74  last leaf page t
1bea0 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20  o disk. Set the 
1beb0 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62  output segment b
1bec0 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a  -tree height.  *
1bed0 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20  * and last leaf 
1bee0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74  page number at t
1bef0 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a  he same time.  *
1bf00 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69 6e  /.  fts5WriteFin
1bf10 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20  ish(p, &writer, 
1bf20 26 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20  &pSeg->nHeight, 
1bf30 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29  &pSeg->pgnoLast)
1bf40 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c  ;..  if( fts5Mul
1bf50 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
1bf60 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  er) ){.    int i
1bf70 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  ;..    /* Remove
1bf80 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73   the redundant s
1bf90 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
1bfa0 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
1bfb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1bfc0 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20  nInput; i++){.  
1bfd0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f      fts5DataRemo
1bfe0 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76  veSegment(p, pLv
1bff0 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69  l->aSeg[i].iSegi
1c000 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
1c010 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64  * Remove the red
1c020 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20  undant segments 
1c030 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c  from the input l
1c040 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20  evel */.    if( 
1c050 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70  pLvl->nSeg!=nInp
1c060 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
1c070 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nMove = (pLvl->n
1c080 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20  Seg - nInput) * 
1c090 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
1c0a0 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
1c0b0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c      memmove(pLvl
1c0c0 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61  ->aSeg, &pLvl->a
1c0d0 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f  Seg[nInput], nMo
1c0e0 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ve);.    }.    p
1c0f0 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
1c100 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20   -= nInput;.    
1c110 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49  pLvl->nSeg -= nI
1c120 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  nput;.    pLvl->
1c130 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20  nMerge = 0;.    
1c140 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  if( pSeg->pgnoLa
1c150 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  st==0 ){.      p
1c160 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a  LvlOut->nSeg--;.
1c170 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e        pStruct->n
1c180 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d  Segment--;.    }
1c190 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1c1a0 73 65 72 74 28 20 70 53 65 67 2d 3e 6e 48 65 69  sert( pSeg->nHei
1c1b0 67 68 74 3e 30 20 26 26 20 70 53 65 67 2d 3e 70  ght>0 && pSeg->p
1c1c0 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20  gnoLast>0 );.   
1c1d0 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
1c1e0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
1c1f0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
1c200 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66  nInput;.  }..  f
1c210 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
1c220 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74  (p, pIter);.  ft
1c230 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
1c240 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
1c250 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
1c260 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
1c270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70  ;.}../*.** Do up
1c280 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66   to nPg pages of
1c290 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20   automerge work 
1c2a0 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  on the index..*/
1c2b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1c2c0 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46  5IndexMerge(.  F
1c2d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c2f0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1c300 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1c310 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1c320 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
1c330 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
1c340 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
1c350 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20 20   */.  int nPg   
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f        /* Pages o
1c380 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a  f work to do */.
1c390 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  ){.  int nRem = 
1c3a0 6e 50 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  nPg;.  Fts5Struc
1c3b0 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
1c3c0 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69  *ppStruct;.  whi
1c3d0 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d  le( nRem>0 && p-
1c3e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1c3f0 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  {.    int iLvl; 
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c410 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20    /* To iterate 
1c420 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
1c430 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c  /.    int iBestL
1c440 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  vl = 0;         
1c450 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72    /* Level offer
1c460 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70  ing the most inp
1c470 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
1c480 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30     int nBest = 0
1c490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c4a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  * Number of inpu
1c4b0 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65  t segments on be
1c4c0 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20  st level */..   
1c4d0 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c   /* Set iBestLvl
1c4e0 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f   to the level to
1c4f0 20 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d   read input segm
1c500 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20  ents from. */.  
1c510 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
1c520 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20  t->nLevel>0 );. 
1c530 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
1c540 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
1c550 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
1c560 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1c570 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
1c580 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1c590 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iLvl];.      if(
1c5a0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b   pLvl->nMerge ){
1c5b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
1c5c0 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20  l->nMerge>nBest 
1c5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65  ){.          iBe
1c5e0 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20  stLvl = iLvl;.  
1c5f0 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20          nBest = 
1c600 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20  pLvl->nMerge;.  
1c610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c620 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1c630 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
1c640 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  Seg>nBest ){.   
1c650 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76       nBest = pLv
1c660 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20  l->nSeg;.       
1c670 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
1c680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c690 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74  .    /* If nBest
1c6a0 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65   is still 0, the
1c6b0 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  n the index must
1c6c0 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69   be empty. */.#i
1c6d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1c6e0 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  G.    for(iLvl=0
1c6f0 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c  ; nBest==0 && iL
1c700 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1c710 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1c720 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
1c730 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1c740 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20  .nSeg==0 );.    
1c750 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  }.#endif..    if
1c760 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66  ( nBest<p->pConf
1c770 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a  ig->nAutomerge .
1c780 20 20 20 20 20 20 20 20 26 26 20 70 53 74 72 75          && pStru
1c790 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74  ct->aLevel[iBest
1c7a0 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a  Lvl].nMerge==0 .
1c7b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62        ){.      b
1c7c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c7d0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
1c7e0 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
1c7f0 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d   iBestLvl, &nRem
1c800 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1c810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1c820 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1c830 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
1c840 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
1c850 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
1c860 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20  (p, iBestLvl+1, 
1c870 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
1c880 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
1c890 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f 2a  = pStruct;.}../*
1c8a0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e  .** A total of n
1c8b0 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20  Leaf leaf pages 
1c8c0 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74  of data has just
1c8d0 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f   been flushed to
1c8e0 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65   a level-0.** se
1c8f0 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63  gment. This func
1c900 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65  tion updates the
1c910 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61   write-counter a
1c920 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20  ccordingly and, 
1c930 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c  if.** necessary,
1c940 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d   performs increm
1c950 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b  ental merge work
1c960 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1c970 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
1c980 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
1c990 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
1c9a0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
1c9b0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1c9c0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1c9d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1c9e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1c9f0 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a  IndexAutomerge(.
1ca00 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1ca30 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1ca40 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1ca50 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
1ca60 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1ca70 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1ca80 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  dex */.  int nLe
1ca90 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
1caa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1cab0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61  er of output lea
1cac0 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ves just written
1cad0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
1cae0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1caf0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75   p->pConfig->nAu
1cb00 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20  tomerge>0 ){.   
1cb10 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1cb20 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1cb30 75 63 74 3b 0a 20 20 20 20 69 36 34 20 6e 57 72  uct;.    i64 nWr
1cb40 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
1cb50 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
1cb60 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65  l value of write
1cb70 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20  -counter */.    
1cb80 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20  int nWork;      
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cba0 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d   Number of work-
1cbb0 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72  quanta to perfor
1cbc0 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  m */.    int nRe
1cbd0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1cbe0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cbf0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c   of leaf pages l
1cc00 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
1cc10 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
1cc20 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  he write-counter
1cc30 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  . While doing so
1cc40 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a  , set nWork. */.
1cc50 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74      nWrite = pSt
1cc60 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
1cc70 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d  ter;.    nWork =
1cc80 20 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61   ((nWrite + nLea
1cc90 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  f) / p->nWorkUni
1cca0 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70  t) - (nWrite / p
1ccb0 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 3b 0a 20 20  ->nWorkUnit);.  
1ccc0 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74    pStruct->nWrit
1ccd0 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61  eCounter += nLea
1cce0 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 70 2d  f;.    nRem = p-
1ccf0 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f  >nWorkUnit * nWo
1cd00 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c  rk * pStruct->nL
1cd10 65 76 65 6c 3b 0a 0a 20 20 20 20 66 74 73 35 49  evel;..    fts5I
1cd20 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 70 70 53  ndexMerge(p, ppS
1cd30 74 72 75 63 74 2c 20 6e 52 65 6d 29 3b 0a 20 20  truct, nRem);.  
1cd40 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1cd50 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1cd60 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  merge(.  Fts5Ind
1cd70 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1cd80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1cd90 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1cda0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1cdb0 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20  re **ppStruct   
1cdc0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1cdd0 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
1cde0 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  e of index */.){
1cdf0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72  .  const int nCr
1ce00 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  isis = p->pConfi
1ce10 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b  g->nCrisisMerge;
1ce20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1ce30 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
1ce40 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76  truct;.  int iLv
1ce50 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
1ce60 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
1ce70 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e  OK || pStruct->n
1ce80 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69  Level>0 );.  whi
1ce90 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
1cea0 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d  E_OK && pStruct-
1ceb0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
1cec0 65 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20  eg>=nCrisis ){. 
1ced0 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1cee0 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75  eLevel(p, &pStru
1cef0 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20  ct, iLvl, 0);.  
1cf00 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
1cf10 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31  romote(p, iLvl+1
1cf20 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  , pStruct);.    
1cf30 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  iLvl++;.  }.  *p
1cf40 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
1cf50 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  t;.}..static int
1cf60 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
1cf70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1cf80 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
1cf90 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
1cfa0 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20  TE_OK;.  return 
1cfb0 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73  rc;.}..typedef s
1cfc0 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
1cfd0 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b  tx Fts5FlushCtx;
1cfe0 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73  .struct Fts5Flus
1cff0 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64  hCtx {.  Fts5Ind
1d000 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35  ex *pIdx;.  Fts5
1d010 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
1d020 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66  ; .};../*.** Buf
1d030 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61  fer aBuf[] conta
1d040 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61  ins a list of va
1d050 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c  rints, all small
1d060 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a   enough to fit.*
1d070 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  * in a 32-bit in
1d080 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68  teger. Return th
1d090 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61  e size of the la
1d0a0 72 67 65 73 74 20 70 72 65 66 69 78 20 6f 66 20  rgest prefix of 
1d0b0 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d  this .** list nM
1d0c0 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73  ax bytes or less
1d0d0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
1d0e0 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c  tic int fts5Posl
1d0f0 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20  istPrefix(const 
1d100 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d  u8 *aBuf, int nM
1d110 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a  ax){.  int ret;.
1d120 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72    u32 dummy;.  r
1d130 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
1d140 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79  nt32(aBuf, dummy
1d150 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
1d160 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73  .    int i = fts
1d170 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42  5GetVarint32(&aB
1d180 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b  uf[ret], dummy);
1d190 0a 20 20 20 20 69 66 28 20 28 72 65 74 20 2b 20  .    if( (ret + 
1d1a0 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61  i) > nMax ) brea
1d1b0 6b 3b 0a 20 20 20 20 72 65 74 20 2b 3d 20 69 3b  k;.    ret += i;
1d1c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
1d1d0 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74  t;.}..#define ft
1d1e0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1d1f0 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c  ndBlob(pBuf, pBl
1d200 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 5c 0a 20  ob, nBlob) { \. 
1d210 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
1d220 53 70 61 63 65 3e 3d 28 70 42 75 66 2d 3e 6e 2b  Space>=(pBuf->n+
1d230 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20  nBlob) );       
1d240 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79        \.  memcpy
1d250 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
1d260 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  n], pBlob, nBlob
1d270 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  );             \
1d280 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e 42  .  pBuf->n += nB
1d290 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a          \.}../*.
1d2c0 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e  ** Flush the con
1d2d0 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f  tents of in-memo
1d2e0 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69 48  ry hash table iH
1d2f0 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76  ash to a new lev
1d300 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  el-0 .** segment
1d310 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75   on disk. Also u
1d320 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65 73  pdate the corres
1d330 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72  ponding structur
1d340 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  e record..**.** 
1d350 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1d360 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
1d370 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
1d380 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
1d390 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
1d3a0 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1d3b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1d3c0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1d3d0 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65  oid fts5FlushOne
1d3e0 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a  Hash(Fts5Index *
1d3f0 70 29 7b 0a 20 20 46 74 73 35 48 61 73 68 20 2a  p){.  Fts5Hash *
1d400 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68  pHash = p->pHash
1d410 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
1d420 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e  e *pStruct;.  in
1d430 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20  t iSegid;.  int 
1d440 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20  pgnoLast = 0;   
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d460 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   Last leaf page 
1d470 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e  number in segmen
1d480 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  t */..  /* Obtai
1d490 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
1d4a0 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
1d4b0 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74  ture and allocat
1d4c0 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
1d4d0 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  id.  ** for the 
1d4e0 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d  new level-0 segm
1d4f0 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75  ent.  */.  pStru
1d500 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
1d510 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 53 65  reRead(p);.  iSe
1d520 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61  gid = fts5Alloca
1d530 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75  teSegid(p, pStru
1d540 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67  ct);..  if( iSeg
1d550 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  id ){.    const 
1d560 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43  int pgsz = p->pC
1d570 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 0a 20 20  onfig->pgsz;..  
1d580 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
1d590 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
1d5a0 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77  /* New segment w
1d5b0 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f  ithin pStruct */
1d5c0 0a 20 20 20 20 69 6e 74 20 6e 48 65 69 67 68 74  .    int nHeight
1d5d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d5e0 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20     /* Height of 
1d5f0 6e 65 77 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  new segment b-tr
1d600 65 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75  ee */.    Fts5Bu
1d610 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20  ffer *pBuf;     
1d620 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1d630 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73  r in which to as
1d640 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65  semble leaf page
1d650 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38   */.    const u8
1d660 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 0a 20 20   *zPrev = 0;..  
1d670 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1d680 77 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73 35  writer;.    fts5
1d690 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72  WriteInit(p, &wr
1d6a0 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a  iter, iSegid);..
1d6b0 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63      /* Pre-alloc
1d6c0 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20 75  ate the buffer u
1d6d0 73 65 64 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  sed to assemble 
1d6e0 6c 65 61 66 20 70 61 67 65 73 20 74 6f 20 74 68  leaf pages to th
1d6f0 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20  e target.    ** 
1d700 70 61 67 65 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  page size.  */. 
1d710 20 20 20 61 73 73 65 72 74 28 20 70 67 73 7a 3e     assert( pgsz>
1d720 30 20 29 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  0 );.    pBuf = 
1d730 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b  &writer.aWriter[
1d740 30 5d 2e 62 75 66 3b 0a 20 20 20 20 66 74 73 35  0].buf;.    fts5
1d750 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
1d760 63 2c 20 70 42 75 66 2c 20 70 67 73 7a 20 2b 20  c, pBuf, pgsz + 
1d770 32 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  20);..    /* Beg
1d780 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  in scanning thro
1d790 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20 65  ugh hash table e
1d7a0 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f  ntries. This loo
1d7b0 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
1d7c0 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d  each.    ** term
1d7d0 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e 74  /doclist current
1d7e0 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ly stored within
1d7f0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
1d800 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
1d810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d820 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 75        memset(pBu
1d830 66 2d 3e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20  f->p, 0, 4);.   
1d840 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 34 3b 0a     pBuf->n = 4;.
1d850 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1d860 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
1d870 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20  nInit(pHash, 0, 
1d880 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  0);.    }.    wh
1d890 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1d8a0 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
1d8b0 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
1d8c0 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20 20  of(pHash) ){.   
1d8d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d8e0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  Term;          /
1d8f0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
1d900 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  ing term */.    
1d910 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d930 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69   Size of zTerm i
1d940 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
1d950 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c   const u8 *pDocl
1d960 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ist;         /* 
1d970 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69  Pointer to docli
1d980 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  st for this term
1d990 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 44   */.      int nD
1d9a0 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oclist;         
1d9b0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1d9c0 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65   doclist in byte
1d9d0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
1d9e0 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20  Suffix;         
1d9f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1da00 66 20 74 65 72 6d 20 73 75 66 66 69 78 20 2a 2f  f term suffix */
1da10 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
1da20 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79  ts5HashScanEntry
1da30 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20  (pHash, &zTerm, 
1da40 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63  &pDoclist, &nDoc
1da50 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 6e 54 65  list);.      nTe
1da60 72 6d 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 72  rm = strlen(zTer
1da70 6d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65  m);..      /* De
1da80 63 69 64 65 20 69 66 20 74 68 65 20 74 65 72 6d  cide if the term
1da90 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
1daa0 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 49   current leaf. I
1dab0 66 20 69 74 20 77 69 6c 6c 20 6e 6f 74 2c 20 0a  f it will not, .
1dac0 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74        ** flush t
1dad0 68 65 20 6c 65 61 66 20 74 6f 20 64 69 73 6b 20  he leaf to disk 
1dae0 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  here.  */.      
1daf0 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 6e  if( (pBuf->n + n
1db00 54 65 72 6d 20 2b 20 32 29 20 3e 20 70 67 73 7a  Term + 2) > pgsz
1db10 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
1db20 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1db30 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20  , &writer);.    
1db40 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69 74      pBuf = &writ
1db50 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75  er.aWriter[0].bu
1db60 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  f;.        if( (
1db70 6e 54 65 72 6d 20 2b 20 33 32 29 20 3e 20 70 42  nTerm + 32) > pB
1db80 75 66 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20 20  uf->nSpace ){.  
1db90 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1dba0 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70  erGrow(&p->rc, p
1dbb0 42 75 66 2c 20 6e 54 65 72 6d 20 2b 20 33 32 20  Buf, nTerm + 32 
1dbc0 2d 20 70 42 75 66 2d 3e 6e 29 3b 0a 20 20 20 20  - pBuf->n);.    
1dbd0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
1dbe0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
1dbf0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
1dc00 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 74    /* Write the t
1dc10 65 72 6d 20 74 6f 20 74 68 65 20 6c 65 61 66 2e  erm to the leaf.
1dc20 20 41 6e 64 20 69 66 20 69 74 20 69 73 20 74 68   And if it is th
1dc30 65 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20 6c  e first on the l
1dc40 65 61 66 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  eaf, and.      *
1dc50 2a 20 74 68 65 20 6c 65 61 66 20 69 73 20 6e 6f  * the leaf is no
1dc60 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 31 2c  t page number 1,
1dc70 20 70 75 73 68 20 69 74 20 75 70 20 69 6e 74 6f   push it up into
1dc80 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
1dc90 61 72 63 68 79 20 0a 20 20 20 20 20 20 2a 2a 20  archy .      ** 
1dca0 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  as well.  */.   
1dcb0 20 20 20 69 66 28 20 77 72 69 74 65 72 2e 62 46     if( writer.bF
1dcc0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 3d 3d  irstTermInPage==
1dcd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
1dce0 20 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65 66   nPre = fts5Pref
1dcf0 69 78 43 6f 6d 70 72 65 73 73 28 6e 54 65 72 6d  ixCompress(nTerm
1dd00 2c 20 7a 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20  , zPrev, nTerm, 
1dd10 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d  (const u8*)zTerm
1dd20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 2d  );.        pBuf-
1dd30 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 50 75 74  >n += sqlite3Put
1dd40 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
1dd50 70 42 75 66 2d 3e 6e 5d 2c 20 6e 50 72 65 29 3b  pBuf->n], nPre);
1dd60 0a 20 20 20 20 20 20 20 20 6e 53 75 66 66 69 78  .        nSuffix
1dd70 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 3b   = nTerm - nPre;
1dd80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1dd90 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36        fts5PutU16
1dda0 28 26 70 42 75 66 2d 3e 70 5b 32 5d 2c 20 70 42  (&pBuf->p[2], pB
1ddb0 75 66 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  uf->n);.        
1ddc0 77 72 69 74 65 72 2e 62 46 69 72 73 74 54 65 72  writer.bFirstTer
1ddd0 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  mInPage = 0;.   
1dde0 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72 2e       if( writer.
1ddf0 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 21  aWriter[0].pgno!
1de00 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
1de10 69 6e 74 20 6e 50 72 65 20 3d 20 66 74 73 35 50  int nPre = fts5P
1de20 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 54  refixCompress(nT
1de30 65 72 6d 2c 20 7a 50 72 65 76 2c 20 6e 54 65 72  erm, zPrev, nTer
1de40 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54  m, (const u8*)zT
1de50 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  erm);.          
1de60 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65  fts5WriteBtreeTe
1de70 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e  rm(p, &writer, n
1de80 50 72 65 2b 31 2c 20 28 63 6f 6e 73 74 20 75 38  Pre+1, (const u8
1de90 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  *)zTerm);.      
1dea0 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69 74      pBuf = &writ
1deb0 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75  er.aWriter[0].bu
1dec0 66 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  f;.          ass
1ded0 65 72 74 28 20 6e 50 72 65 3c 6e 54 65 72 6d 20  ert( nPre<nTerm 
1dee0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1def0 20 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e       nSuffix = n
1df00 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
1df10 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73      pBuf->n += s
1df20 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 28  qlite3PutVarint(
1df30 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
1df40 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20  ], nSuffix);.   
1df50 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
1df60 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
1df70 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 7a 54  , (const u8*)&zT
1df80 65 72 6d 5b 6e 54 65 72 6d 2d 6e 53 75 66 66 69  erm[nTerm-nSuffi
1df90 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 0a 20  x], nSuffix);.. 
1dfa0 20 20 20 20 20 2f 2a 20 57 65 20 6a 75 73 74 20       /* We just 
1dfb0 77 72 6f 74 65 20 61 20 74 65 72 6d 20 69 6e 74  wrote a term int
1dfc0 6f 20 70 61 67 65 20 77 72 69 74 65 72 2e 61 57  o page writer.aW
1dfd0 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 2e 20 49  riter[0].pgno. I
1dfe0 66 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 64 6f  f a .      ** do
1dff0 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 74  clist-index is t
1e000 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
1e010 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2c  or this doclist,
1e020 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20   it will be.    
1e030 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20    ** associated 
1e040 77 69 74 68 20 74 68 69 73 20 70 61 67 65 2e 20  with this page. 
1e050 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1e060 20 77 72 69 74 65 72 2e 6e 44 6c 69 64 78 3e 30   writer.nDlidx>0
1e070 20 26 26 20 77 72 69 74 65 72 2e 61 44 6c 69 64   && writer.aDlid
1e080 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b  x[0].buf.n==0 );
1e090 0a 20 20 20 20 20 20 77 72 69 74 65 72 2e 61 44  .      writer.aD
1e0a0 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 77  lidx[0].pgno = w
1e0b0 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d  riter.aWriter[0]
1e0c0 2e 70 67 6e 6f 3b 0a 0a 20 20 20 20 20 20 69 66  .pgno;..      if
1e0d0 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e  ( pgsz>=(pBuf->n
1e0e0 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29   + nDoclist + 1)
1e0f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1e100 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
1e110 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
1e120 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
1e130 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
1e140 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1e150 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69  lob(pBuf, pDocli
1e160 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
1e170 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e180 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
1e190 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
1e1a0 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20  iDelta = 0;.    
1e1b0 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30      int iOff = 0
1e1c0 3b 0a 0a 20 20 20 20 20 20 20 20 77 72 69 74 65  ;..        write
1e1d0 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
1e1e0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  age = 0;..      
1e1f0 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
1e200 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74  doclist will not
1e210 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61   fit on this lea
1e220 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  f. The following
1e230 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f   .        ** loo
1e240 70 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  p iterates throu
1e250 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20  gh the poslists 
1e260 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
1e270 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20   current .      
1e280 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a    ** doclist.  *
1e290 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
1e2a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e2b0 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69  K && iOff<nDocli
1e2c0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1e2d0 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
1e2e0 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20      int nCopy;. 
1e2f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75           int bDu
1e300 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mmy;.          i
1e310 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
1e320 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d  (&pDoclist[iOff]
1e330 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
1e340 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70  ;.          nCop
1e350 79 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69  y = fts5GetPosli
1e360 73 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74  stSize(&pDoclist
1e370 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
1e380 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  bDummy);.       
1e390 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73     nCopy += nPos
1e3a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 77  ;.          iRow
1e3b0 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
1e3c0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
1e3d0 20 20 20 69 66 28 20 77 72 69 74 65 72 2e 62 46     if( writer.bF
1e3e0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1e3f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
1e400 74 73 35 50 75 74 55 31 36 28 26 70 42 75 66 2d  ts5PutU16(&pBuf-
1e410 3e 70 5b 30 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b  >p[0], pBuf->n);
1e420 20 20 20 2f 2a 20 66 69 72 73 74 20 64 6f 63 69     /* first doci
1e430 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20  d on page */.   
1e440 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e           pBuf->n
1e450 20 2b 3d 20 73 71 6c 69 74 65 33 50 75 74 56 61   += sqlite3PutVa
1e460 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  rint(&pBuf->p[pB
1e470 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b  uf->n], iRowid);
1e480 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69  .            wri
1e490 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49  ter.bFirstRowidI
1e4a0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
1e4b0 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1e4c0 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 26  DlidxAppend(p, &
1e4d0 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b  writer, iRowid);
1e4e0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1e4f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
1e500 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  uf->n += sqlite3
1e510 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
1e520 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65  >p[pBuf->n], iDe
1e530 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
1e540 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
1e550 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
1e560 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20  f->nSpace );..  
1e570 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75          if( (pBu
1e580 66 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d  f->n + nCopy) <=
1e590 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20   pgsz ){.       
1e5a0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
1e5b0 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20  re poslist will 
1e5c0 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  fit on the curre
1e5d0 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79  nt leaf. So copy
1e5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e5f0 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f  it in one go. */
1e600 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1e610 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1e620 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f  dBlob(pBuf, &pDo
1e630 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f  clist[iOff], nCo
1e640 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  py);.          }
1e650 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e660 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
1e670 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74  poslist will not
1e680 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61   fit on this lea
1e690 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73 0a 20  f. So it needs. 
1e6a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f             ** to
1e6b0 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20   be broken into 
1e6c0 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  sections. The on
1e6d0 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e  ly qualification
1e6e0 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20   being.         
1e6f0 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20     ** that each 
1e700 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73  varint must be s
1e710 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73  tored contiguous
1e720 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ly.  */.        
1e730 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50      const u8 *pP
1e740 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69  oslist = &pDocli
1e750 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  st[iOff];.      
1e760 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d        int iPos =
1e770 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1e780 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1e790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e7a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70           int nSp
1e7b0 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75  ace = pgsz - pBu
1e7c0 66 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  f->n;.          
1e7d0 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1e7f0 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c   (nCopy - iPos)<
1e800 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  =nSpace ){.     
1e810 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e             n = n
1e820 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20  Copy - iPos;.   
1e830 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1e840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e850 20 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73    n = fts5Poslis
1e860 74 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73  tPrefix(&pPoslis
1e870 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29  t[iPos], nSpace)
1e880 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e890 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1e8a0 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20  assert( n>0 );. 
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
1e8c0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1e8d0 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f  dBlob(pBuf, &pPo
1e8e0 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b  slist[iPos], n);
1e8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1e900 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  Pos += n;.      
1e910 20 20 20 20 20 20 20 20 69 66 28 20 70 42 75 66          if( pBuf
1e920 2d 3e 6e 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20  ->n>=pgsz ){.   
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
1e940 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1e950 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75               pBu
1e970 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72 69  f = &writer.aWri
1e980 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20  ter[0].buf;.    
1e990 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e9a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
1e9b0 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61  os>=nCopy ) brea
1e9c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
1e9d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e9e0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
1e9f0 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Copy;.        }.
1ea00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
1ea10 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
1ea20 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
1ea30 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c  assert( pBuf->n<
1ea40 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b  =pBuf->nSpace );
1ea50 0a 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 28  .      zPrev = (
1ea60 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 3b  const u8*)zTerm;
1ea70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1ea80 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
1ea90 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Hash);.    }.   
1eaa0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1eab0 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
1eac0 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
1ead0 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 6e  h(p, &writer, &n
1eae0 48 65 69 67 68 74 2c 20 26 70 67 6e 6f 4c 61 73  Height, &pgnoLas
1eaf0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  t);..    /* Upda
1eb00 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75 63  te the Fts5Struc
1eb10 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69 74  ture. It is writ
1eb20 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
1eb30 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 0a  database by the.
1eb40 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63      ** fts5Struc
1eb50 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63 61  tureRelease() ca
1eb60 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ll below.  */.  
1eb70 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e    if( pStruct->n
1eb80 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Level==0 ){.    
1eb90 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41    fts5StructureA
1eba0 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ddLevel(&p->rc, 
1ebb0 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d  &pStruct);.    }
1ebc0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1ebd0 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
1ebe0 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30  ->rc, pStruct, 0
1ebf0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
1ec00 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ec10 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20  K ){.      pSeg 
1ec20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1ec30 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72  el[0].aSeg[ pStr
1ec40 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e  uct->aLevel[0].n
1ec50 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70  Seg++ ];.      p
1ec60 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
1ec70 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67  egid;.      pSeg
1ec80 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
1ec90 67 68 74 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  ght;.      pSeg-
1eca0 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a  >pgnoFirst = 1;.
1ecb0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
1ecc0 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b  Last = pgnoLast;
1ecd0 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
1ece0 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20  nSegment++;.    
1ecf0 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
1ed00 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c  urePromote(p, 0,
1ed10 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a   pStruct);.  }..
1ed20 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f  .  fts5IndexAuto
1ed30 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
1ed40 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  t, pgnoLast);.  
1ed50 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d  fts5IndexCrisism
1ed60 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
1ed70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
1ed80 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75  reWrite(p, pStru
1ed90 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ct);.  fts5Struc
1eda0 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1edb0 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  uct);.}../*.** F
1edc0 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74  lush any data st
1edd0 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
1ede0 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
1edf0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1ee00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1ee10 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68  d fts5IndexFlush
1ee20 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1ee30 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20 69    /* Unless it i
1ee40 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20 74  s empty, flush t
1ee50 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  he hash table to
1ee60 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70   disk */.  if( p
1ee70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 29  ->nPendingData )
1ee80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1ee90 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70 2d  >pHash );.    p-
1eea0 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20  >nPendingData = 
1eeb0 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68  0;.    fts5Flush
1eec0 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a  OneHash(p);.  }.
1eed0 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  }...int sqlite3F
1eee0 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
1eef0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1ef00 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1ef10 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
1ef20 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20  Structure *pNew 
1ef30 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20  = 0;.  int nSeg 
1ef40 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1ef50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ef60 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46   );.  fts5IndexF
1ef70 6c 75 73 68 28 70 29 3b 0a 20 20 70 53 74 72 75  lush(p);.  pStru
1ef80 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
1ef90 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69 66  reRead(p);..  if
1efa0 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
1efb0 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
1efc0 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
1efd0 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
1efe0 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
1eff0 29 3b 0a 20 20 20 20 6e 53 65 67 20 3d 20 70 53  );.    nSeg = pS
1f000 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
1f010 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3e 31 20  .    if( nSeg>1 
1f020 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
1f030 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
1f040 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20 20 20  Structure);.    
1f050 20 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74 72    nByte += (pStr
1f060 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a  uct->nLevel+1) *
1f070 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1f080 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20  ctureLevel);.   
1f090 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53     pNew = (Fts5S
1f0a0 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65  tructure*)sqlite
1f0b0 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
1f0c0 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
1f0d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1f0e0 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35  pNew ){.    Fts5
1f0f0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
1f100 70 4c 76 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42  pLvl;.    int nB
1f110 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73 69 7a  yte = nSeg * siz
1f120 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1f130 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 70  eSegment);.    p
1f140 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53  New->nLevel = pS
1f150 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b  truct->nLevel+1;
1f160 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74  .    pNew->nWrit
1f170 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75  eCounter = pStru
1f180 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
1f190 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  r;.    pLvl = &p
1f1a0 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  New->aLevel[pStr
1f1b0 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
1f1c0 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
1f1d0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1f1e0 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
1f1f0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1f200 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1f210 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29  if( pLvl->aSeg )
1f220 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
1f230 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e  , iSeg;.      in
1f240 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20  t iSegOut = 0;. 
1f250 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
1f260 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1f270 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1f280 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
1f290 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
1f2a0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
1f2b0 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
1f2c0 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53          pLvl->aS
1f2d0 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53  eg[iSegOut] = pS
1f2e0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1f2f0 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
1f300 20 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75            iSegOu
1f310 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
1f320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
1f330 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c  w->nSegment = pL
1f340 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b  vl->nSeg = nSeg;
1f350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f360 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f370 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  New);.      pNew
1f380 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1f390 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
1f3a0 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e     int iLvl = pN
1f3b0 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20  ew->nLevel-1;.  
1f3c0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1f3d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65  SQLITE_OK && pNe
1f3e0 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  w->aLevel[iLvl].
1f3f0 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSeg>0 ){.      
1f400 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f  int nRem = FTS5_
1f410 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20  OPT_WORK_UNIT;. 
1f420 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65       fts5IndexMe
1f430 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65  rgeLevel(p, &pNe
1f440 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  w, iLvl, &nRem);
1f450 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
1f460 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
1f470 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73  , pNew);.    fts
1f480 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1f490 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
1f4a0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1f4b0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
1f4c0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
1f4d0 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a  xReturn(p); .}..
1f4e0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1f4f0 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e  ndexMerge(Fts5In
1f500 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72  dex *p, int nMer
1f510 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  ge){.  Fts5Struc
1f520 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 0a  ture *pStruct;..
1f530 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
1f540 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
1f550 3b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  ;.  if( pStruct 
1f560 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  && pStruct->nLev
1f570 65 6c 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  el ){.    fts5In
1f580 64 65 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74  dexMerge(p, &pSt
1f590 72 75 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20  ruct, nMerge);. 
1f5a0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1f5b0 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74  Write(p, pStruct
1f5c0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74 72  );.  }.  fts5Str
1f5d0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
1f5e0 74 72 75 63 74 29 3b 0a 0a 20 20 72 65 74 75 72  truct);..  retur
1f5f0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
1f600 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n(p);.}../*.** I
1f610 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
1f620 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1f630 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  o a valid entry 
1f640 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a  (not EOF). This.
1f650 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
1f660 6e 64 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  nds the position
1f670 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20 74   list data for t
1f680 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
1f690 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42   to.** buffer pB
1f6a0 75 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  uf. It does not 
1f6b0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
1f6c0 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
1f6d0 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a   size.** field..
1f6e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1f6f0 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
1f700 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
1f710 70 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  p,.  Fts5SegIter
1f720 20 2a 70 53 65 67 2c 0a 20 20 46 74 73 35 42 75   *pSeg,.  Fts5Bu
1f730 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
1f740 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1f750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
1f760 43 68 75 6e 6b 49 74 65 72 20 69 74 65 72 3b 0a  ChunkIter iter;.
1f770 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
1f780 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26  rInit(p, pSeg, &
1f790 69 74 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  iter);.    while
1f7a0 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45  ( fts5ChunkIterE
1f7b0 6f 66 28 70 2c 20 26 69 74 65 72 29 3d 3d 30 20  of(p, &iter)==0 
1f7c0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
1f7d0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1f7e0 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72  ->rc, pBuf, iter
1f7f0 2e 6e 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20 20  .n, iter.p);.   
1f800 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1f810 4e 65 78 74 28 70 2c 20 26 69 74 65 72 29 3b 0a  Next(p, &iter);.
1f820 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 43 68      }.    fts5Ch
1f830 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 26  unkIterRelease(&
1f840 69 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  iter);.  }.}../*
1f850 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 4d 75  .** Iterator pMu
1f860 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  lti currently po
1f870 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
1f880 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e  entry (not EOF).
1f890 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
1f8a0 6e 20 61 70 70 65 6e 64 73 20 61 20 63 6f 70 79  n appends a copy
1f8b0 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
1f8c0 2d 6c 69 73 74 20 6f 66 20 74 68 65 20 65 6e 74  -list of the ent
1f8d0 72 79 20 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75  ry pMulti .** cu
1f8e0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1f8f0 6f 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  o to buffer pBuf
1f900 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1f910 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
1f920 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
1f930 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69  t in p->rc. It i
1f940 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20  s assumed.** no 
1f950 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
1f960 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
1f970 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1f980 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1f990 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
1f9a0 69 49 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20  iIterPoslist(.  
1f9b0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
1f9c0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
1f9d0 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20   *pMulti,.  int 
1f9e0 62 53 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20  bSz,            
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1fa00 70 70 65 6e 64 20 61 20 73 69 7a 65 20 66 69 65  ppend a size fie
1fa10 6c 64 20 62 65 66 6f 72 65 20 74 68 65 20 64 61  ld before the da
1fa20 74 61 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ta */.  Fts5Buff
1fa30 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66  er *pBuf.){.  if
1fa40 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1fa50 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  OK ){.    Fts5Se
1fa60 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1fa70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75  Multi->aSeg[ pMu
1fa80 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  lti->aFirst[1].i
1fa90 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 61 73 73  First ];.    ass
1faa0 65 72 74 28 20 66 74 73 35 4d 75 6c 74 69 49 74  ert( fts5MultiIt
1fab0 65 72 45 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29  erEof(p, pMulti)
1fac0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
1fad0 62 53 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  bSz ){.      /* 
1fae0 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
1faf0 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 42 75   */.      fts5Bu
1fb00 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1fb10 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70  (&p->rc, pBuf, p
1fb20 53 65 67 2d 3e 6e 50 6f 73 2a 32 29 3b 0a 20 20  Seg->nPos*2);.  
1fb30 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65 67 69    }.    fts5Segi
1fb40 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 53  terPoslist(p, pS
1fb50 65 67 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d  eg, pBuf);.  }.}
1fb60 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1fb70 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1fb80 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t(Fts5DoclistIte
1fb90 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
1fba0 20 70 49 74 65 72 2d 3e 69 3c 70 49 74 65 72 2d   pIter->i<pIter-
1fbb0 3e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 44  >n ){.    int bD
1fbc0 75 6d 6d 79 3b 0a 20 20 20 20 69 66 28 20 70 49  ummy;.    if( pI
1fbd0 74 65 72 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20  ter->i ){.      
1fbe0 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  i64 iDelta;.    
1fbf0 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65    pIter->i += ge
1fc00 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e  tVarint(&pIter->
1fc10 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36  a[pIter->i], (u6
1fc20 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
1fc30 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 44     if( pIter->bD
1fc40 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  esc ){.        p
1fc50 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20  Iter->iRowid -= 
1fc60 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d 65  iDelta;.      }e
1fc70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 74  lse{.        pIt
1fc80 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
1fc90 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  elta;.      }.  
1fca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1fcb0 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61  Iter->i += getVa
1fcc0 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70  rint(&pIter->a[p
1fcd0 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29  Iter->i], (u64*)
1fce0 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
1fcf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72  .    }.    pIter
1fd00 2d 3e 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f  ->i += fts5GetPo
1fd10 73 6c 69 73 74 53 69 7a 65 28 0a 20 20 20 20 20  slistSize(.     
1fd20 20 20 20 26 70 49 74 65 72 2d 3e 61 5b 70 49 74     &pIter->a[pIt
1fd30 65 72 2d 3e 69 5d 2c 20 26 70 49 74 65 72 2d 3e  er->i], &pIter->
1fd40 6e 50 6f 73 6c 69 73 74 2c 20 26 62 44 75 6d 6d  nPoslist, &bDumm
1fd50 79 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 49 74  y.    );.    pIt
1fd60 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26  er->aPoslist = &
1fd70 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e  pIter->a[pIter->
1fd80 69 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  i];.    pIter->i
1fd90 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c   += pIter->nPosl
1fda0 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ist;.  }else{.  
1fdb0 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73    pIter->aPoslis
1fdc0 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  t = 0;.  }.}..st
1fdd0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
1fde0 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20  clistIterInit(. 
1fdf0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
1fe00 66 2c 20 0a 20 20 69 6e 74 20 62 44 65 73 63 2c  f, .  int bDesc,
1fe10 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49   .  Fts5DoclistI
1fe20 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20  ter *pIter.){.  
1fe30 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
1fe40 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
1fe50 3b 0a 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 70  ;.  pIter->a = p
1fe60 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d  Buf->p;.  pIter-
1fe70 3e 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20  >n = pBuf->n;.  
1fe80 70 49 74 65 72 2d 3e 62 44 65 73 63 20 3d 20 62  pIter->bDesc = b
1fe90 44 65 73 63 3b 0a 20 20 66 74 73 35 44 6f 63 6c  Desc;.  fts5Docl
1fea0 69 73 74 49 74 65 72 4e 65 78 74 28 70 49 74 65  istIterNext(pIte
1feb0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  r);.}../*.** App
1fec0 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74 6f  end a doclist to
1fed0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2f   buffer pBuf..*/
1fee0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1fef0 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
1ff00 64 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  d(.  int *pRc,  
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1ff30 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
1ff40 69 6e 74 20 62 44 65 73 63 2c 0a 20 20 46 74 73  int bDesc,.  Fts
1ff50 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20  5Buffer *pBuf,  
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff70 42 75 66 66 65 72 20 74 6f 20 77 72 69 74 65 20  Buffer to write 
1ff80 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c  to */.  i64 *piL
1ff90 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20  astRowid,       
1ffa0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
1ffb0 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  T: Previous rowi
1ffc0 64 20 77 72 69 74 74 65 6e 20 28 69 66 20 61 6e  d written (if an
1ffd0 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  y) */.  i64 iRow
1ffe0 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
1fff0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
20000 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b   to append */.){
20010 0a 20 20 69 66 28 20 70 42 75 66 2d 3e 6e 3d 3d  .  if( pBuf->n==
20020 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  0 ){.    fts5Buf
20030 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
20040 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69  pRc, pBuf, iRowi
20050 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  d);.  }else if( 
20060 62 44 65 73 63 20 29 7b 0a 20 20 20 20 66 74 73  bDesc ){.    fts
20070 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
20080 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 2a  int(pRc, pBuf, *
20090 70 69 4c 61 73 74 52 6f 77 69 64 20 2d 20 69 52  piLastRowid - iR
200a0 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
200b0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
200c0 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20  pendVarint(pRc, 
200d0 70 42 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a  pBuf, iRowid - *
200e0 70 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20  piLastRowid);.  
200f0 7d 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  }.  *piLastRowid
20100 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a   = iRowid;.}../*
20110 0a 2a 2a 20 42 75 66 66 65 72 73 20 70 31 20 61  .** Buffers p1 a
20120 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f  nd p2 contain do
20130 63 6c 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e  clists. This fun
20140 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65  ction merges the
20150 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74   content.** of t
20160 68 65 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20  he two doclists 
20170 74 6f 67 65 74 68 65 72 20 61 6e 64 20 73 65 74  together and set
20180 73 20 62 75 66 66 65 72 20 70 31 20 74 6f 20 74  s buffer p1 to t
20190 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65  he result before
201a0 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  .** returning..*
201b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
201c0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
201d0 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
201e0 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65  n p->rc. If an e
201f0 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65  rror has.** alre
20200 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
20210 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
20220 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
20230 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
20240 50 72 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46  PrefixLists(.  F
20250 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20270 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
20280 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62  bject */.  int b
20290 44 65 73 63 2c 0a 20 20 46 74 73 35 42 75 66 66  Desc,.  Fts5Buff
202a0 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20  er *p1,         
202b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
202c0 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
202d0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
202e0 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
202f0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69      /* Second li
20300 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  st to merge */.)
20310 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b  {.  if( p2->n ){
20320 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
20330 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
20340 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b  5DoclistIter i1;
20350 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
20360 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73  Iter i2;.    Fts
20370 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20 20  5Buffer out;.   
20380 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 3b   Fts5Buffer tmp;
20390 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 75 74  .    memset(&out
203a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29  , 0, sizeof(out)
203b0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  );.    memset(&t
203c0 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 6d  mp, 0, sizeof(tm
203d0 70 29 29 3b 0a 0a 20 20 20 20 66 74 73 35 44 6f  p));..    fts5Do
203e0 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 31  clistIterInit(p1
203f0 2c 20 62 44 65 73 63 2c 20 26 69 31 29 3b 0a 20  , bDesc, &i1);. 
20400 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
20410 65 72 49 6e 69 74 28 70 32 2c 20 62 44 65 73 63  erInit(p2, bDesc
20420 2c 20 26 69 32 29 3b 0a 20 20 20 20 77 68 69 6c  , &i2);.    whil
20430 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
20440 5f 4f 4b 20 26 26 20 28 69 31 2e 61 50 6f 73 6c  _OK && (i1.aPosl
20450 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61 50 6f  ist!=0 || i2.aPo
20460 73 6c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  slist!=0) ){.   
20470 20 20 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69     if( i2.aPosli
20480 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e 61 50 6f  st==0 || (i1.aPo
20490 73 6c 69 73 74 20 26 26 20 0a 20 20 20 20 20 20  slist && .      
204a0 20 20 20 20 20 28 20 28 62 44 65 73 63 20 26 26       ( (bDesc &&
204b0 20 69 31 2e 69 52 6f 77 69 64 3e 69 32 2e 69 52   i1.iRowid>i2.iR
204c0 6f 77 69 64 29 20 7c 7c 20 28 21 62 44 65 73 63  owid) || (!bDesc
204d0 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69 32   && i1.iRowid<i2
204e0 2e 69 52 6f 77 69 64 29 20 29 0a 20 20 20 20 20  .iRowid) ).     
204f0 20 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   )){.        /* 
20500 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
20510 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i1 */.        ft
20520 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
20530 69 64 28 26 70 2d 3e 72 63 2c 20 62 44 65 73 63  id(&p->rc, bDesc
20540 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f  , &out, &iLastRo
20550 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
20560 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54  .        /* WRIT
20570 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
20580 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20590 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
205a0 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e  p->rc, &out, i1.
205b0 6e 50 6f 73 6c 69 73 74 20 2a 20 32 29 3b 0a 20  nPoslist * 2);. 
205c0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
205d0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
205e0 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f  rc, &out, i1.nPo
205f0 73 6c 69 73 74 2c 20 69 31 2e 61 50 6f 73 6c 69  slist, i1.aPosli
20600 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  st);.        fts
20610 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
20620 28 26 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (&i1);.      }. 
20630 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 31       else if( i1
20640 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20  .aPoslist==0 || 
20650 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52  i2.iRowid!=i1.iR
20660 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
20670 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72  /* Copy entry fr
20680 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20  om i2 */.       
20690 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
206a0 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 44  Docid(&p->rc, bD
206b0 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73  esc, &out, &iLas
206c0 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69  tRowid, i2.iRowi
206d0 64 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  d);.        /* W
206e0 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
206f0 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
20700 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
20710 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  t(&p->rc, &out, 
20720 69 32 2e 6e 50 6f 73 6c 69 73 74 20 2a 20 32 29  i2.nPoslist * 2)
20730 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
20740 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
20750 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e  p->rc, &out, i2.
20760 6e 50 6f 73 6c 69 73 74 2c 20 69 32 2e 61 50 6f  nPoslist, i2.aPo
20770 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  slist);.        
20780 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
20790 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
207a0 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20  }.      else{.  
207b0 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
207c0 74 52 65 61 64 65 72 20 72 31 3b 0a 20 20 20 20  tReader r1;.    
207d0 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52      Fts5PoslistR
207e0 65 61 64 65 72 20 72 32 3b 0a 20 20 20 20 20 20  eader r2;.      
207f0 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69    Fts5PoslistWri
20800 74 65 72 20 77 72 69 74 65 72 3b 0a 0a 20 20 20  ter writer;..   
20810 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69       memset(&wri
20820 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ter, 0, sizeof(w
20830 72 69 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20  riter));..      
20840 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65 20 74    /* Merge the t
20850 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  wo position list
20860 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 66  s. */ .        f
20870 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
20880 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 44 65 73  cid(&p->rc, bDes
20890 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52  c, &out, &iLastR
208a0 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29  owid, i2.iRowid)
208b0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
208c0 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a  fferZero(&tmp);.
208d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
208e0 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
208f0 49 6e 69 74 28 2d 31 2c 20 69 31 2e 61 50 6f 73  Init(-1, i1.aPos
20900 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  list, i1.nPoslis
20910 74 2c 20 26 72 31 29 3b 0a 20 20 20 20 20 20 20  t, &r1);.       
20920 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
20930 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31  istReaderInit(-1
20940 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i2.aPoslist, i
20950 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 72 32 29  2.nPoslist, &r2)
20960 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
20970 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
20980 4b 20 26 26 20 28 72 31 2e 62 45 6f 66 3d 3d 30  K && (r1.bEof==0
20990 20 7c 7c 20 72 32 2e 62 45 6f 66 3d 3d 30 29 20   || r2.bEof==0) 
209a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  ){.          i64
209b0 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
209c0 20 69 66 28 20 72 32 2e 62 45 6f 66 20 7c 7c 20   if( r2.bEof || 
209d0 28 72 31 2e 62 45 6f 66 3d 3d 30 20 26 26 20 72  (r1.bEof==0 && r
209e0 31 2e 69 50 6f 73 3c 72 32 2e 69 50 6f 73 29 20  1.iPos<r2.iPos) 
209f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
20a00 4e 65 77 20 3d 20 72 31 2e 69 50 6f 73 3b 0a 20  New = r1.iPos;. 
20a10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20a20 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
20a30 64 65 72 4e 65 78 74 28 26 72 31 29 3b 0a 20 20  derNext(&r1);.  
20a40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20a50 20 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20             iNew 
20a60 3d 20 72 32 2e 69 50 6f 73 3b 0a 20 20 20 20 20  = r2.iPos;.     
20a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
20a80 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e  s5PoslistReaderN
20a90 65 78 74 28 26 72 32 29 3b 0a 20 20 20 20 20 20  ext(&r2);.      
20aa0 20 20 20 20 20 20 69 66 28 20 72 31 2e 69 50 6f        if( r1.iPo
20ab0 73 3d 3d 72 32 2e 69 50 6f 73 20 29 20 73 71 6c  s==r2.iPos ) sql
20ac0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
20ad0 65 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b 0a  eaderNext(&r1);.
20ae0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20af0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
20b00 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
20b10 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 74 6d  WriterAppend(&tm
20b20 70 2c 20 26 77 72 69 74 65 72 2c 20 69 4e 65 77  p, &writer, iNew
20b30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
20b40 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
20b50 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
20b60 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
20b70 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
20b80 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70 2e 6e 20  rc, &out, tmp.n 
20b90 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74  * 2);.        ft
20ba0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
20bb0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ob(&p->rc, &out,
20bc0 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70 29 3b 0a   tmp.n, tmp.p);.
20bd0 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
20be0 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29  istIterNext(&i1)
20bf0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
20c00 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
20c10 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
20c20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  }..    fts5Buffe
20c30 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c  rSet(&p->rc, p1,
20c40 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a   out.n, out.p);.
20c50 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
20c60 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74  ee(&tmp);.    ft
20c70 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75  s5BufferFree(&ou
20c80 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  t);.  }.}..stati
20c90 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66 65  c void fts5Buffe
20ca0 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65 72  rSwap(Fts5Buffer
20cb0 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65 72   *p1, Fts5Buffer
20cc0 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66   *p2){.  Fts5Buf
20cd0 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20  fer tmp = *p1;. 
20ce0 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70   *p1 = *p2;.  *p
20cf0 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74  2 = tmp;.}..stat
20d00 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75  ic void fts5Setu
20d10 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46  pPrefixIter(.  F
20d20 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d40 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20  * Index to read 
20d50 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44  from */.  int bD
20d60 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  esc,            
20d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20d80 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20  e for "ORDER BY 
20d90 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20  rowid DESC" */. 
20da0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65   const u8 *pToke
20db0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
20dc0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
20dd0 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20  ining prefix to 
20de0 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  match */.  int n
20df0 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
20e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
20e10 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f  ze of buffer pTo
20e20 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ken in bytes */.
20e30 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
20e40 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
20e50 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
20e60 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
20e70 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
20e80 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
20e90 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20  Buffer *aBuf;.  
20ea0 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d  const int nBuf =
20eb0 20 33 32 3b 0a 0a 20 20 61 42 75 66 20 3d 20 28   32;..  aBuf = (
20ec0 46 74 73 35 42 75 66 66 65 72 2a 29 66 74 73 35  Fts5Buffer*)fts5
20ed0 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
20ee0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 2a  eof(Fts5Buffer)*
20ef0 6e 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74  nBuf);.  pStruct
20f00 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
20f10 52 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20  Read(p);..  if( 
20f20 61 42 75 66 20 26 26 20 70 53 74 72 75 63 74 20  aBuf && pStruct 
20f30 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
20f40 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44   flags = FTS5IND
20f50 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 3b 0a 20  EX_QUERY_SCAN;. 
20f60 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
20f70 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20  er *pDoclist;.  
20f80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34    int i;.    i64
20f90 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
20fa0 0a 20 20 20 20 46 74 73 35 4d 75 6c 74 69 53 65  .    Fts5MultiSe
20fb0 67 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20 20  gIter *p1 = 0;  
20fc0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75     /* Iterator u
20fd0 73 65 64 20 74 6f 20 67 61 74 68 65 72 20 64 61  sed to gather da
20fe0 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f  ta from index */
20ff0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
21000 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65  doclist;..    me
21010 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30  mset(&doclist, 0
21020 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74  , sizeof(doclist
21030 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35  ));.    for(fts5
21040 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
21050 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67  pStruct, 1, flag
21060 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  s, pToken, nToke
21070 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a  n, -1, 0, &p1);.
21080 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
21090 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d  iIterEof(p, p1)=
210a0 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  =0;.        fts5
210b0 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
210c0 20 70 31 2c 20 30 2c 20 30 29 0a 20 20 20 20 29   p1, 0, 0).    )
210d0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
210e0 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
210f0 65 72 52 6f 77 69 64 28 70 31 29 3b 0a 20 20 20  erRowid(p1);.   
21100 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20     int nTerm;.  
21110 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54      const u8 *pT
21120 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  erm = fts5MultiI
21130 74 65 72 54 65 72 6d 28 70 31 2c 20 26 6e 54 65  terTerm(p1, &nTe
21140 72 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  rm);.      asser
21150 74 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e  t( memcmp(pToken
21160 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f  , pTerm, MIN(nTo
21170 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20  ken, nTerm))<=0 
21180 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65  );.      if( nTe
21190 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d  rm<nToken || mem
211a0 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
211b0 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65  m, nToken) ) bre
211c0 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 64  ak;..      if( d
211d0 6f 63 6c 69 73 74 2e 6e 3e 30 20 0a 20 20 20 20  oclist.n>0 .    
211e0 20 20 20 26 26 20 28 28 21 62 44 65 73 63 20 26     && ((!bDesc &
211f0 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52  & iRowid<=iLastR
21200 6f 77 69 64 29 20 7c 7c 20 28 62 44 65 73 63 20  owid) || (bDesc 
21210 26 26 20 69 52 6f 77 69 64 3e 3d 69 4c 61 73 74  && iRowid>=iLast
21220 52 6f 77 69 64 29 29 0a 20 20 20 20 20 20 29 7b  Rowid)).      ){
21230 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ..        for(i=
21240 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
21250 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e  _OK && doclist.n
21260 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
21270 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75 66    assert( i<nBuf
21280 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
21290 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29  ( aBuf[i].n==0 )
212a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
212b0 73 35 42 75 66 66 65 72 53 77 61 70 28 26 64 6f  s5BufferSwap(&do
212c0 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
212d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
212e0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64 6f  s5BufferZero(&do
212f0 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  clist);.        
21300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21310 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 50 72       fts5MergePr
21320 65 66 69 78 4c 69 73 74 73 28 70 2c 20 62 44 65  efixLists(p, bDe
21330 73 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61  sc, &doclist, &a
21340 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
21350 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
21360 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20  ero(&aBuf[i]);. 
21370 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21380 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21390 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e     if( doclist.n
213a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
213b0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
213c0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64  arint(&p->rc, &d
213d0 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69 64 29 3b  oclist, iRowid);
213e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
213f0 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20   bDesc ){.      
21400 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
21410 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
21420 20 26 64 6f 63 6c 69 73 74 2c 20 69 4c 61 73 74   &doclist, iLast
21430 52 6f 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b  Rowid - iRowid);
21440 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21450 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21460 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
21470 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69  >rc, &doclist, i
21480 52 6f 77 69 64 20 2d 20 69 4c 61 73 74 52 6f 77  Rowid - iLastRow
21490 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  id);.      }.   
214a0 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20     iLastRowid = 
214b0 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 66 74  iRowid;.      ft
214c0 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69  s5MultiIterPosli
214d0 73 74 28 70 2c 20 70 31 2c 20 31 2c 20 26 64 6f  st(p, p1, 1, &do
214e0 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  clist);.    }.. 
214f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42     for(i=0; i<nB
21500 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  uf; i++){.      
21510 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
21520 69 73 74 73 28 70 2c 20 62 44 65 73 63 2c 20 26  ists(p, bDesc, &
21530 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69  doclist, &aBuf[i
21540 5d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  ]);.      fts5Bu
21550 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b 69  fferFree(&aBuf[i
21560 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ]);.    }.    ft
21570 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
21580 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44 6f  p, p1);..    pDo
21590 63 6c 69 73 74 20 3d 20 28 46 74 73 35 44 6f 63  clist = (Fts5Doc
215a0 6c 69 73 74 49 74 65 72 2a 29 66 74 73 35 49 64  listIter*)fts5Id
215b0 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
215c0 66 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  f(Fts5DoclistIte
215d0 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  r));.    if( !pD
215e0 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oclist ){.      
215f0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
21600 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65  doclist);.    }e
21610 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72  lse{.      pIter
21620 2d 3e 70 44 6f 63 6c 69 73 74 20 3d 20 70 44 6f  ->pDoclist = pDo
21630 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 66 74 73  clist;.      fts
21640 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
21650 28 26 64 6f 63 6c 69 73 74 2c 20 62 44 65 73 63  (&doclist, bDesc
21660 2c 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  , pIter->pDoclis
21670 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
21680 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
21690 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
216a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
216b0 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Buf);.}.../*.** 
216c0 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c  Indicate that al
216d0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  l subsequent cal
216e0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ls to sqlite3Fts
216f0 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65  5IndexWrite() pe
21700 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  rtain.** to the 
21710 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f  document with ro
21720 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69  wid iRowid..*/.i
21730 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
21740 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74  dexBeginWrite(Ft
21750 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
21760 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72  iRowid){.  asser
21770 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
21780 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _OK );..  /* All
21790 6f 63 61 74 65 20 74 68 65 20 68 61 73 68 20 74  ocate the hash t
217a0 61 62 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e  able if it has n
217b0 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
217c0 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
217d0 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29  f( p->pHash==0 )
217e0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
217f0 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65 77  lite3Fts5HashNew
21800 28 26 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e  (&p->pHash, &p->
21810 6e 50 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20  nPendingData);. 
21820 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74   }..  /* Flush t
21830 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  he hash table to
21840 20 64 69 73 6b 20 69 66 20 72 65 71 75 69 72 65   disk if require
21850 64 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77 69  d */.  if( iRowi
21860 64 3c 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  d<=p->iWriteRowi
21870 64 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e  d || (p->nPendin
21880 67 44 61 74 61 20 3e 20 70 2d 3e 6e 4d 61 78 50  gData > p->nMaxP
21890 65 6e 64 69 6e 67 44 61 74 61 29 20 29 7b 0a 20  endingData) ){. 
218a0 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73     fts5IndexFlus
218b0 68 28 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  h(p);.  }.  p->i
218c0 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52 6f  WriteRowid = iRo
218d0 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  wid;.  return ft
218e0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
218f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
21900 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a  t data to disk..
21910 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
21920 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35  s5IndexSync(Fts5
21930 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43  Index *p, int bC
21940 6f 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74  ommit){.  assert
21950 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
21960 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  OK );.  fts5Inde
21970 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28  xFlush(p);.  if(
21980 20 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43   bCommit ) fts5C
21990 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
219a0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
219b0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
219c0 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79  *.** Discard any
219d0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
219e0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
219f0 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f  sh tables. Do no
21a00 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f  t write it.** to
21a10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
21a20 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73  dditionally, ass
21a30 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ume that the con
21a40 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64  tents of the %_d
21a50 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79  ata.** table may
21a60 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e   have changed on
21a70 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e   disk. So any in
21a80 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f  -memory caches o
21a90 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63  f %_data .** rec
21aa0 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76  ords must be inv
21ab0 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  alidated..*/.int
21ac0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
21ad0 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e  xRollback(Fts5In
21ae0 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43  dex *p){.  fts5C
21af0 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
21b00 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72   fts5IndexDiscar
21b10 64 44 61 74 61 28 70 29 3b 0a 20 20 61 73 73 65  dData(p);.  asse
21b20 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
21b30 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
21b40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
21b50 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
21b60 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74  table is complet
21b70 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74  ely empty when t
21b80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
21b90 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20  called. This.** 
21ba0 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
21bb0 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20 69  es it with the i
21bc0 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72 65  nitial structure
21bd0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
21be0 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20  h index,.** and 
21bf0 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73  the initial vers
21c00 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72  ion of the "aver
21c10 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61 20  ages" record (a 
21c20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e  zero-byte blob).
21c30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
21c40 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46  ts5IndexReinit(F
21c50 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
21c60 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73 3b  Fts5Structure s;
21c70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
21c80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
21c90 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
21ca0 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65  3Fts5IndexSetAve
21cb0 72 61 67 65 73 28 70 2c 20 28 63 6f 6e 73 74 20  rages(p, (const 
21cc0 75 38 2a 29 22 22 2c 20 30 29 3b 0a 0a 20 20 6d  u8*)"", 0);..  m
21cd0 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
21ce0 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
21cf0 65 29 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  e));.  fts5Struc
21d00 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29  tureWrite(p, &s)
21d10 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ;..  return fts5
21d20 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
21d30 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
21d40 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61  new Fts5Index ha
21d50 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72  ndle. If the bCr
21d60 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73  eate argument is
21d70 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a   true, create.**
21d80 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
21d90 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25  the underlying %
21da0 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
21db0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
21dc0 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69  , set *pp to poi
21dd0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62  nt to the new ob
21de0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
21df0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74  SQLITE_OK..** Ot
21e00 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70  herwise, set *pp
21e10 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74   to NULL and ret
21e20 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
21e30 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
21e40 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
21e50 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e  xOpen(.  Fts5Con
21e60 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20  fig *pConfig, . 
21e70 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20   int bCreate, . 
21e80 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c   Fts5Index **pp,
21e90 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
21ea0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
21eb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49  LITE_OK;.  Fts5I
21ec0 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20  ndex *p;        
21ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
21ee0 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a  w object */..  *
21ef0 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e  pp = p = (Fts5In
21f00 64 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35  dex*)sqlite3Fts5
21f10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
21f20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78  sizeof(Fts5Index
21f30 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
21f40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
21f50 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e  ->pConfig = pCon
21f60 66 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72  fig;.    p->nWor
21f70 6b 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52  kUnit = FTS5_WOR
21f80 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 6e  K_UNIT;.    p->n
21f90 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  MaxPendingData =
21fa0 20 31 30 32 34 2a 31 30 32 34 3b 0a 20 20 20 20   1024*1024;.    
21fb0 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73 71  p->zDataTbl = sq
21fc0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
21fd0 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67  s_data", pConfig
21fe0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
21ff0 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d 30  ( p->zDataTbl==0
22000 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
22010 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22020 20 7d 65 6c 73 65 20 69 66 28 20 62 43 72 65 61   }else if( bCrea
22030 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  te ){.      rc =
22040 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61   sqlite3Fts5Crea
22050 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20  teTable(.       
22060 20 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74     pConfig, "dat
22070 61 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20  a", "id INTEGER 
22080 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f  PRIMARY KEY, blo
22090 63 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45  ck BLOB", 0, pzE
220a0 72 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  rr.      );.    
220b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
220c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
220d0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
220e0 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a 20  ndexReinit(p);. 
220f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22100 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ..  assert( rc!=
22110 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
22120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
22130 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
22140 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22150 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a  xClose(p);.    *
22160 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  pp = 0;.  }.  re
22170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22180 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  * Close a handle
22190 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61   opened by an ea
221a0 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71  rlier call to sq
221b0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
221c0 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
221d0 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f  ite3Fts5IndexClo
221e0 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  se(Fts5Index *p)
221f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22200 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
22210 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22220 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a  ->pReader==0 );.
22230 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
22240 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29  lize(p->pWriter)
22250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
22260 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74  nalize(p->pDelet
22270 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
22280 46 74 73 35 48 61 73 68 46 72 65 65 28 70 2d 3e  Fts5HashFree(p->
22290 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c 69  pHash);.    sqli
222a0 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
222b0 65 28 26 70 2d 3e 73 63 72 61 74 63 68 29 3b 0a  e(&p->scratch);.
222c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
222d0 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20  (p->zDataTbl);. 
222e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
222f0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
22300 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   rc;.}../*.** Ar
22310 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20  gument p points 
22320 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
22330 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78  aining utf-8 tex
22340 74 20 74 68 61 74 20 69 73 20 6e 20 62 79 74 65  t that is n byte
22350 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52  s in .** size. R
22360 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
22370 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
22380 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72   nChar character
22390 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a   prefix of the.*
223a0 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20 69  * buffer, or 0 i
223b0 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73  f there are less
223c0 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72   than nChar char
223d0 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e  acters in total.
223e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
223f0 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54  ts5IndexCharlenT
22400 6f 42 79 74 65 6c 65 6e 28 63 6f 6e 73 74 20 63  oBytelen(const c
22410 68 61 72 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  har *p, int nByt
22420 65 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b 0a 20  e, int nChar){. 
22430 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e   int n = 0;.  in
22440 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
22450 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20  i<nChar; i++){. 
22460 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20     if( n>=nByte 
22470 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
22480 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74 61 69   /* Input contai
22490 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 6e 43  ns fewer than nC
224a0 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20 20 20  har chars */.   
224b0 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63   if( (unsigned c
224c0 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30  har)p[n++]>=0xc0
224d0 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
224e0 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29 3d 3d   (p[n] & 0xc0)==
224f0 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  0x80 ) n++;.    
22500 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
22510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69  ;.}../*.** pIn i
22520 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  s a UTF-8 encode
22530 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20 62 79  d string, nIn by
22540 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52 65 74  tes in size. Ret
22550 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
22560 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63 68 61  f.** unicode cha
22570 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
22580 74 72 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 66 74  tring..*/.int ft
22590 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63  s5IndexCharlen(c
225a0 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20  onst char *pIn, 
225b0 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20  int nIn){.  int 
225c0 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20  nChar = 0;      
225d0 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d        .  int i =
225e0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e   0;.  while( i<n
225f0 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75  In ){.    if( (u
22600 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e  nsigned char)pIn
22610 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20  [i++]>=0xc0 ){. 
22620 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49       while( i<nI
22630 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30  n && (pIn[i] & 0
22640 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b  xc0)==0x80 ) i++
22650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61  ;.    }.    nCha
22660 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
22670 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nChar;.}../*.*
22680 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f  * Insert or remo
22690 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72  ve data to or fr
226a0 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61  om the index. Ea
226b0 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65  ch time a docume
226c0 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20  nt is .** added 
226d0 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
226e0 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  om the index, th
226f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
22700 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  alled one or mor
22710 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a  e.** times..**.*
22720 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c  * For an insert,
22730 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c   it must be call
22740 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
22750 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65   token in the ne
22760 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49  w document..** I
22770 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
22780 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20  is a delete, it 
22790 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28  must be called (
227a0 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66  at least) once f
227b0 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75  or each.** uniqu
227c0 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64  e token in the d
227d0 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  ocument with an 
227e0 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20  iCol value less 
227f0 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69  than zero. The i
22800 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  Pos.** argument 
22810 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61  is ignored for a
22820 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20   delete..*/.int 
22830 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
22840 57 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64  Write(.  Fts5Ind
22850 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
22860 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
22870 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  x to write to */
22880 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228a0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b     /* Column tok
228b0 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d  en appears in (-
228c0 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f  ve -> delete) */
228d0 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20  .  int iPos,    
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
22900 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63  f token within c
22910 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
22920 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
22930 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f  nt nToken  /* To
22940 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65  ken to add or re
22950 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20  move to or from 
22960 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e  index */.){.  in
22970 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22990 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
229a0 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73   through indexes
229b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
229c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
229d0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
229e0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f  code */.  Fts5Co
229f0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
22a00 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61  p->pConfig;..  a
22a10 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
22a20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a  LITE_OK );..  /*
22a30 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74   Add the entry t
22a40 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  o the main terms
22a50 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20   index. */.  rc 
22a60 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
22a70 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d  hWrite(.      p-
22a80 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74  >pHash, p->iWrit
22a90 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
22aa0 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  os, FTS5_MAIN_PR
22ab0 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  EFIX, pToken, nT
22ac0 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72  oken.  );..  for
22ad0 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
22ae0 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d  >nPrefix && rc==
22af0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
22b00 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
22b10 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
22b20 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65  nToBytelen(pToke
22b30 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66  n, nToken, pConf
22b40 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 29 3b  ig->aPrefix[i]);
22b50 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
22b60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22b70 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
22b80 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20  e(p->pHash, .   
22b90 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65         p->iWrite
22ba0 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
22bb0 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  s, FTS5_MAIN_PRE
22bc0 46 49 58 2b 69 2b 31 2c 20 70 54 6f 6b 65 6e 2c  FIX+i+1, pToken,
22bd0 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a   nByte.      );.
22be0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
22bf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22c00 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72   Open a new iter
22c10 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  ator to iterate 
22c20 74 68 6f 75 67 68 20 61 6c 6c 20 64 6f 63 69 64  though all docid
22c30 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  s that match the
22c40 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74   .** specified t
22c50 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
22c60 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  efix..*/.int sql
22c70 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
22c80 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ry(.  Fts5Index 
22c90 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
22ca0 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
22cb0 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  ex to query */. 
22cc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
22cd0 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  ken, int nToken,
22ce0 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72   /* Token (or pr
22cf0 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66  efix) to query f
22d00 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  or */.  int flag
22d10 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
22d20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
22d30 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  of FTS5INDEX_QUE
22d40 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  RY_X flags */.  
22d50 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a  Fts5IndexIter **
22d60 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
22d70 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
22d80 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  ator object */.)
22d90 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
22da0 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
22db0 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e 64 65  nfig;.  Fts5Inde
22dc0 78 49 74 65 72 20 2a 70 52 65 74 3b 0a 20 20 69  xIter *pRet;.  i
22dd0 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 46  nt iIdx = 0;.  F
22de0 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
22df0 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a  {0, 0, 0};..  /*
22e00 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 53 43   If the QUERY_SC
22e10 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  AN flag is set, 
22e20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20  all other flags 
22e30 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a  must be clear. *
22e40 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
22e50 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
22e60 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 0a 20 20  UERY_SCAN)==0.  
22e70 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 20 26       || (flags &
22e80 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
22e90 5f 53 43 41 4e 29 3d 3d 46 54 53 35 49 4e 44 45  _SCAN)==FTS5INDE
22ea0 58 5f 51 55 45 52 59 5f 53 43 41 4e 0a 20 20 29  X_QUERY_SCAN.  )
22eb0 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
22ec0 46 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  Fts5BufferGrow(&
22ed0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f  p->rc, &buf, nTo
22ee0 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20  ken+1)==0 ){.   
22ef0 20 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31   memcpy(&buf.p[1
22f00 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  ], pToken, nToke
22f10 6e 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  n);.  }..#ifdef 
22f20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
22f30 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
22f40 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
22f50 4e 4f 49 44 58 20 29 7b 0a 20 20 20 20 61 73 73  NOIDX ){.    ass
22f60 65 72 74 28 20 66 6c 61 67 73 20 26 20 46 54 53  ert( flags & FTS
22f70 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
22f80 46 49 58 20 29 3b 0a 20 20 20 20 69 49 64 78 20  FIX );.    iIdx 
22f90 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  = 1+pConfig->nPr
22fa0 65 66 69 78 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  efix;.  }else.#e
22fb0 6e 64 69 66 0a 20 20 69 66 28 20 66 6c 61 67 73  ndif.  if( flags
22fc0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
22fd0 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  RY_PREFIX ){.   
22fe0 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73   int nChar = fts
22ff0 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54  5IndexCharlen(pT
23000 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
23010 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
23020 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
23030 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
23040 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
23050 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d  g->aPrefix[iIdx-
23060 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65 61  1]==nChar ) brea
23070 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
23080 70 52 65 74 20 3d 20 28 46 74 73 35 49 6e 64 65  pRet = (Fts5Inde
23090 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 46 74  xIter*)sqlite3Ft
230a0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
230b0 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  >rc, sizeof(Fts5
230c0 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 20 20 69  IndexIter));.  i
230d0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70  f( pRet ){.    p
230e0 52 65 74 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b  Ret->pIndex = p;
230f0 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c 3d 70  .    if( iIdx<=p
23100 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
23110 29 7b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  ){.      buf.p[0
23120 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] = FTS5_MAIN_PR
23130 45 46 49 58 20 2b 20 69 49 64 78 3b 0a 20 20 20  EFIX + iIdx;.   
23140 20 20 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74     pRet->pStruct
23150 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
23160 52 65 61 64 28 70 29 3b 0a 20 20 20 20 20 20 69  Read(p);.      i
23170 66 28 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74  f( pRet->pStruct
23180 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
23190 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20  MultiIterNew(.  
231a0 20 20 20 20 20 20 20 20 20 20 70 2c 20 70 52 65            p, pRe
231b0 74 2d 3e 70 53 74 72 75 63 74 2c 20 31 2c 20 66  t->pStruct, 1, f
231c0 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20 6e 54 6f  lags, buf.p, nTo
231d0 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70  ken+1, -1, 0, &p
231e0 52 65 74 2d 3e 70 4d 75 6c 74 69 0a 20 20 20 20  Ret->pMulti.    
231f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
23200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23210 69 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61  int bDesc = (fla
23220 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
23230 55 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20  UERY_DESC)!=0;. 
23240 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20       buf.p[0] = 
23250 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
23260 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75  ;.      fts5Setu
23270 70 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62  pPrefixIter(p, b
23280 44 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f  Desc, buf.p, nTo
23290 6b 65 6e 2b 31 2c 20 70 52 65 74 29 3b 0a 20 20  ken+1, pRet);.  
232a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
232b0 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->rc ){.    sqli
232c0 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
232d0 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52 65 74  (pRet);.    pRet
232e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 49   = 0;.  }.  *ppI
232f0 74 65 72 20 3d 20 70 52 65 74 3b 0a 20 20 73 71  ter = pRet;.  sq
23300 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
23310 72 65 65 28 26 62 75 66 29 3b 0a 20 20 72 65 74  ree(&buf);.  ret
23320 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
23330 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
23340 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
23350 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
23360 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
23370 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45  argument is at E
23380 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OF..*/.int sqlit
23390 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 46 74  e3Fts5IterEof(Ft
233a0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
233b0 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
233c0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
233d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
233e0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63   if( pIter->pDoc
233f0 6c 69 73 74 20 29 7b 20 0a 20 20 20 20 72 65 74  list ){ .    ret
23400 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  urn pIter->pDocl
23410 69 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3d 3d 30  ist->aPoslist==0
23420 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ; .  }else{.    
23430 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69  return fts5Multi
23440 49 74 65 72 45 6f 66 28 70 49 74 65 72 2d 3e 70  IterEof(pIter->p
23450 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d  Index, pIter->pM
23460 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ulti);.  }.}../*
23470 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
23480 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f  next matching ro
23490 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wid. .*/.int sql
234a0 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
234b0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
234c0 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
234d0 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
234e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
234f0 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ;.  if( pIter->p
23500 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 66  Doclist ){.    f
23510 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
23520 78 74 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  xt(pIter->pDocli
23530 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  st);.  }else{.  
23540 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
23550 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
23560 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  );.    fts5Multi
23570 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e  IterNext(pIter->
23580 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
23590 4d 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20  Multi, 0, 0);.  
235a0 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  }.  return fts5I
235b0 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
235c0 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
235d0 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
235e0 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 74 65  next matching te
235f0 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65 64 20 62  rm/rowid. Used b
23600 79 20 74 68 65 20 66 74 73 35 76 6f 63 61 62 20  y the fts5vocab 
23610 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  module..*/.int s
23620 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
23630 78 74 53 63 61 6e 28 46 74 73 35 49 6e 64 65 78  xtScan(Fts5Index
23640 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
23650 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70  Fts5Index *p = p
23660 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Iter->pIndex;.  
23670 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
23680 20 2a 70 4d 75 6c 74 69 20 3d 20 70 49 74 65 72   *pMulti = pIter
23690 2d 3e 70 4d 75 6c 74 69 3b 0a 0a 20 20 61 73 73  ->pMulti;..  ass
236a0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
236b0 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
236c0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
236d0 4d 75 6c 74 69 20 29 3b 0a 0a 20 20 66 74 73 35  Multi );..  fts5
236e0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
236f0 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 66  r->poslist);.  f
23700 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
23710 28 70 2c 20 70 4d 75 6c 74 69 2c 20 30 2c 20 30  (p, pMulti, 0, 0
23720 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
23730 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23740 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
23750 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53  eg = &pMulti->aS
23760 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72  eg[ pMulti->aFir
23770 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
23780 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c      if( pSeg->pL
23790 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72  eaf && pSeg->ter
237a0 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49  m.p[0]!=FTS5_MAI
237b0 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20  N_PREFIX ){.    
237c0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
237d0 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a  e(pSeg->pLeaf);.
237e0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61        pSeg->pLea
237f0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  f = 0;.    }.  }
23800 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ..  return fts5I
23810 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
23820 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
23830 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64 6f 63  .** Move the doc
23840 6c 69 73 74 2d 69 74 65 72 20 70 61 73 73 65 64  list-iter passed
23850 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
23860 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65  gument to the ne
23870 78 74 20 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20  xt .** matching 
23880 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72  rowid that occur
23890 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d  s at or after iM
238a0 61 74 63 68 2e 20 54 68 65 20 64 65 66 69 6e 69  atch. The defini
238b0 74 69 6f 6e 20 6f 66 20 22 61 74 20 0a 2a 2a 20  tion of "at .** 
238c0 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64  or after" depend
238d0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69  s on whether thi
238e0 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61  s iterator itera
238f0 74 65 73 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  tes in ascending
23900 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 69   or .** descendi
23910 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a  ng rowid order..
23920 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
23930 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
23940 78 74 46 72 6f 6d 28 46 74 73 35 44 6f 63 6c 69  xtFrom(Fts5Docli
23950 73 74 49 74 65 72 20 2a 70 2c 20 69 36 34 20 69  stIter *p, i64 i
23960 4d 61 74 63 68 29 7b 0a 20 20 64 6f 7b 0a 20 20  Match){.  do{.  
23970 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 70    i64 iRowid = p
23980 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 69 66  ->iRowid;.    if
23990 28 20 70 2d 3e 62 44 65 73 63 3d 3d 30 20 26 26  ( p->bDesc==0 &&
239a0 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20   iRowid>=iMatch 
239b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
239c0 20 70 2d 3e 62 44 65 73 63 21 3d 30 20 26 26 20   p->bDesc!=0 && 
239d0 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29  iRowid<=iMatch )
239e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 66 74 73 35   break;.    fts5
239f0 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
23a00 70 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d  p);.  }while( p-
23a10 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 7d 0a 0a  >aPoslist );.}..
23a20 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
23a30 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
23a40 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72  rowid that occur
23a50 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d  s at or after iM
23a60 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66  atch. The.** def
23a70 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f  inition of "at o
23a80 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73  r after" depends
23a90 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73   on whether this
23aa0 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74   iterator iterat
23ab0 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  es.** in ascendi
23ac0 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67  ng or descending
23ad0 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f   rowid order..*/
23ae0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
23af0 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73  IterNextFrom(Fts
23b00 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
23b10 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a  r, i64 iMatch){.
23b20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
23b30 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 66 74 73  clist ){.    fts
23b40 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
23b50 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70 44 6f 63  From(pIter->pDoc
23b60 6c 69 73 74 2c 20 69 4d 61 74 63 68 29 3b 0a 20  list, iMatch);. 
23b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
23b80 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f  MultiIterNextFro
23b90 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  m(pIter->pIndex,
23ba0 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20   pIter->pMulti, 
23bb0 69 4d 61 74 63 68 29 3b 0a 20 20 7d 0a 20 20 72  iMatch);.  }.  r
23bc0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
23bd0 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
23be0 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dex);.}../*.** R
23bf0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
23c00 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20  t rowid..*/.i64 
23c10 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 52  sqlite3Fts5IterR
23c20 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 49 74  owid(Fts5IndexIt
23c30 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
23c40 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  ( pIter->pDoclis
23c50 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
23c60 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d  pIter->pDoclist-
23c70 3e 69 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65  >iRowid;.  }else
23c80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66 74 73  {.    return fts
23c90 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
23ca0 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a  pIter->pMulti);.
23cb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
23cc0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
23cd0 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  term..*/.const c
23ce0 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35  har *sqlite3Fts5
23cf0 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64  IterTerm(Fts5Ind
23d00 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  exIter *pIter, i
23d10 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e  nt *pn){.  int n
23d20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
23d30 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
23d40 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65  )fts5MultiIterTe
23d50 72 6d 28 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  rm(pIter->pMulti
23d60 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e  , &n);.  *pn = n
23d70 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b  -1;.  return &z[
23d80 31 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  1];.}.../*.** Re
23d90 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
23da0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
23db0 69 6e 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20  ining a copy of 
23dc0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
23dd0 74 20 66 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72  t for.** the cur
23de0 72 65 6e 74 20 65 6e 74 72 79 2e 20 4f 75 74 70  rent entry. Outp
23df0 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 6e 20  ut variable *pn 
23e00 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
23e10 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
23e20 20 0a 2a 2a 20 69 6e 20 62 79 74 65 73 20 62 65   .** in bytes be
23e30 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
23e40 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
23e50 65 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ed position list
23e60 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
23e70 65 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66  e the "number of
23e80 20 62 79 74 65 73 22 20 76 61 72 69 6e 74 0a 2a   bytes" varint.*
23e90 2a 20 66 69 65 6c 64 20 74 68 61 74 20 73 74 61  * field that sta
23ea0 72 74 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rts the position
23eb0 20 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a   list on disk..*
23ec0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
23ed0 35 49 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73  5IterPoslist(Fts
23ee0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
23ef0 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70  r, const u8 **pp
23f00 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 61 73  , int *pn){.  as
23f10 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
23f20 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  dex->rc==SQLITE_
23f30 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65  OK );.  if( pIte
23f40 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20  r->pDoclist ){. 
23f50 20 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e     *pn = pIter->
23f60 70 44 6f 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c 69  pDoclist->nPosli
23f70 73 74 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49  st;.    *pp = pI
23f80 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61  ter->pDoclist->a
23f90 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65  Poslist;.  }else
23fa0 7b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74 69 53  {.    Fts5MultiS
23fb0 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 20 3d  egIter *pMulti =
23fc0 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 3b 0a   pIter->pMulti;.
23fd0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
23fe0 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d  *pSeg = &pMulti-
23ff0 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61  >aSeg[ pMulti->a
24000 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
24010 5d 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 70 53 65  ];.    *pn = pSe
24020 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 69 66 28  g->nPos;.    if(
24030 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
24040 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 20 3c 3d  et+pSeg->nPos <=
24050 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 6e 20   pSeg->pLeaf->n 
24060 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26  ){.      *pp = &
24070 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70  pSeg->pLeaf->p[p
24080 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
24090 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
240a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
240b0 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
240c0 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53  st);.      fts5S
240d0 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49  egiterPoslist(pI
240e0 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65  ter->pIndex, pSe
240f0 67 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  g, &pIter->posli
24100 73 74 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d  st);.      *pp =
24110 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
24120 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  p;.    }.  }.  r
24130 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
24140 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
24150 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  dex);.}../*.** T
24160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24170 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
24180 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73  e3Fts5IterPoslis
24190 74 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  t(), except that
241a0 20 69 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68   it.** copies th
241b0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
241c0 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
241d0 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20  supplied as the 
241e0 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d  second .** argum
241f0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
24200 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
24210 73 74 42 75 66 66 65 72 28 46 74 73 35 49 6e 64  stBuffer(Fts5Ind
24220 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  exIter *pIter, F
24230 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29  ts5Buffer *pBuf)
24240 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
24250 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
24260 3b 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ;.  Fts5DoclistI
24270 74 65 72 20 2a 70 44 6f 63 6c 69 73 74 20 3d 20  ter *pDoclist = 
24280 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 3b  pIter->pDoclist;
24290 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
242a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
242b0 20 69 66 28 20 70 44 6f 63 6c 69 73 74 20 29 7b   if( pDoclist ){
242c0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
242d0 65 74 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  et(&p->rc, pBuf,
242e0 20 70 44 6f 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c   pDoclist->nPosl
242f0 69 73 74 2c 20 70 44 6f 63 6c 69 73 74 2d 3e 61  ist, pDoclist->a
24300 50 6f 73 6c 69 73 74 29 3b 0a 20 20 7d 65 6c 73  Poslist);.  }els
24310 65 7b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74 69  e{.    Fts5Multi
24320 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 20  SegIter *pMulti 
24330 3d 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 3b  = pIter->pMulti;
24340 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a  .    fts5BufferZ
24350 65 72 6f 28 70 42 75 66 29 3b 0a 20 20 20 20 66  ero(pBuf);.    f
24360 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c  ts5MultiIterPosl
24370 69 73 74 28 70 2c 20 70 4d 75 6c 74 69 2c 20 30  ist(p, pMulti, 0
24380 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 20 20 72  , pBuf);.  }.  r
24390 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
243a0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
243b0 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72  ** Close an iter
243c0 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61  ator opened by a
243d0 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
243e0 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
243f0 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f  exQuery()..*/.vo
24400 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  id sqlite3Fts5It
24410 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  erClose(Fts5Inde
24420 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
24430 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
24440 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
24450 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73  clist ){.      s
24460 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
24470 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 29 3b  r->pDoclist->a);
24480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24490 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c  ree(pIter->pDocl
244a0 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
244b0 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
244c0 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e  IterFree(pIter->
244d0 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
244e0 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 74  Multi);.      ft
244f0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
24500 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63  se(pIter->pStruc
24510 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  t);.      fts5Bu
24520 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
24530 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d  >poslist);.    }
24540 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65  .    fts5CloseRe
24550 61 64 65 72 28 70 49 74 65 72 2d 3e 70 49 6e 64  ader(pIter->pInd
24560 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
24570 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
24580 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
24590 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
245a0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 62  ecord into the b
245b0 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20 61  uffer supplied a
245c0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
245d0 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72   argument. Retur
245e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
245f0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
24600 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
24610 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f  de.** if an erro
24620 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  r occurs..*/.int
24630 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
24640 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74 73  xGetAverages(Fts
24650 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42  5Index *p, Fts5B
24660 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20  uffer *pBuf){.  
24670 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
24680 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74  QLITE_OK );.  ft
24690 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66 66  s5DataReadOrBuff
246a0 65 72 28 70 2c 20 70 42 75 66 2c 20 46 54 53 35  er(p, pBuf, FTS5
246b0 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29  _AVERAGES_ROWID)
246c0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
246d0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
246e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  ../*.** Replace 
246f0 74 68 65 20 63 75 72 72 65 6e 74 20 22 61 76 65  the current "ave
24700 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 77 69  rages" record wi
24710 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
24720 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a  of the buffer .*
24730 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68  * supplied as th
24740 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
24750 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
24760 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65  3Fts5IndexSetAve
24770 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
24780 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  *p, const u8 *pD
24790 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b  ata, int nData){
247a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
247b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
247c0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
247d0 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
247e0 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44  ROWID, pData, nD
247f0 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  ata);.  return f
24800 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
24810 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
24820 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
24830 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68  ber of blocks th
24840 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65  is module has re
24850 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  ad from the %_da
24860 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63  ta.** table sinc
24870 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64  e it was created
24880 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24890 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28 46  Fts5IndexReads(F
248a0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
248b0 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b  return p->nRead;
248c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
248d0 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20  e 32-bit cookie 
248e0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20  value stored at 
248f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 6c 6c  the start of all
24900 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 72   structure .** r
24910 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 76 61  ecords to the va
24920 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
24930 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
24940 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
24950 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
24960 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
24970 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
24980 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   if an error.** 
24990 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
249a0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
249b0 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64  etCookie(Fts5Ind
249c0 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29  ex *p, int iNew)
249d0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
24a00 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
24a10 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
24a20 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20   = p->pConfig;  
24a30 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
24a40 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  on object */.  u
24a50 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20  8 aCookie[4];   
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 72 65      /* Binary re
24a80 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
24a90 69 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72  iNew */..  asser
24aa0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
24ab0 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  _OK );..  sqlite
24ac0 33 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b  3Fts5Put32(aCook
24ad0 69 65 2c 20 69 4e 65 77 29 3b 0a 20 20 73 71 6c  ie, iNew);.  sql
24ae0 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
24af0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
24b00 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70  ite3_blob_open(p
24b10 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e  Config->db, pCon
24b20 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61  fig->zDb, p->zDa
24b30 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 22 62  taTbl, .      "b
24b40 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54 52 55  lock", FTS5_STRU
24b50 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20  CTURE_ROWID, 1, 
24b60 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66  &pBlob.  );.  if
24b70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24b80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
24b90 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c  lob_write(pBlob,
24ba0 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b   aCookie, 4, 0);
24bb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24bc0 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c  3_blob_close(pBl
24bd0 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ob);.  }..  retu
24be0 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
24bf0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f  lite3Fts5IndexLo
24c00 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64  adConfig(Fts5Ind
24c10 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74  ex *p){.  Fts5St
24c20 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
24c30 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
24c40 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
24c50 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  p);.  fts5Struct
24c60 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
24c70 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ct);.  return ft
24c80 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
24c90 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
24ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ce0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
24cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
24d30 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20  elow this point 
24d40 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
24d50 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74  ation of the int
24d60 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a  egrity-check .**
24d70 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a   functionality..
24d80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
24d90 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63 6b 73   a simple checks
24da0 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64 20 6f  um value based o
24db0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e  n the arguments.
24dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66  .*/.static u64 f
24dd0 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
24de0 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64  um(.  i64 iRowid
24df0 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a  , .  int iCol, .
24e00 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69    int iPos, .  i
24e10 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74  nt iIdx,.  const
24e20 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20   char *pTerm,.  
24e30 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69  int nTerm.){.  i
24e40 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20  nt i;.  u64 ret 
24e50 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20  = iRowid;.  ret 
24e60 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43  += (ret<<3) + iC
24e70 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  ol;.  ret += (re
24e80 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20  t<<3) + iPos;.  
24e90 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20 72 65  if( iIdx>=0 ) re
24ea0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
24eb0 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49  (FTS5_MAIN_PREFI
24ec0 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66 6f 72  X + iIdx);.  for
24ed0 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69  (i=0; i<nTerm; i
24ee0 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ++) ret += (ret<
24ef0 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a  <3) + pTerm[i];.
24f00 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
24f10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
24f20 35 42 74 72 65 65 49 74 65 72 49 6e 69 74 28 0a  5BtreeIterInit(.
24f30 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
24f40 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
24f50 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 0a  Segment *pSeg, .
24f60 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20    Fts5BtreeIter 
24f70 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69 6e 74 20  *pIter.){.  int 
24f80 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
24f90 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
24fa0 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 29  (pIter->aLvl[0])
24fb0 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65 69 67 68   * (pSeg->nHeigh
24fc0 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  t-1);.  memset(p
24fd0 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
24fe0 2a 70 49 74 65 72 29 29 3b 0a 20 20 69 66 28 20  *pIter));.  if( 
24ff0 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 70 49 74  nByte ){.    pIt
25000 65 72 2d 3e 61 4c 76 6c 20 3d 20 28 46 74 73 35  er->aLvl = (Fts5
25010 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 2a 29  BtreeIterLevel*)
25020 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
25030 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 69   nByte);.  }.  i
25040 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
25050 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
25060 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65 67 2d 3e 6e  ->nLvl = pSeg->n
25070 48 65 69 67 68 74 2d 31 3b 0a 20 20 20 20 70 49  Height-1;.    pI
25080 74 65 72 2d 3e 70 20 3d 20 70 3b 0a 20 20 20 20  ter->p = p;.    
25090 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
250a0 65 67 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  eg;.  }.  for(i=
250b0 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
250c0 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d 3e  _OK && i<pIter->
250d0 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nLvl; i++){.    
250e0 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
250f0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
25100 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 2b  pSeg->iSegid, i+
25110 31 2c 20 31 29 3b 0a 20 20 20 20 46 74 73 35 44  1, 1);.    Fts5D
25120 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
25130 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70  pIter->aLvl[i].p
25140 44 61 74 61 20 3d 20 70 44 61 74 61 20 3d 20 66  Data = pData = f
25150 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
25160 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  Rowid);.    if( 
25170 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66  pData ){.      f
25180 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28  ts5NodeIterInit(
25190 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d  pData->p, pData-
251a0 3e 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  >n, &pIter->aLvl
251b0 5b 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a 20 20  [i].s);.    }.  
251c0 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  }..  if( pIter->
251d0 6e 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63  nLvl==0 || p->rc
251e0 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62   ){.    pIter->b
251f0 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 74  Eof = 1;.    pIt
25200 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53 65 67  er->iLeaf = pSeg
25210 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d 65  ->pgnoLast;.  }e
25220 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
25230 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e  nEmpty = pIter->
25240 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79  aLvl[0].s.nEmpty
25250 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
25260 61 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c  af = pIter->aLvl
25270 5b 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20  [0].s.iChild;.  
25280 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20    pIter->bDlidx 
25290 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  = pIter->aLvl[0]
252a0 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a 7d  .s.bDlidx;.  }.}
252b0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
252c0 73 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28  s5BtreeIterNext(
252d0 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a 70  Fts5BtreeIter *p
252e0 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64  Iter){.  Fts5Ind
252f0 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70  ex *p = pIter->p
25300 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
25310 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f  sert( pIter->bEo
25320 66 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 61  f==0 && pIter->a
25330 4c 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61 20 29  Lvl[0].s.aData )
25340 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
25350 49 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20 70 2d  Iter->nLvl && p-
25360 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
25370 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74  i++){.    Fts5Bt
25380 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c  reeIterLevel *pL
25390 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
253a0 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f  l[i];.    fts5No
253b0 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72  deIterNext(&p->r
253c0 63 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20  c, &pLvl->s);.  
253d0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e 61 44    if( pLvl->s.aD
253e0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ata ){.      fts
253f0 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
25400 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
25410 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e 2c   pLvl->s.term.n,
25420 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70 29   pLvl->s.term.p)
25430 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
25440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25450 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65  fts5NodeIterFree
25460 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20  (&pLvl->s);.    
25470 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
25480 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
25490 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
254a0 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  a = 0;.    }.  }
254b0 0a 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d  .  if( i==pIter-
254c0 3e 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63 20 29  >nLvl || p->rc )
254d0 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f  {.    pIter->bEo
254e0 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f = 1;.  }else{.
254f0 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
25500 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
25510 65 67 69 64 3b 0a 20 20 20 20 66 6f 72 28 69 2d  egid;.    for(i-
25520 2d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  -; i>=0; i--){. 
25530 20 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74       Fts5BtreeIt
25540 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  erLevel *pLvl = 
25550 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
25560 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
25570 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
25580 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
25590 2b 31 2c 20 70 4c 76 6c 5b 31 5d 2e 73 2e 69 43  +1, pLvl[1].s.iC
255a0 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 70 4c 76  hild);.      pLv
255b0 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44  l->pData = fts5D
255c0 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69  ataRead(p, iRowi
255d0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  d);.      if( pL
255e0 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20  vl->pData ){.   
255f0 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65       fts5NodeIte
25600 72 49 6e 69 74 28 70 4c 76 6c 2d 3e 70 44 61 74  rInit(pLvl->pDat
25610 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e 70 44 61 74  a->p, pLvl->pDat
25620 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b  a->n, &pLvl->s);
25630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25640 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 6e 45 6d   }..  pIter->nEm
25650 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  pty = pIter->aLv
25660 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20  l[0].s.nEmpty;. 
25670 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d   pIter->bDlidx =
25680 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
25690 73 2e 62 44 6c 69 64 78 3b 0a 20 20 70 49 74 65  s.bDlidx;.  pIte
256a0 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74 65 72  r->iLeaf = pIter
256b0 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68 69  ->aLvl[0].s.iChi
256c0 6c 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ld;.}..static vo
256d0 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65 72  id fts5BtreeIter
256e0 46 72 65 65 28 46 74 73 35 42 74 72 65 65 49 74  Free(Fts5BtreeIt
256f0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
25700 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
25710 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
25720 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74 72  ++){.    Fts5Btr
25730 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76  eeIterLevel *pLv
25740 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
25750 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64  [i];.    fts5Nod
25760 65 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c 2d  eIterFree(&pLvl-
25770 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76  >s);.    if( pLv
25780 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20  l->pData ){.    
25790 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
257a0 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
257b0 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
257c0 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  a = 0;.    }.  }
257d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
257e0 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a 20 20  pIter->aLvl);.  
257f0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
25800 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a  pIter->term);.}.
25810 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25820 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
25830 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65  function is pure
25840 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ly an internal t
25850 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  est. It does not
25860 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a   contribute to .
25870 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61  ** FTS functiona
25880 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68  lity, or even th
25890 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
258a0 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  k, in any way..*
258b0 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74  *.** Instead, it
258c0 20 74 65 73 74 73 20 74 68 61 74 20 74 68 65 20   tests that the 
258d0 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f  same set of pgno
258e0 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
258f0 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69  ons are .** visi
25900 74 65 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ted regardless o
25910 66 20 77 68 65 74 68 65 72 20 74 68 65 20 64 6f  f whether the do
25920 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e  clist-index iden
25930 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
25940 74 65 72 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69  ters.** iSegid/i
25950 4c 65 61 66 20 69 73 20 69 74 65 72 61 74 65 64  Leaf is iterated
25960 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f 72 20   in forwards or 
25970 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a  reverse order..*
25980 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
25990 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
259a0 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  se(.  Fts5Index 
259b0 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69  *p, .  int iSegi
259c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
259d0 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
259e0 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f  t id to load fro
259f0 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  m */.  int iLeaf
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64         /* Load d
25a20 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
25a30 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b   this leaf */.){
25a40 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
25a50 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20   *pDlidx = 0;.  
25a60 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b  u64 cksum1 = 13;
25a70 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  u64 cksum2 = 
25a80 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64  13;..  for(pDlid
25a90 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  x=fts5DlidxIterI
25aa0 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64  nit(p, 0, iSegid
25ab0 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , iLeaf);.      
25ac0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
25ad0 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
25ae0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
25af0 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64  terNext(p, pDlid
25b00 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  x).  ){.    i64 
25b10 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69  iRowid = fts5Dli
25b20 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
25b30 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e  dx);.    int pgn
25b40 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
25b50 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
25b60 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3e     assert( pgno>
25b70 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73  iLeaf );.    cks
25b80 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20  um1 += iRowid + 
25b90 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b  ((i64)pgno<<32);
25ba0 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78  .  }.  fts5Dlidx
25bb0 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
25bc0 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a  ;.  pDlidx = 0;.
25bd0 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74  .  for(pDlidx=ft
25be0 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
25bf0 70 2c 20 31 2c 20 69 53 65 67 69 64 2c 20 69 4c  p, 1, iSegid, iL
25c00 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35  eaf);.      fts5
25c10 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
25c20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
25c30 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
25c40 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  rev(p, pDlidx). 
25c50 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
25c60 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  id = fts5DlidxIt
25c70 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b  erRowid(pDlidx);
25c80 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  .    int pgno = 
25c90 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
25ca0 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61  o(pDlidx);.    a
25cb0 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78  ssert( fts5Dlidx
25cc0 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
25cd0 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b  >iLeaf );.    ck
25ce0 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b  sum2 += iRowid +
25cf0 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29   ((i64)pgno<<32)
25d00 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64  ;.  }.  fts5Dlid
25d10 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
25d20 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b  );.  pDlidx = 0;
25d30 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
25d40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
25d50 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e  m1!=cksum2 ) p->
25d60 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
25d70 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  T;.}..static int
25d80 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
25d90 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25db0 20 20 20 2f 2a 20 46 74 73 35 20 69 6e 64 65 78     /* Fts5 index
25dc0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
25dd0 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63   iIdx,.  const c
25de0 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20  har *z,         
25df0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
25e00 78 20 6b 65 79 20 74 6f 20 71 75 65 72 79 20 66  x key to query f
25e10 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  or */.  int n,  
25e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e30 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
25e40 6f 66 20 69 6e 64 65 78 20 6b 65 79 20 69 6e 20  of index key in 
25e50 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66  bytes */.  int f
25e60 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
25e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
25e80 61 67 73 20 66 6f 72 20 46 74 73 35 49 6e 64 65  ags for Fts5Inde
25e90 78 51 75 65 72 79 20 2a 2f 0a 20 20 75 36 34 20  xQuery */.  u64 
25ea0 2a 70 43 6b 73 75 6d 20 20 20 20 20 20 20 20 20  *pCksum         
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25ec0 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75 6d 20  N/OUT: Checksum 
25ed0 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 36  value */.){.  u6
25ee0 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75  4 cksum = *pCksu
25ef0 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  m;.  Fts5IndexIt
25f00 65 72 20 2a 70 49 64 78 49 74 65 72 20 3d 20 30  er *pIdxIter = 0
25f10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
25f20 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
25f30 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67  ry(p, z, n, flag
25f40 73 2c 20 26 70 49 64 78 49 74 65 72 29 3b 0a 0a  s, &pIdxIter);..
25f50 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
25f60 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
25f70 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
25f80 70 49 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20  pIdxIter) ){.   
25f90 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 3b   const u8 *pPos;
25fa0 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20  .    int nPos;. 
25fb0 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73     i64 rowid = s
25fc0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 52 6f  qlite3Fts5IterRo
25fd0 77 69 64 28 70 49 64 78 49 74 65 72 29 3b 0a 20  wid(pIdxIter);. 
25fe0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
25ff0 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28 70  ts5IterPoslist(p
26000 49 64 78 49 74 65 72 2c 20 26 70 50 6f 73 2c 20  IdxIter, &pPos, 
26010 26 6e 50 6f 73 29 3b 0a 20 20 20 20 69 66 28 20  &nPos);.    if( 
26020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26030 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69  .      Fts5Posli
26040 73 74 52 65 61 64 65 72 20 73 52 65 61 64 65 72  stReader sReader
26050 3b 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c 69  ;.      for(sqli
26060 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
26070 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 70 50 6f  aderInit(-1, pPo
26080 73 2c 20 6e 50 6f 73 2c 20 26 73 52 65 61 64 65  s, nPos, &sReade
26090 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 52  r);.          sR
260a0 65 61 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20  eader.bEof==0;. 
260b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
260c0 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
260d0 72 4e 65 78 74 28 26 73 52 65 61 64 65 72 29 0a  rNext(&sReader).
260e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
260f0 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35   int iCol = FTS5
26100 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61  _POS2COLUMN(sRea
26110 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20  der.iPos);.     
26120 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 46 54     int iOff = FT
26130 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 73 52  S5_POS2OFFSET(sR
26140 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20  eader.iPos);.   
26150 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 66 74       cksum ^= ft
26160 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
26170 6d 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  m(rowid, iCol, i
26180 4f 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29  Off, iIdx, z, n)
26190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
261a0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
261b0 49 74 65 72 4e 65 78 74 28 70 49 64 78 49 74 65  IterNext(pIdxIte
261c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
261d0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
261e0 6c 6f 73 65 28 70 49 64 78 49 74 65 72 29 3b 0a  lose(pIdxIter);.
261f0 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73  .  *pCksum = cks
26200 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  um;.  return rc;
26210 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
26220 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f  function is also
26230 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72   purely an inter
26240 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65  nal test. It doe
26250 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
26260 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63   to .** FTS func
26270 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76  tionality, or ev
26280 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  en the integrity
26290 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77  -check, in any w
262a0 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
262b0 69 64 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  id fts5TestTerm(
262c0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
262d0 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a   .  Fts5Buffer *
262e0 70 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  pPrev,          
262f0 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
26300 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  term */.  const 
26310 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
26320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
26330 73 69 62 6c 79 20 6e 65 77 20 74 65 72 6d 20 74  sibly new term t
26340 6f 20 74 65 73 74 20 2a 2f 0a 20 20 75 36 34 20  o test */.  u64 
26350 65 78 70 65 63 74 65 64 2c 0a 20 20 75 36 34 20  expected,.  u64 
26360 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74  *pCksum.){.  int
26370 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69   rc = p->rc;.  i
26380 66 28 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29  f( pPrev->n==0 )
26390 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
263a0 53 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20  Set(&rc, pPrev, 
263b0 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29  n, (const u8*)z)
263c0 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  ;.  }else.  if( 
263d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
263e0 20 28 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c   (pPrev->n!=n ||
263f0 20 6d 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70   memcmp(pPrev->p
26400 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20  , z, n)) ){.    
26410 75 33 32 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43  u32 cksum3 = *pC
26420 6b 73 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ksum;.    const 
26430 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 26 70  char *zTerm = &p
26440 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20  Prev->p[1];  /* 
26450 54 68 65 20 74 65 72 6d 20 77 69 74 68 6f 75 74  The term without
26460 20 74 68 65 20 70 72 65 66 69 78 2d 62 79 74 65   the prefix-byte
26470 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72   */.    int nTer
26480 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20  m = pPrev->n-1; 
26490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
264a0 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  ze of zTerm in b
264b0 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ytes */.    int 
264c0 69 49 64 78 20 3d 20 28 70 50 72 65 76 2d 3e 70  iIdx = (pPrev->p
264d0 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f  [0] - FTS5_MAIN_
264e0 50 52 45 46 49 58 29 3b 0a 20 20 20 20 69 6e 74  PREFIX);.    int
264f0 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d 3d   flags = (iIdx==
26500 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44 45  0 ? 0 : FTS5INDE
26510 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29 3b  X_QUERY_PREFIX);
26520 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
26530 20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20   u64 ck1 = 0;.  
26540 20 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a    u64 ck2 = 0;..
26550 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
26560 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65  t the results re
26570 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61  turned for ASC a
26580 6e 64 20 44 45 53 43 20 71 75 65 72 69 65 73 20  nd DESC queries 
26590 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  are.    ** the s
265a0 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c  ame. If not, cal
265b0 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f  l this corruptio
265c0 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n.  */.    rc = 
265d0 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
265e0 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
265f0 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b  Term, flags, &ck
26600 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
26610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26620 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
26630 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
26640 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20  _DESC;.      rc 
26650 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
26660 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
26670 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29   nTerm, f, &ck2)
26680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
266a0 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
266b0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
266c0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
266d0 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79  s a prefix query
266e0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
266f0 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
26700 64 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d if the.    ** 
26710 74 68 65 20 69 6e 64 65 78 20 69 73 20 64 69 73  the index is dis
26720 61 62 6c 65 64 20 61 72 65 20 74 68 65 20 73 61  abled are the sa
26730 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20  me. In both ASC 
26740 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20  and DESC order. 
26750 2a 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78 3e  */.    if( iIdx>
26760 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
26770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
26780 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
26790 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
267a0 4f 49 44 58 3b 0a 20 20 20 20 20 20 63 6b 32 20  OIDX;.      ck2 
267b0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
267c0 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
267d0 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
267e0 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
267f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26800 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d  LITE_OK && ck1!=
26810 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ck2 ) rc = FTS5_
26820 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
26830 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26     if( iIdx>0 &&
26840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26850 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20  {.      int f = 
26860 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
26870 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
26880 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
26890 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 63 6b 32  _DESC;.      ck2
268a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
268b0 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
268c0 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
268d0 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b  nTerm, f, &ck2);
268e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
268f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
26900 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
26910 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a  _CORRUPT;.    }.
26920 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20 63  .    cksum3 ^= c
26930 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  k1;.    fts5Buff
26940 65 72 53 65 74 28 26 72 63 2c 20 70 50 72 65 76  erSet(&rc, pPrev
26950 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  , n, (const u8*)
26960 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  z);..    if( rc=
26970 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
26980 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64 20 29  sum3!=expected )
26990 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46 54 53  {.      rc = FTS
269a0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
269b0 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63  .    *pCksum = c
269c0 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ksum3;.  }.  p->
269d0 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65 6c  rc = rc;.}. .#el
269e0 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  se.# define fts5
269f0 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65  TestDlidxReverse
26a00 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  (x,y,z).# define
26a10 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 75 2c   fts5TestTerm(u,
26a20 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
26a30 66 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  f..static void f
26a40 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
26a50 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20  yCheckSegment(. 
26a60 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
26a90 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
26aa0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
26ab0 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20  t *pSeg      /* 
26ac0 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b  Segment to check
26ad0 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73   internal consis
26ae0 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74  tency */.){.  Ft
26af0 73 35 42 74 72 65 65 49 74 65 72 20 69 74 65 72  s5BtreeIter iter
26b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26b10 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
26b20 20 74 68 72 6f 75 67 68 20 62 2d 74 72 65 65 20   through b-tree 
26b30 68 69 65 72 61 72 63 68 79 20 2a 2f 0a 0a 20 20  hierarchy */..  
26b40 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
26b50 72 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  rst==0 ) return;
26b60 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74  ..  /* Iterate t
26b70 68 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65  hrough the b-tre
26b80 65 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f  e hierarchy.  */
26b90 0a 20 20 66 6f 72 28 66 74 73 35 42 74 72 65 65  .  for(fts5Btree
26ba0 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67  IterInit(p, pSeg
26bb0 2c 20 26 69 74 65 72 29 3b 0a 20 20 20 20 20 20  , &iter);.      
26bc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
26bd0 20 26 26 20 69 74 65 72 2e 62 45 6f 66 3d 3d 30   && iter.bEof==0
26be0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 74 72 65  ;.      fts5Btre
26bf0 65 49 74 65 72 4e 65 78 74 28 26 69 74 65 72 29  eIterNext(&iter)
26c00 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
26c10 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
26c20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
26c30 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
26c40 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
26c50 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
26c60 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
26c70 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20  this leaf */.   
26c80 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ca0 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
26cb0 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a  t term on leaf *
26cc0 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ce0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
26cf0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65  terate through e
26d00 6d 70 74 79 20 6c 65 61 76 65 73 20 2a 2f 0a 0a  mpty leaves */..
26d10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
26d20 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
26d30 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
26d40 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
26d50 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
26d60 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
26d70 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
26d80 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
26d90 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
26da0 20 20 20 69 66 28 20 69 74 65 72 2e 69 4c 65 61     if( iter.iLea
26db0 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  f<pSeg->pgnoFirs
26dc0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
26dd0 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45    iRow = FTS5_SE
26de0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
26df0 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 69 74 65  ->iSegid, 0, ite
26e00 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c  r.iLeaf);.    pL
26e10 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
26e20 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20  ad(p, iRow);.   
26e30 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
26e40 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43  break;..    /* C
26e50 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65  heck that the le
26e60 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  af contains at l
26e70 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61  east one term, a
26e80 6e 64 20 74 68 61 74 20 69 74 20 69 73 20 65 71  nd that it is eq
26e90 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72  ual.    ** to or
26ea0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
26eb0 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 69 74   split-key in it
26ec0 65 72 2e 74 65 72 6d 2e 20 20 41 6c 73 6f 20 63  er.term.  Also c
26ed0 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65  heck that if the
26ee0 72 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73  re.    ** is als
26ef0 6f 20 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65  o a rowid pointe
26f00 72 20 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61  r within the lea
26f10 66 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 69  f page header, i
26f20 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20  t points to a.  
26f30 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65    ** location be
26f40 66 6f 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20  fore the term.  
26f50 2a 2f 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74  */.    iOff = ft
26f60 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
26f70 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  >p[2]);.    if( 
26f80 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
26f90 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
26fa0 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
26fb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77  {.      int iRow
26fc0 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74  idOff;.      int
26fd0 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
26fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
26ff0 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66   of term on leaf
27000 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
27010 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20     int res;     
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27030 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  * Comparison of 
27040 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b  term and split-k
27050 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69 52 6f  ey */..      iRo
27060 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74  widOff = fts5Get
27070 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d  U16(&pLeaf->p[0]
27080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  );.      if( iRo
27090 77 69 64 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a  widOff>=iOff ){.
270a0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
270b0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
270c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
270d0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
270e0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
270f0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
27100 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  m);.        res 
27110 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d  = memcmp(&pLeaf-
27120 3e 70 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74  >p[iOff], iter.t
27130 65 72 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d  erm.p, MIN(nTerm
27140 2c 20 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b  , iter.term.n));
27150 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
27160 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54 65 72  ==0 ) res = nTer
27170 6d 20 2d 20 69 74 65 72 2e 74 65 72 6d 2e 6e 3b  m - iter.term.n;
27180 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
27190 3c 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  <0 ) p->rc = FTS
271a0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
271b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73   }.    }.    fts
271c0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
271d0 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  af);.    if( p->
271e0 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 0a 20 20  rc ) break;...  
271f0 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74    /* Now check t
27200 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d  hat the iter.nEm
27210 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  pty leaves follo
27220 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  wing the current
27230 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29   leaf.    ** (a)
27240 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63   exist and (b) c
27250 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e  ontain no terms.
27260 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   */.    for(i=1;
27270 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
27280 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e 45 6d  K && i<=iter.nEm
27290 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  pty; i++){.     
272a0 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
272b0 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b 69 29  aRead(p, iRow+i)
272c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 61  ;.      if( pLea
272d0 66 20 26 26 20 30 21 3d 66 74 73 35 47 65 74 55  f && 0!=fts5GetU
272e0 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29  16(&pLeaf->p[2])
272f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
27300 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
27310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27320 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
27330 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  pLeaf);.    }.. 
27340 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
27350 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
27360 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74  x, check that it
27370 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f   looks right. */
27380 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e 62 44  .    if( iter.bD
27390 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74  lidx ){.      Ft
273a0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
273b0 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72  idx = 0;  /* For
273c0 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
273d0 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  gh doclist index
273e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50   */.      int iP
273f0 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72 2e 69  revLeaf = iter.i
27400 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
27410 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69  iSegid = pSeg->i
27420 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Segid;.      int
27430 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36 34 20   iPg;.      i64 
27440 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72  iKey;..      for
27450 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
27460 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20  xIterInit(p, 0, 
27470 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c 65  iSegid, iter.iLe
27480 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  af);.          f
27490 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
274a0 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
274b0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
274c0 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44  dxIterNext(p, pD
274d0 6c 69 64 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a  lidx).      ){..
274e0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
274f0 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73 20   any rowid-less 
27500 70 61 67 65 73 20 74 68 61 74 20 6f 63 63 75 72  pages that occur
27510 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
27520 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20  ent leaf. */.   
27530 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72       for(iPg=iPr
27540 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66 74  evLeaf+1; iPg<ft
27550 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
27560 70 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b  pDlidx); iPg++){
27570 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20  .          iKey 
27580 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
27590 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20  OWID(iSegid, 0, 
275a0 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iPg);.          
275b0 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
275c0 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
275d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
275e0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
275f0 20 20 69 66 28 20 66 74 73 35 47 65 74 55 31 36    if( fts5GetU16
27600 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d  (&pLeaf->p[0])!=
27610 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
27620 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
27630 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
27640 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
27650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27660 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50 72 65    }.        iPre
27670 76 4c 65 61 66 20 3d 20 66 74 73 35 44 6c 69 64  vLeaf = fts5Dlid
27680 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
27690 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  );..        /* C
276a0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65  heck that the le
276b0 61 66 20 70 61 67 65 20 69 6e 64 69 63 61 74 65  af page indicate
276c0 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
276d0 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20  r really does.  
276e0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
276f0 20 74 68 65 20 72 6f 77 69 64 20 73 75 67 67 65   the rowid sugge
27700 73 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  sted by the same
27710 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65  . */.        iKe
27720 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  y = FTS5_SEGMENT
27730 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30  _ROWID(iSegid, 0
27740 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20  , iPrevLeaf);.  
27750 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
27760 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
27770 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
27780 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
27790 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
277a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52            int iR
277b0 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65  owidOff = fts5Ge
277c0 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30  tU16(&pLeaf->p[0
277d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  ]);.          ge
277e0 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
277f0 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75  p[iRowidOff], (u
27800 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20  64*)&iRowid);.  
27810 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
27820 69 64 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65  id!=fts5DlidxIte
27830 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
27840 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
27850 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
27860 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
27870 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
27880 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
27890 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
278a0 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65  eaf+1; iPg<=(ite
278b0 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e  r.iLeaf + iter.n
278c0 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a  Empty); iPg++){.
278d0 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
278e0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
278f0 44 28 69 53 65 67 69 64 2c 20 30 2c 20 69 50 67  D(iSegid, 0, iPg
27900 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66  );.        pLeaf
27910 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
27920 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20  p, iKey);.      
27930 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
27940 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
27950 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
27960 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63  p[0])!=0 ) p->rc
27970 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
27980 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
27990 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
279a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
279b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35     }..      fts5
279c0 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44  DlidxIterFree(pD
279d0 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73  lidx);.      fts
279e0 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73  5TestDlidxRevers
279f0 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69 74 65  e(p, iSegid, ite
27a00 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  r.iLeaf);.    }.
27a10 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69    }..  /* Page i
27a20 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e  ter.iLeaf must n
27a30 6f 77 20 62 65 20 74 68 65 20 72 69 67 68 74 6d  ow be the rightm
27a40 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69 6e  ost leaf-page in
27a50 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a   the segment */.
27a60 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
27a70 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69  ITE_OK && iter.i
27a80 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f  Leaf!=pSeg->pgno
27a90 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72  Last ){.    p->r
27aa0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
27ab0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 74 72  ;.  }..  fts5Btr
27ac0 65 65 49 74 65 72 46 72 65 65 28 26 69 74 65 72  eeIterFree(&iter
27ad0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  );.}.../*.** Run
27ae0 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
27af0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
27b00 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 61  the FTS index (a
27b10 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ) is internally 
27b20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61  .** consistent a
27b30 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20  nd (b) contains 
27b40 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69 63  entries for whic
27b50 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65  h the XOR of the
27b60 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73   checksums.** as
27b70 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 66   calculated by f
27b80 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
27b90 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a  um() is cksum..*
27ba0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
27bb0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
27bc0 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  y of the interna
27bd0 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f  l checks fail, o
27be0 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63  r if the.** chec
27bf0 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ksum does not ma
27c00 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  tch. Return SQLI
27c10 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65  TE_OK if all che
27c20 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74  cks pass without
27c30 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f  .** error, or so
27c40 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
27c50 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
27c60 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67  other error (e.g
27c70 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73  . OOM).** occurs
27c80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27c90 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
27ca0 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
27cb0 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29  x *p, u64 cksum)
27cc0 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  {.  u64 cksum2 =
27cd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27ce0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
27cf0 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
27d00 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
27d10 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
27d20 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  list = {0,0,0}; 
27d30 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
27d40 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69   to hold a posli
27d50 73 74 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74  st */.  Fts5Mult
27d60 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 3b  iSegIter *pIter;
27d70 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
27d80 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
27d90 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20  gh entire index 
27da0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
27db0 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
27dc0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
27dd0 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20 20 2f 2a  ructure */..  /*
27de0 20 55 73 65 64 20 62 79 20 65 78 74 72 61 20 69   Used by extra i
27df0 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20 6f 6e  nternal tests on
27e00 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42 55 47  ly run if NDEBUG
27e10 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
27e20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 33 20  */.  u64 cksum3 
27e30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
27e40 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
27e50 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e   based on conten
27e60 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f  ts of indexes */
27e70 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
27e80 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  rm = {0,0,0};   
27e90 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
27ea0 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72  d to hold most r
27eb0 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  ecent term */.  
27ec0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46  .  /* Load the F
27ed0 54 53 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  TS index structu
27ee0 72 65 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20  re */.  pStruct 
27ef0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
27f00 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68  ead(p);..  /* Ch
27f10 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74  eck that the int
27f20 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65  ernal nodes of e
27f30 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63  ach segment matc
27f40 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a  h the leaves */.
27f50 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
27f60 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69  .    int iLvl, i
27f70 53 65 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76  Seg;.    for(iLv
27f80 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
27f90 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
27fa0 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  +){.      for(iS
27fb0 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
27fc0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
27fd0 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
27fe0 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75          Fts5Stru
27ff0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
28000 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
28010 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
28020 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iSeg];.        
28030 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
28040 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70  tyCheckSegment(p
28050 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d  , pSeg);.      }
28060 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28070 20 54 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d   The cksum argum
28080 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
28090 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
280a0 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c   checksum calcul
280b0 61 74 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20  ated.  ** based 
280c0 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20  on all expected 
280d0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46  entries in the F
280e0 54 53 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64  TS index (includ
280f0 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64 65 78  ing prefix index
28100 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20  .  ** entries). 
28110 54 68 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b  This block check
28120 73 20 74 68 61 74 20 61 20 63 68 65 63 6b 73 75  s that a checksu
28130 6d 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  m calculated bas
28140 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61  ed on the.  ** a
28150 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f  ctual contents o
28160 66 20 46 54 53 20 69 6e 64 65 78 20 69 73 20 69  f FTS index is i
28170 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20  dentical..  **. 
28180 20 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73   ** Two versions
28190 20 6f 66 20 74 68 65 20 73 61 6d 65 20 63 68 65   of the same che
281a0 63 6b 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c  cksum are calcul
281b0 61 74 65 64 2e 20 54 68 65 20 66 69 72 73 74 20  ated. The first 
281c0 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69  (stack.  ** vari
281d0 61 62 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73  able cksum2) bas
281e0 65 64 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78  ed on entries ex
281f0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
28200 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
28210 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e  .  ** while doin
28220 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  g a linear scan 
28230 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  of each individu
28240 61 6c 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e  al index in turn
28250 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20  . .  **.  ** As 
28260 65 61 63 68 20 74 65 72 6d 20 76 69 73 69 74 65  each term visite
28270 64 20 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20  d by the linear 
28280 73 63 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74  scans, a separat
28290 65 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a  e query for the.
282a0 20 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69    ** same term i
282b0 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73  s performed. cks
282c0 75 6d 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65  um3 is calculate
282d0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65  d based on the e
282e0 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72  ntries.  ** extr
282f0 61 63 74 65 64 20 62 79 20 74 68 65 73 65 20 71  acted by these q
28300 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  ueries..  */.  f
28310 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72  or(fts5MultiIter
28320 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
28330 30 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  0, 0, 0, 0, -1, 
28340 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  0, &pIter);.    
28350 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
28360 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
28370 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
28380 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
28390 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
283a0 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283c0 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e   Size of term in
283d0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 36   bytes */.    i6
283e0 34 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20  4 iPos = 0;     
283f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
28400 69 74 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20  ition read from 
28410 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  poslist */.    i
28420 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20  nt iOff = 0;    
28430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
28440 66 73 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c  fset within posl
28450 69 73 74 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  ist */.    i64 i
28460 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74  Rowid = fts5Mult
28470 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
28480 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  );.    char *z =
28490 20 28 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74   (char*)fts5Mult
284a0 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c  iIterTerm(pIter,
284b0 20 26 6e 29 3b 0a 0a 20 20 20 20 70 6f 73 6c 69   &n);..    posli
284c0 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 66 74  st.n = 0;.    ft
284d0 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69  s5MultiIterPosli
284e0 73 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  st(p, pIter, 0, 
284f0 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 77  &poslist);.    w
28500 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33  hile( 0==sqlite3
28510 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
28520 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73  4(poslist.p, pos
28530 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26  list.n, &iOff, &
28540 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 69  iPos) ){.      i
28550 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50  nt iCol = FTS5_P
28560 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b  OS2COLUMN(iPos);
28570 0a 20 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f  .      int iTokO
28580 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46  ff = FTS5_POS2OF
28590 46 53 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20  FSET(iPos);.    
285a0 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66 74 73 35    cksum2 ^= fts5
285b0 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
285c0 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54  iRowid, iCol, iT
285d0 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29  okOff, -1, z, n)
285e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
285f0 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 65 77  If this is a new
28600 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f 72   term, query for
28610 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73 75   it. Update cksu
28620 6d 33 20 77 69 74 68 20 74 68 65 20 72 65 73 75  m3 with the resu
28630 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  lts. */.    fts5
28640 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72  TestTerm(p, &ter
28650 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c  m, z, n, cksum2,
28660 20 26 63 6b 73 75 6d 33 29 3b 0a 20 20 7d 0a 20   &cksum3);.  }. 
28670 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c   fts5TestTerm(p,
28680 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63 6b   &term, 0, 0, ck
28690 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a  sum2, &cksum3);.
286a0 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
286b0 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Free(p, pIter);.
286c0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
286d0 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21  ITE_OK && cksum!
286e0 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
286f0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
28700 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
28710 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
28720 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
28730 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 66 74 73  ee(&term);.  fts
28740 35 42 75 66 66 65 72 46 72 65 65 28 26 70 6f 73  5BufferFree(&pos
28750 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  list);.  return 
28760 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
28770 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61  p);.}.../*.** Ca
28780 6c 63 75 6c 61 74 65 20 61 6e 64 20 72 65 74 75  lculate and retu
28790 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 74 68  rn a checksum th
287a0 61 74 20 69 73 20 74 68 65 20 58 4f 52 20 6f 66  at is the XOR of
287b0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
287c0 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  .** checksum of 
287d0 61 6c 6c 20 65 6e 74 72 69 65 73 20 74 68 61 74  all entries that
287e0 20 77 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61   would be genera
287f0 74 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e  ted by the token
28800 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
28810 20 74 68 65 20 66 69 6e 61 6c 20 35 20 61 72 67   the final 5 arg
28820 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73  uments..*/.u64 s
28830 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
28840 6b 73 75 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66  ksum(.  Fts5Conf
28850 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20  ig *pConfig,    
28860 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
28870 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20  guration object 
28880 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  */.  i64 iRowid,
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 20 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74       /* Document
288b0 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e   term appears in
288c0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
288f0 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
28900 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
28930 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e   term appears in
28940 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28950 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
28960 72 6d 20 20 20 20 2f 2a 20 54 65 72 6d 20 61 74  rm    /* Term at
28970 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36   iPos */.){.  u6
28980 34 20 72 65 74 20 3d 20 30 3b 20 20 20 20 20 20  4 ret = 0;      
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
289a0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
289b0 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20  .  int iIdx;    
289c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289d0 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74     /* For iterat
289e0 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ing through inde
289f0 78 65 73 20 2a 2f 0a 0a 20 20 72 65 74 20 3d 20  xes */..  ret = 
28a00 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  fts5IndexEntryCk
28a10 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c  sum(iRowid, iCol
28a20 2c 20 69 50 6f 73 2c 20 30 2c 20 70 54 65 72 6d  , iPos, 0, pTerm
28a30 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 66 6f 72  , nTerm);..  for
28a40 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 70 43  (iIdx=0; iIdx<pC
28a50 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
28a60 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  iIdx++){.    int
28a70 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e 64   nByte = fts5Ind
28a80 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c  exCharlenToBytel
28a90 65 6e 28 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  en(pTerm, nTerm,
28aa0 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69   pConfig->aPrefi
28ab0 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66  x[iIdx]);.    if
28ac0 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
28ad0 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64 65   ret ^= fts5Inde
28ae0 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77  xEntryCksum(iRow
28af0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
28b00 69 49 64 78 2b 31 2c 20 70 54 65 72 6d 2c 20 6e  iIdx+1, pTerm, n
28b10 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Byte);.    }.  }
28b20 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ..  return ret;.
28b30 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
28b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
28b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28bc0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f  ********.** Belo
28bd0 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  w this point is 
28be0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
28bf0 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64  on of the fts5_d
28c00 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a  ecode() scalar.*
28c10 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e  * function only.
28c20 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  .*/../*.** Decod
28c30 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61  e a segment-data
28c40 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20   rowid from the 
28c50 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68  %_data table. Th
28c60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
28c70 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f  * the opposite o
28c80 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47  f macro FTS5_SEG
28c90 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f  MENT_ROWID()..*/
28ca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
28cb0 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20  5DecodeRowid(.  
28cc0 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20  i64 iRowid,     
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f  /* Rowid from %_
28cf0 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
28d00 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20  int *piSegid,   
28d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20  /* OUT: Segment 
28d30 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44  id */.  int *pbD
28d40 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  lidx,           
28d50 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
28d60 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20  Dlidx flag */.  
28d70 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20  int *piHeight,  
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a  /* OUT: Height *
28da0 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20  /.  int *piPgno 
28db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28dc0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65      /* OUT: Page
28dd0 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
28de0 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28  *piPgno = (int)(
28df0 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
28e00 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50  1 << FTS5_DATA_P
28e10 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  AGE_B) - 1));.  
28e20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
28e30 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20  DATA_PAGE_B;..  
28e40 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74  *piHeight = (int
28e50 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
28e60 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
28e70 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29  _HEIGHT_B) - 1))
28e80 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
28e90 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
28ea0 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d  B;..  *pbDlidx =
28eb0 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
28ec0 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69  0x0001);.  iRowi
28ed0 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
28ee0 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67  DLI_B;..  *piSeg
28ef0 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  id = (int)(iRowi
28f00 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
28f10 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20  FTS5_DATA_ID_B) 
28f20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  - 1));.}..static
28f30 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52   void fts5DebugR
28f40 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46  owid(int *pRc, F
28f50 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
28f60 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e   i64 iKey){.  in
28f70 74 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  t iSegid, iHeigh
28f80 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78  t, iPgno, bDlidx
28f90 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
28fa0 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20   compenents */. 
28fb0 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
28fc0 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20  (iKey, &iSegid, 
28fd0 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68  &bDlidx, &iHeigh
28fe0 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69  t, &iPgno);..  i
28ff0 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a  f( iSegid==0 ){.
29000 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54      if( iKey==FT
29010 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
29020 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
29030 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
29040 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
29050 75 66 2c 20 22 28 61 76 65 72 61 67 65 73 29 20  uf, "(averages) 
29060 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
29070 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
29080 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
29090 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28  tf(pRc, pBuf, "(
290a0 73 74 72 75 63 74 75 72 65 29 22 29 3b 0a 20 20  structure)");.  
290b0 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a    }.  }.  else{.
290c0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
290d0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
290e0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28 25  f(pRc, pBuf, "(%
290f0 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70  ssegid=%d h=%d p
29100 67 6e 6f 3d 25 64 29 22 2c 0a 20 20 20 20 20 20  gno=%d)",.      
29110 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64    bDlidx ? "dlid
29120 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64  x " : "", iSegid
29130 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f  , iHeight, iPgno
29140 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  .    );.  }.}..s
29150 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
29160 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a 20  ebugStructure(. 
29170 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f   /* IN/OUT: erro
291a0 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
291b0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20  Buffer *pBuf,.  
291c0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
291d0 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  .){.  int iLvl, 
291e0 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
291f0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65        /* Iterate
29200 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c   through levels,
29210 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20   segments */..  
29220 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
29230 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  <p->nLevel; iLvl
29240 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  ++){.    Fts5Str
29250 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
29260 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69  l = &p->aLevel[i
29270 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  Lvl];.    sqlite
29280 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
29290 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
292a0 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c  f, .        " {l
292b0 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 22  vl=%d nMerge=%d"
292c0 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d  , iLvl, pLvl->nM
292d0 65 72 67 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  erge.    );.    
292e0 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
292f0 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65  <pLvl->nSeg; iSe
29300 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  g++){.      Fts5
29310 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
29320 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
29330 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
29340 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
29350 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
29360 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20  pRc, pBuf, .    
29370 20 20 20 20 20 20 22 20 7b 69 64 3d 25 64 20 68        " {id=%d h
29380 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25  =%d leaves=%d..%
29390 64 7d 22 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  d}", pSeg->iSegi
293a0 64 2c 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  d, pSeg->nHeight
293b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  , .          pSe
293c0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70 53  g->pgnoFirst, pS
293d0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20  eg->pgnoLast.   
293e0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
293f0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
29400 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
29410 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20  c, pBuf, "}");. 
29420 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
29430 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
29440 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
29450 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a  bugging aid..**.
29460 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c  ** Arguments pBl
29470 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e  ob/nBlob contain
29480 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46 74   a serialized Ft
29490 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
294a0 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ct. This.** func
294b0 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68  tion appends a h
294c0 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65  uman-readable re
294d0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
294e0 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a  the same object.
294f0 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ** to the buffer
29500 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
29510 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
29520 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29530 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
29540 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ure(.  int *pRc,
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29560 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
29570 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : error code */.
29580 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
29590 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  uf,.  const u8 *
295a0 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62  pBlob, int nBlob
295b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295d0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
295e0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53 74  code */.  Fts5St
295f0 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b 20  ructure *p = 0; 
29600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63            /* Dec
29610 6f 64 65 64 20 73 74 72 75 63 74 75 72 65 20 6f  oded structure o
29620 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d  bject */..  rc =
29630 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
29640 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f  code(pBlob, nBlo
29650 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66 28  b, 0, &p);.  if(
29660 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29670 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  {.    *pRc = rc;
29680 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
29690 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72  ..  fts5DebugStr
296a0 75 63 74 75 72 65 28 70 52 63 2c 20 70 42 75 66  ucture(pRc, pBuf
296b0 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  , p);.  fts5Stru
296c0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 29 3b  ctureRelease(p);
296d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  .}../*.** Buffer
296e0 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65   (a/n) is assume
296f0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c  d to contain a l
29700 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65  ist of serialize
29710 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a  d varints. Read.
29720 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20 61  ** each varint a
29730 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20 73 74  nd append its st
29740 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
29750 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42  ion to buffer pB
29760 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66  uf. Return.** af
29770 74 65 72 20 65 69 74 68 65 72 20 74 68 65 20 69  ter either the i
29780 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20 65  nput buffer is e
29790 78 68 61 75 73 74 65 64 20 6f 72 20 61 20 30 20  xhausted or a 0 
297a0 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a  value is read..*
297b0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
297c0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
297d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
297e0 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
297f0 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74   buffer..*/.stat
29800 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64  ic int fts5Decod
29810 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52  ePoslist(int *pR
29820 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
29830 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  Buf, const u8 *a
29840 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
29850 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  iOff = 0;.  whil
29860 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
29870 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69   int iVal;.    i
29880 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
29890 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
298a0 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   iVal);.    sqli
298b0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
298c0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
298d0 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c  Buf, " %d", iVal
298e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
298f0 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
29900 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66  he start of buff
29910 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e  er (a/n) contain
29920 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
29930 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f   doclist. The do
29940 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20  clist.** may or 
29950 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77  may not finish w
29960 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
29970 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
29980 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a  appends a text.*
29990 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  * representation
299a0 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20   of the part of 
299b0 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74  the doclist that
299c0 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62   is present to b
299d0 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a  uffer.** pBuf. .
299e0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
299f0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
29a00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
29a10 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
29a20 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
29a30 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
29a40 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70  deDoclist(int *p
29a50 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
29a60 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
29a70 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34  a, int n){.  i64
29a80 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74 20 69   iDocid;.  int i
29a90 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 4f 66 66  Off = 0;..  iOff
29aa0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72   = sqlite3GetVar
29ab0 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
29ac0 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20 20  64*)&iDocid);.  
29ad0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
29ae0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
29af0 63 2c 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64  c, pBuf, " rowid
29b00 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b  =%lld", iDocid);
29b10 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e  .  while( iOff<n
29b20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   ){.    int nPos
29b30 3b 0a 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79  ;.    int bDummy
29b40 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
29b50 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
29b60 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73  (&a[iOff], &nPos
29b70 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
29b80 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
29b90 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70  dePoslist(pRc, p
29ba0 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d  Buf, &a[iOff], M
29bb0 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29  IN(n-iOff, nPos)
29bc0 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c  );.    if( iOff<
29bd0 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  n ){.      i64 i
29be0 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66  Delta;.      iOf
29bf0 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  f += sqlite3GetV
29c00 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
29c10 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
29c20 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61        if( iDelta
29c30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 4f 66  ==0 ) return iOf
29c40 66 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20  f;.      iDocid 
29c50 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
29c60 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
29c70 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
29c80 52 63 2c 20 70 42 75 66 2c 20 22 20 72 6f 77 69  Rc, pBuf, " rowi
29c90 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29  d=%lld", iDocid)
29ca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
29cb0 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f  eturn iOff;.}../
29cc0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
29cd0 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d  ntation of user-
29ce0 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
29cf0 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63  unction fts5_dec
29d00 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
29d10 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
29d20 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
29d30 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
29d40 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x,          /* F
29d50 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
29d60 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  text */.  int nA
29d70 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
29d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29d90 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77  ber of args (alw
29da0 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69  ays 2) */.  sqli
29db0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
29dc0 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  l           /* F
29dd0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
29de0 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52  s */.){.  i64 iR
29df0 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
29e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
29e10 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65  id for record be
29e20 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20  ing decoded */. 
29e30 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69   int iSegid,iHei
29e40 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78  ght,iPgno,bDlidx
29e50 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e  ;/* Rowid compon
29e60 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
29e70 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e  u8 *aBlob; int n
29e80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63  ;         /* Rec
29e90 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f  ord to decode */
29ea0 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20  .  u8 *a = 0;.  
29eb0 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20  Fts5Buffer s;   
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ed0 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74  /* Build up text
29ee0 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20   to return here 
29ef0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
29f00 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
29f10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29f20 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ode */.  int nSp
29f30 61 63 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ace = 0;..  asse
29f40 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20  rt( nArg==2 );. 
29f50 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
29f60 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
29f70 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73  ));.  iRowid = s
29f80 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
29f90 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  64(apVal[0]);.  
29fa0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
29fb0 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d  e_bytes(apVal[1]
29fc0 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c  );.  aBlob = sql
29fd0 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
29fe0 61 70 56 61 6c 5b 31 5d 29 3b 0a 0a 20 20 6e 53  apVal[1]);..  nS
29ff0 70 61 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f  pace = n + FTS5_
2a000 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e  DATA_ZERO_PADDIN
2a010 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71  G;.  a = (u8*)sq
2a020 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
2a030 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29  ero(&rc, nSpace)
2a040 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67  ;.  if( a==0 ) g
2a050 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
2a060 20 20 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f    memcpy(a, aBlo
2a070 62 2c 20 6e 29 3b 0a 20 20 66 74 73 35 44 65 63  b, n);.  fts5Dec
2a080 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c  odeRowid(iRowid,
2a090 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64   &iSegid, &bDlid
2a0a0 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50  x, &iHeight, &iP
2a0b0 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62  gno);..  fts5Deb
2a0c0 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c  ugRowid(&rc, &s,
2a0d0 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20   iRowid);.  if( 
2a0e0 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74  bDlidx ){.    Ft
2a0f0 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20  s5Data dlidx;.  
2a100 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c    Fts5DlidxLvl l
2a110 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70  vl;..    dlidx.p
2a120 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e   = a;.    dlidx.
2a130 6e 20 3d 20 6e 3b 0a 20 20 20 20 64 6c 69 64 78  n = n;.    dlidx
2a140 2e 6e 52 65 66 20 3d 20 32 3b 0a 0a 20 20 20 20  .nRef = 2;..    
2a150 6d 65 6d 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20  memset(&lvl, 0, 
2a160 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
2a170 4c 76 6c 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70  Lvl));.    lvl.p
2a180 44 61 74 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20  Data = &dlidx;. 
2a190 20 20 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f     lvl.iLeafPgno
2a1a0 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66   = iPgno;..    f
2a1b0 6f 72 28 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  or(fts5DlidxLvlN
2a1c0 65 78 74 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62  ext(&lvl); lvl.b
2a1d0 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64  Eof==0; fts5Dlid
2a1e0 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b  xLvlNext(&lvl)){
2a1f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2a200 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2a210 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20  intf(&rc, &s, . 
2a220 20 20 20 20 20 20 20 20 20 22 20 25 64 28 25 6c           " %d(%l
2a230 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50  ld)", lvl.iLeafP
2a240 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a  gno, lvl.iRowid.
2a250 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2a260 20 7d 65 6c 73 65 20 69 66 28 20 69 53 65 67 69   }else if( iSegi
2a270 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d==0 ){.    if( 
2a280 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45  iRowid==FTS5_AVE
2a290 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20  RAGES_ROWID ){. 
2a2a0 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a       /* todo */.
2a2b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a2c0 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63   fts5DecodeStruc
2a2d0 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c  ture(&rc, &s, a,
2a2e0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   n);.    }.  }el
2a2f0 73 65 7b 0a 0a 20 20 20 20 46 74 73 35 42 75 66  se{..    Fts5Buf
2a300 66 65 72 20 74 65 72 6d 3b 0a 20 20 20 20 6d 65  fer term;.    me
2a310 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
2a320 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
2a330 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65  ));..    if( iHe
2a340 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
2a350 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20   int iTermOff = 
2a360 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f  0;.      int iRo
2a370 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  widOff = 0;.    
2a380 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
2a390 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
2a3a0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 3d 34  ..      if( n>=4
2a3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52 6f 77   ){.        iRow
2a3c0 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  idOff = fts5GetU
2a3d0 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20  16(&a[0]);.     
2a3e0 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 66 74     iTermOff = ft
2a3f0 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b  s5GetU16(&a[2]);
2a400 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a410 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2a420 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
2a430 26 73 2c 20 38 2c 20 28 63 6f 6e 73 74 20 75 38  &s, 8, (const u8
2a440 2a 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20  *)"corrupt");.  
2a450 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64        goto decod
2a460 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  e_out;.      }..
2a470 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
2a480 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Off ){.        i
2a490 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b  Off = iRowidOff;
2a4a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2a4b0 20 69 54 65 72 6d 4f 66 66 20 29 7b 0a 20 20 20   iTermOff ){.   
2a4c0 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72       iOff = iTer
2a4d0 6d 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mOff;.      }els
2a4e0 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
2a4f0 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
2a500 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73     fts5DecodePos
2a510 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
2a520 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20  [4], iOff-4);.. 
2a530 20 20 20 20 20 61 73 73 65 72 74 28 20 69 52 6f       assert( iRo
2a540 77 69 64 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66  widOff==0 || iOf
2a550 66 3d 3d 69 52 6f 77 69 64 4f 66 66 20 29 3b 0a  f==iRowidOff );.
2a560 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
2a570 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Off ){.        i
2a580 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
2a590 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
2a5a0 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f  , &a[iOff], n-iO
2a5b0 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ff);.      }..  
2a5c0 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
2a5d0 6d 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d  mOff==0 || iOff=
2a5e0 3d 69 54 65 72 6d 4f 66 66 20 29 3b 0a 20 20 20  =iTermOff );.   
2a5f0 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e     while( iOff<n
2a600 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2a610 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69  nByte;.        i
2a620 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2a630 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
2a640 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
2a650 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65 65 70 3b 0a   term.n= nKeep;.
2a660 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
2a670 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63  erAppendBlob(&rc
2a680 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20  , &term, nByte, 
2a690 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  &a[iOff]);.     
2a6a0 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65     iOff += nByte
2a6b0 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
2a6c0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2a6d0 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ndPrintf(.      
2a6e0 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22        &rc, &s, "
2a6f0 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72   term=%.*s", ter
2a700 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  m.n, (const char
2a710 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 20  *)term.p.       
2a720 20 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   );.        iOff
2a730 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f   += fts5DecodeDo
2a740 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
2a750 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29  a[iOff], n-iOff)
2a760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f  ;.        if( iO
2a770 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
2a780 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2a790 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
2a7a0 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
2a7b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2a7c0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
2a7d0 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 20 20 7d  ee(&term);.    }
2a7e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35  else{.      Fts5
2a7f0 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20  NodeIter ss;.   
2a800 20 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65 49     for(fts5NodeI
2a810 74 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 73  terInit(a, n, &s
2a820 73 29 3b 20 73 73 2e 61 44 61 74 61 3b 20 66 74  s); ss.aData; ft
2a830 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
2a840 72 63 2c 20 26 73 73 29 29 7b 0a 20 20 20 20 20  rc, &ss)){.     
2a850 20 20 20 69 66 28 20 73 73 2e 74 65 72 6d 2e 6e     if( ss.term.n
2a860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2a870 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2a880 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
2a890 72 63 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d 25  rc, &s, " left=%
2a8a0 64 22 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b 0a  d", ss.iChild);.
2a8b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2a8c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2a8d0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2a8e0 50 72 69 6e 74 66 28 26 72 63 2c 26 73 2c 20 22  Printf(&rc,&s, "
2a8f0 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20 20   \"%.*s\"", .   
2a900 20 20 20 20 20 20 20 20 20 20 20 73 73 2e 74 65             ss.te
2a910 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 0a  rm.n, ss.term.p.
2a920 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
2a930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2a940 66 28 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b 0a  f( ss.nEmpty ){.
2a950 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a960 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2a970 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
2a980 20 22 20 65 6d 70 74 79 3d 25 64 25 73 22 2c 20   " empty=%d%s", 
2a990 73 73 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20 20  ss.nEmpty,.     
2a9a0 20 20 20 20 20 20 20 20 20 73 73 2e 62 44 6c 69           ss.bDli
2a9b0 64 78 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20 20  dx ? "*" : "".  
2a9c0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2a9d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a9e0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46     fts5NodeIterF
2a9f0 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 7d 0a  ree(&ss);.    }.
2aa00 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f    }.  . decode_o
2aa10 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
2aa20 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  ee(a);.  if( rc=
2aa30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2aa40 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2aa50 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e  _text(pCtx, (con
2aa60 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e  st char*)s.p, s.
2aa70 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
2aa80 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ENT);.  }else{. 
2aa90 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2aaa0 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74  t_error_code(pCt
2aab0 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74  x, rc);.  }.  ft
2aac0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29  s5BufferFree(&s)
2aad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
2aae0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2aaf0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63   user-defined sc
2ab00 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74  alar function ft
2ab10 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73  s5_rowid()..*/.s
2ab20 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 52  tatic void fts5R
2ab30 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20  owidFunction(.  
2ab40 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2ab50 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
2ab60 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  /* Function call
2ab70 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
2ab80 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aba0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   Number of args 
2abb0 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20  (always 2) */.  
2abc0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2abd0 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
2abe0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75  /* Function argu
2abf0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ments */.){.  co
2ac00 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a  nst char *zArg;.
2ac10 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b    if( nArg==0 ){
2ac20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2ac30 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
2ac40 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35  "should be: fts5
2ac50 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20  _rowid(subject, 
2ac60 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d  ....)", -1);.  }
2ac70 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d  else{.    zArg =
2ac80 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2ac90 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
2aca0 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20  (apVal[0]);.    
2acb0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
2acc0 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65  tricmp(zArg, "se
2acd0 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  gment") ){.     
2ace0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
2acf0 20 20 20 69 6e 74 20 73 65 67 69 64 2c 20 68 65     int segid, he
2ad00 69 67 68 74 2c 20 70 67 6e 6f 3b 0a 20 20 20 20  ight, pgno;.    
2ad10 20 20 69 66 28 20 6e 41 72 67 21 3d 34 20 29 7b    if( nArg!=4 ){
2ad20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ad30 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
2ad40 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  tx, .           
2ad50 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73   "should be: fts
2ad60 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74  5_rowid('segment
2ad70 27 2c 20 73 65 67 69 64 2c 20 68 65 69 67 68 74  ', segid, height
2ad80 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20  , pgno))", -1.  
2ad90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2ada0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
2adb0 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  gid = sqlite3_va
2adc0 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d  lue_int(apVal[1]
2add0 29 3b 0a 20 20 20 20 20 20 20 20 68 65 69 67 68  );.        heigh
2ade0 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
2adf0 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b  e_int(apVal[2]);
2ae00 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  .        pgno = 
2ae10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2ae20 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 20 20 20  t(apVal[3]);.   
2ae30 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46 54       iRowid = FT
2ae40 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2ae50 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20  (segid, height, 
2ae60 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  pgno);.        s
2ae70 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
2ae80 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69 64  t64(pCtx, iRowid
2ae90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2aea0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 71 6c  else {.      sql
2aeb0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2aec0 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
2aed0 20 22 66 69 72 73 74 20 61 72 67 20 74 6f 20 66   "first arg to f
2aee0 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74  ts5_rowid() must
2aef0 20 62 65 20 27 73 65 67 6d 65 6e 74 27 20 22 0a   be 'segment' ".
2af00 20 20 20 20 20 20 20 20 22 6f 72 20 27 73 74 61          "or 'sta
2af10 72 74 2d 6f 66 2d 69 6e 64 65 78 27 22 0a 20 20  rt-of-index'".  
2af20 20 20 20 20 20 20 2c 20 2d 31 0a 20 20 20 20 20        , -1.     
2af30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
2af40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
2af50 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
2af60 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65   registering the
2af70 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77 69 74   FTS5 module wit
2af80 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  h database.** co
2af90 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49 74 20  nnection db. It 
2afa0 72 65 67 69 73 74 65 72 73 20 73 65 76 65 72 61  registers severa
2afb0 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  l user-defined s
2afc0 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20  calar functions 
2afd0 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46  useful.** with F
2afe0 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  TS5..**.** If su
2aff0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
2b000 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2b010 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2b020 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a  urs, some other.
2b030 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
2b040 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2b050 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74   instead..*/.int
2b060 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2b070 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64  xInit(sqlite3 *d
2b080 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  b){.  int rc = s
2b090 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
2b0a0 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  nction(.      db
2b0b0 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 22 2c  , "fts5_decode",
2b0c0 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
2b0d0 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75   0, fts5DecodeFu
2b0e0 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29  nction, 0, 0.  )
2b0f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2b100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2b110 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
2b120 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
2b130 20 20 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77     db, "fts5_row
2b140 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  id", -1, SQLITE_
2b150 55 54 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77  UTF8, 0, fts5Row
2b160 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
2b170 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65  .    );.  }.  re
2b180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
2b190 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
2b1a0 42 4c 45 5f 46 54 53 35 20 2a 2f 0a              BLE_FTS5 */.