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

Artifact 438b245e9e44be3cfa848c71351a4e769b75876a:


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 2f 2a 0a 2a  ght, pgno)../*.*
2780: 2a 20 4d 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e  * Maximum segmen
2790: 74 73 20 70 65 72 6d 69 74 74 65 64 20 69 6e 20  ts permitted in 
27a0: 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a  a single index .
27b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
27c0: 4d 41 58 5f 53 45 47 4d 45 4e 54 20 32 30 30 30  MAX_SEGMENT 2000
27d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
27e0: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
27f0: 33 46 74 73 35 43 6f 72 72 75 70 74 28 29 20 7b  3Fts5Corrupt() {
2800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2810: 4f 52 52 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23  ORRUPT_VTAB; }.#
2820: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  endif.../*.** Ea
2830: 63 68 20 74 69 6d 65 20 61 20 62 6c 6f 62 20 69  ch time a blob i
2840: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
2850: 25 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 69 74  %_data table, it
2860: 20 69 73 20 70 61 64 64 65 64 20 77 69 74 68 20   is padded with 
2870: 74 68 69 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72  this.** many zer
2880: 6f 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 61  o bytes. This ma
2890: 6b 65 73 20 69 74 20 65 61 73 69 65 72 20 74 6f  kes it easier to
28a0: 20 64 65 63 6f 64 65 20 74 68 65 20 76 61 72 69   decode the vari
28b0: 6f 75 73 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  ous record forma
28c0: 74 73 0a 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76  ts.** without ov
28d0: 65 72 72 65 61 64 69 6e 67 20 69 66 20 74 68 65  erreading if the
28e0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 63 6f 72   records are cor
28f0: 72 75 70 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rupt..*/.#define
2900: 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
2910: 50 41 44 44 49 4e 47 20 38 0a 0a 74 79 70 65 64  PADDING 8..typed
2920: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 42 74  ef struct Fts5Bt
2930: 72 65 65 49 74 65 72 20 46 74 73 35 42 74 72 65  reeIter Fts5Btre
2940: 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  eIter;.typedef s
2950: 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65 49  truct Fts5BtreeI
2960: 74 65 72 4c 65 76 65 6c 20 46 74 73 35 42 74 72  terLevel Fts5Btr
2970: 65 65 49 74 65 72 4c 65 76 65 6c 3b 0a 74 79 70  eeIterLevel;.typ
2980: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2990: 44 61 74 61 20 46 74 73 35 44 61 74 61 3b 0a 74  Data Fts5Data;.t
29a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
29b0: 73 35 44 6c 69 64 78 49 74 65 72 20 46 74 73 35  s5DlidxIter Fts5
29c0: 44 6c 69 64 78 49 74 65 72 3b 0a 74 79 70 65 64  DlidxIter;.typed
29d0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44 6c  ef struct Fts5Dl
29e0: 69 64 78 4c 76 6c 20 46 74 73 35 44 6c 69 64 78  idxLvl Fts5Dlidx
29f0: 4c 76 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72  Lvl;.typedef str
2a00: 75 63 74 20 46 74 73 35 44 6c 69 64 78 57 72 69  uct Fts5DlidxWri
2a10: 74 65 72 20 46 74 73 35 44 6c 69 64 78 57 72 69  ter Fts5DlidxWri
2a20: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2a30: 75 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67  uct Fts5MultiSeg
2a40: 49 74 65 72 20 46 74 73 35 4d 75 6c 74 69 53 65  Iter Fts5MultiSe
2a50: 67 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  gIter;.typedef s
2a60: 74 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74  truct Fts5NodeIt
2a70: 65 72 20 46 74 73 35 4e 6f 64 65 49 74 65 72 3b  er Fts5NodeIter;
2a80: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2a90: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 46  Fts5PageWriter F
2aa0: 74 73 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74  ts5PageWriter;.t
2ab0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2ac0: 73 35 53 65 67 49 74 65 72 20 46 74 73 35 53 65  s5SegIter Fts5Se
2ad0: 67 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  gIter;.typedef s
2ae0: 74 72 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73  truct Fts5Doclis
2af0: 74 49 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73  tIter Fts5Doclis
2b00: 74 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  tIter;.typedef s
2b10: 74 72 75 63 74 20 46 74 73 35 53 65 67 57 72 69  truct Fts5SegWri
2b20: 74 65 72 20 46 74 73 35 53 65 67 57 72 69 74 65  ter Fts5SegWrite
2b30: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2b40: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  t Fts5Structure 
2b50: 46 74 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74  Fts5Structure;.t
2b60: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2b70: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2b80: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
2b90: 76 65 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72  vel;.typedef str
2ba0: 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72  uct Fts5Structur
2bb0: 65 53 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72  eSegment Fts5Str
2bc0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a  uctureSegment;..
2bd0: 73 74 72 75 63 74 20 46 74 73 35 44 61 74 61 20  struct Fts5Data 
2be0: 7b 0a 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20  {.  u8 *p;      
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c10: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
2c20: 69 6e 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ing record */.  
2c30: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72  /* Size of recor
2c60: 64 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b  d in bytes */.};
2c70: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 62 6a 65  ../*.** One obje
2c80: 63 74 20 70 65 72 20 25 5f 64 61 74 61 20 74 61  ct per %_data ta
2c90: 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ble..*/.struct F
2ca0: 74 73 35 49 6e 64 65 78 20 7b 0a 20 20 46 74 73  ts5Index {.  Fts
2cb0: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
2cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2cd0: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  Virtual table co
2ce0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20  nfiguration */. 
2cf0: 20 63 68 61 72 20 2a 7a 44 61 74 61 54 62 6c 3b   char *zDataTbl;
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 25 5f 64 61   /* Name of %_da
2d20: 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ta table */.  in
2d30: 74 20 6e 57 6f 72 6b 55 6e 69 74 3b 20 20 20 20  t nWorkUnit;    
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d50: 20 4c 65 61 66 20 70 61 67 65 73 20 69 6e 20 61   Leaf pages in a
2d60: 20 22 75 6e 69 74 22 20 6f 66 20 77 6f 72 6b 20   "unit" of work 
2d70: 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 56 61  */..  /*.  ** Va
2d80: 72 69 61 62 6c 65 73 20 72 65 6c 61 74 65 64 20  riables related 
2d90: 74 6f 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  to the accumulat
2da0: 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 73 20 61 6e  ion of tokens an
2db0: 64 20 64 6f 63 6c 69 73 74 73 20 77 69 74 68 69  d doclists withi
2dc0: 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 2d 6d 65  n the.  ** in-me
2dd0: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
2de0: 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
2df0: 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b   flushed to disk
2e00: 2e 0a 20 20 2a 2f 0a 20 20 46 74 73 35 48 61 73  ..  */.  Fts5Has
2e10: 68 20 2a 70 48 61 73 68 3b 20 20 20 20 20 20 20  h *pHash;       
2e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
2e30: 20 74 61 62 6c 65 20 66 6f 72 20 69 6e 2d 6d 65   table for in-me
2e40: 6d 6f 72 79 20 64 61 74 61 20 2a 2f 0a 20 20 69  mory data */.  i
2e50: 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  nt nMaxPendingDa
2e60: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ta;            /
2e70: 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67 20 64 61  * Max pending da
2e80: 74 61 20 62 65 66 6f 72 65 20 66 6c 75 73 68 20  ta before flush 
2e90: 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74  to disk */.  int
2ea0: 20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b 20 20   nPendingData;  
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ec0: 43 75 72 72 65 6e 74 20 62 79 74 65 73 20 6f 66  Current bytes of
2ed0: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f   pending data */
2ee0: 0a 20 20 69 36 34 20 69 57 72 69 74 65 52 6f 77  .  i64 iWriteRow
2ef0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2f00: 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
2f10: 63 75 72 72 65 6e 74 20 64 6f 63 20 62 65 69 6e  current doc bein
2f20: 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 46  g written */.  F
2f30: 74 73 35 42 75 66 66 65 72 20 73 63 72 61 74 63  ts5Buffer scratc
2f40: 68 3b 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73  h;..  /* Error s
2f50: 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  tate. */.  int r
2f60: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2f80: 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  rrent error code
2f90: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   */..  /* State 
2fa0: 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  used by the fts5
2fb0: 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69  DataXXX() functi
2fc0: 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2fd0: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b  3_blob *pReader;
2fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20            /* RO 
2ff0: 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f  incr-blob open o
3000: 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  n %_data table *
3010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
3020: 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
3030: 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e      /* "INSERT .
3040: 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53  .. %_data VALUES
3050: 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  (?,?)" */.  sqli
3060: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
3070: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22  er;         /* "
3080: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
3090: 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44  ta ... id>=? AND
30a0: 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 69 6e 74   id<=?" */.  int
30b0: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30d0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
30e0: 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d  blocks read */.}
30f0: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f  ;..struct Fts5Do
3100: 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75 38  clistIter {.  u8
3110: 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *a;.  int n;.  
3120: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4f 75 74  int i;..  /* Out
3130: 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20 61  put variables. a
3140: 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74 20 45 4f  Poslist==0 at EO
3150: 46 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  F */.  i64 iRowi
3160: 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73 6c 69 73  d;.  u8 *aPoslis
3170: 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73  t;.  int nPoslis
3180: 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  t;.};../*.** Eac
3190: 68 20 69 74 65 72 61 74 6f 72 20 75 73 65 64 20  h iterator used 
31a0: 62 79 20 65 78 74 65 72 6e 61 6c 20 6d 6f 64 75  by external modu
31b0: 6c 65 73 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  les is an instan
31c0: 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65 2e  ce of this type.
31d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 49  .*/.struct Fts5I
31e0: 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 46 74 73  ndexIter {.  Fts
31f0: 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a  5Index *pIndex;.
3200: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
3210: 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
3220: 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d  MultiSegIter *pM
3230: 75 6c 74 69 3b 0a 20 20 46 74 73 35 42 75 66 66  ulti;.  Fts5Buff
3240: 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20  er poslist;     
3250: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
3260: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72  r containing cur
3270: 72 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  rent poslist */.
3280: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f  };../*.** The co
3290: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 22 73  ntents of the "s
32a0: 74 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64  tructure" record
32b0: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
32c0: 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a  are represented.
32d0: 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46 74 73 35  ** using an Fts5
32e0: 53 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  Structure record
32f0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57 68 69 63   in memory. Whic
3300: 68 20 75 73 65 73 20 69 6e 73 74 61 6e 63 65 73  h uses instances
3310: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 74 68 65   of the .** othe
3320: 72 20 46 74 73 35 53 74 72 75 63 74 75 72 65 58  r Fts5StructureX
3330: 58 58 20 74 79 70 65 73 20 61 73 20 63 6f 6d 70  XX types as comp
3340: 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63  onents..*/.struc
3350: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
3360: 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20 69  egment {.  int i
3370: 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  Segid;          
3380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
3390: 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
33a0: 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20  t nHeight;      
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33c0: 20 48 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65   Height of segme
33d0: 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69  nt b-tree */.  i
33e0: 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20 20 20  nt pgnoFirst;   
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3400: 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70 61 67  * First leaf pag
3410: 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d  e number in segm
3420: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e  ent */.  int pgn
3430: 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  oLast;          
3440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
3450: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
3460: 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  r in segment */.
3470: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74  };.struct Fts5St
3480: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b 0a 20  ructureLevel {. 
3490: 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20 20 20   int nMerge;    
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
34c0: 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72 2d 6d  gments in incr-m
34d0: 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  erge */.  int nS
34e0: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
34f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3500: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  al number of seg
3510: 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 2a  ments on level *
3520: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
3530: 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67 3b 20  eSegment *aSeg; 
3540: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
3550: 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67 5b 30  segments. aSeg[0
3560: 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a  ] is oldest. */.
3570: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74  };.struct Fts5St
3580: 72 75 63 74 75 72 65 20 7b 0a 20 20 75 36 34 20  ructure {.  u64 
3590: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20 20  nWriteCounter;  
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
35b0: 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69 74  otal leaves writ
35c0: 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20 2a  ten to level 0 *
35d0: 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  /.  int nSegment
35e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35f0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65 67      /* Total seg
3600: 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73 74  ments in this st
3610: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
3620: 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20   nLevel;        
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3640: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  Number of levels
3650: 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20 2a   in this index *
3660: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
3670: 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 30 5d  eLevel aLevel[0]
3680: 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  ;   /* Array of 
3690: 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62 6a  nLevel level obj
36a0: 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ects */.};../*.*
36b0: 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74  * An object of t
36c0: 79 70 65 20 46 74 73 35 53 65 67 57 72 69 74 65  ype Fts5SegWrite
36d0: 72 20 69 73 20 75 73 65 64 20 74 6f 20 77 72 69  r is used to wri
36e0: 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e 0a  te to segments..
36f0: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 61  */.struct Fts5Pa
3700: 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74  geWriter {.  int
3710: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3730: 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
3740: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 46  this page */.  F
3750: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20  ts5Buffer buf;  
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3770: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3780: 69 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f  ing page data */
3790: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
37a0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
37b0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
37c0: 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73  taining previous
37d0: 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
37e0: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 44  .};.struct Fts5D
37f0: 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20 69  lidxWriter {.  i
3800: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3820: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3830: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3840: 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64 3b   int bPrevValid;
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72 65   /* True if iPre
3870: 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  v is valid */.  
3880: 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20 20  i64 iPrev;      
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69  /* Previous doci
38b0: 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  d value written 
38c0: 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74 73  to page */.  Fts
38d0: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38f0: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3900: 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  g page data */.}
3910: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67  ;.struct Fts5Seg
3920: 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 69  Writer {.  int i
3930: 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  Segid;          
3940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
3950: 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  gid to write to 
3960: 2a 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 72  */.  int nWriter
3970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3980: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3990: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 57 72  f entries in aWr
39a0: 69 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 50 61  iter */.  Fts5Pa
39b0: 67 65 57 72 69 74 65 72 20 2a 61 57 72 69 74 65  geWriter *aWrite
39c0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  r;        /* Arr
39d0: 61 79 20 6f 66 20 50 61 67 65 57 72 69 74 65 72  ay of PageWriter
39e0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 36   objects */.  i6
39f0: 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20 20  4 iPrevRowid;   
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a10: 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20   Previous docid 
3a20: 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72 65  written to curre
3a30: 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38 20  nt leaf */.  u8 
3a40: 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
3a50: 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  list;        /* 
3a60: 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77  True if next row
3a70: 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 64  id is first in d
3a80: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62  oclist */.  u8 b
3a90: 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
3aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
3ab0: 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69  rue if next rowi
3ac0: 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 70 61  d is first in pa
3ad0: 67 65 20 2a 2f 0a 20 20 75 38 20 62 46 69 72 73  ge */.  u8 bFirs
3ae0: 74 54 65 72 6d 49 6e 50 61 67 65 3b 20 20 20 20  tTermInPage;    
3af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3b00: 69 66 20 6e 65 78 74 20 74 65 72 6d 20 77 69 6c  if next term wil
3b10: 6c 20 62 65 20 66 69 72 73 74 20 69 6e 20 6c 65  l be first in le
3b20: 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  af */.  int nLea
3b30: 66 57 72 69 74 74 65 6e 3b 20 20 20 20 20 20 20  fWritten;       
3b40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3b50: 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
3b60: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
3b70: 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20   nEmpty;        
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b90: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74 69 67  Number of contig
3ba0: 75 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73 20 6e  uous term-less n
3bb0: 6f 64 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  odes */..  int n
3bc0: 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  Dlidx;          
3bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
3be0: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
3bf0: 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 2a  aDlidx[] array *
3c00: 2f 0a 20 20 46 74 73 35 44 6c 69 64 78 57 72 69  /.  Fts5DlidxWri
3c10: 74 65 72 20 2a 61 44 6c 69 64 78 3b 20 20 20 20  ter *aDlidx;    
3c20: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
3c30: 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
3c40: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
3c50: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
3c60: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
3c70: 68 20 74 68 65 20 6d 65 72 67 65 64 20 72 65 73  h the merged res
3c80: 75 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d  ults of one or m
3c90: 6f 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a  ore segments,.**
3ca0: 20 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74   visiting each t
3cb0: 65 72 6d 2f 64 6f 63 69 64 20 70 61 69 72 20 69  erm/docid pair i
3cc0: 6e 20 74 68 65 20 6d 65 72 67 65 64 20 64 61 74  n the merged dat
3cd0: 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73  a..**.** nSeg is
3ce0: 20 61 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20   always a power 
3cf0: 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
3d00: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
3d10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
3d20: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74   segments that t
3d30: 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65  his object is me
3d40: 72 67 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e  rging data from.
3d50: 20 42 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d   Both the aSeg[]
3d60: 20 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d   and.** aFirst[]
3d70: 20 61 72 72 61 79 73 20 61 72 65 20 73 69 7a 65   arrays are size
3d80: 64 20 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65  d at nSeg entrie
3d90: 73 2e 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72  s. The aSeg[] ar
3da0: 72 61 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a  ray is padded.**
3db0: 20 77 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a   with zeroed obj
3dc0: 65 63 74 73 20 2d 20 74 68 65 73 65 20 61 72 65  ects - these are
3dd0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74   handled as if t
3de0: 68 65 79 20 77 65 72 65 20 69 74 65 72 61 74 6f  hey were iterato
3df0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3e00: 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a  empty segments..
3e10: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
3e20: 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73  s of comparing s
3e30: 65 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20  egments aSeg[N] 
3e40: 61 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77  and aSeg[N+1], w
3e50: 68 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20  here N is an.** 
3e60: 65 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20  even number, is 
3e70: 73 74 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74  stored in aFirst
3e80: 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68  [(nSeg+N)/2]. Th
3e90: 65 20 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68  e "result" of th
3ea0: 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  e .** comparison
3eb0: 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74   in this context
3ec0: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
3ed0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68   the iterator th
3ee0: 61 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  at currently.** 
3ef0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d  points to the sm
3f00: 61 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64  aller term/rowid
3f10: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74   combination. It
3f20: 65 72 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61  erators at EOF a
3f30: 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  re.** considered
3f40: 20 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 74   to be greater t
3f50: 68 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74  han all other it
3f60: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61  erators..**.** a
3f70: 46 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e  First[1] contain
3f80: 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61  s the index in a
3f90: 53 65 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65  Seg[] of the ite
3fa0: 72 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  rator that point
3fb0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c  s to.** the smal
3fc0: 6c 65 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c  lest key overall
3fd0: 2e 20 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75  . aFirst[0] is u
3fe0: 6e 75 73 65 64 2e 20 0a 2a 2f 0a 0a 74 79 70 65  nused. .*/..type
3ff0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43  def struct Fts5C
4000: 52 65 73 75 6c 74 20 46 74 73 35 43 52 65 73 75  Result Fts5CResu
4010: 6c 74 3b 0a 73 74 72 75 63 74 20 46 74 73 35 43  lt;.struct Fts5C
4020: 52 65 73 75 6c 74 20 7b 0a 20 20 75 31 36 20 69  Result {.  u16 i
4030: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
4040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
4050: 65 67 5b 5d 20 69 6e 64 65 78 20 6f 66 20 66 69  eg[] index of fi
4060: 72 73 74 65 73 74 20 69 74 65 72 61 74 6f 72 20  rstest iterator 
4070: 2a 2f 0a 20 20 75 38 20 62 54 65 72 6d 45 71 3b  */.  u8 bTermEq;
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
40a0: 74 68 65 20 74 65 72 6d 73 20 61 72 65 20 65 71  the terms are eq
40b0: 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  ual */.};..struc
40c0: 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  t Fts5MultiSegIt
40d0: 65 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b  er {.  int nSeg;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4100: 66 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 2a  f aSeg[] array *
4110: 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20  /.  int bRev;   
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4130: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
4140: 74 65 72 61 74 65 20 69 6e 20 72 65 76 65 72 73  terate in revers
4150: 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74  e order */.  int
4160: 20 62 53 6b 69 70 45 6d 70 74 79 3b 20 20 20 20   bSkipEmpty;    
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4180: 54 72 75 65 20 74 6f 20 73 6b 69 70 20 64 65 6c  True to skip del
4190: 65 74 65 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a  eted entries */.
41a0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 61    Fts5SegIter *a
41b0: 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
41c0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65    /* Array of se
41d0: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  gment iterators 
41e0: 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74  */.  Fts5CResult
41f0: 20 2a 61 46 69 72 73 74 3b 20 20 20 20 20 20 20   *aFirst;       
4200: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4210: 6d 65 72 67 65 20 73 74 61 74 65 20 28 73 65 65  merge state (see
4220: 20 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f   above) */.};../
4230: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
4240: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
4250: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
4260: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
4270: 68 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a 20  h term/docid.** 
4280: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
4290: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
42a0: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
42b0: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
42c0: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
42d0: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
42e0: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
42f0: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
4300: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
4310: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
4320: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
4330: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
4340: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
4350: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
4360: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
4370: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
4380: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
4390: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
43a0: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
43b0: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
43c0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
43d0: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
43e0: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
43f0: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
4400: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
4410: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
4420: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
4430: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
4440: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
4450: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
4460: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
4470: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
4480: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
4490: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
44a0: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
44b0: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
44c0: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
44d0: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
44e0: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
44f0: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
4500: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
4510: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
4520: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
4530: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
4540: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
4550: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
4560: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
4570: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
4580: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
4590: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
45a0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
45b0: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
45c0: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
45d0: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
45e0: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
45f0: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
4600: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
4610: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
4620: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
4630: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
4640: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
4650: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
4660: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
4670: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
4680: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
4690: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
46a0: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
46b0: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
46c0: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
46d0: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
46e0: 65 20 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73  e through docids
46f0: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   in descending o
4700: 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20  rder instead of 
4710: 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75  the.**     defau
4720: 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  lt ascending ord
4730: 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64  er..**.** iRowid
4740: 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66  Offset/nRowidOff
4750: 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74  set/aRowidOffset
4760: 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61  :.**     These a
4770: 72 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46  re used if the F
4780: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
4790: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
47a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65  .**.**     For e
47b0: 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ach rowid on the
47c0: 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64   page correspond
47d0: 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
47e0: 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20  nt term, the.** 
47f0: 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
4800: 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  g aRowidOffset[]
4810: 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f   entry is set to
4820: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4830: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   of the.**     s
4840: 74 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73  tart of the "pos
4850: 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22  ition-list-size"
4860: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
4870: 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 72 75 63  e page..*/.struc
4880: 74 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a  t Fts5SegIter {.
4890: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
48a0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
48b0: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
48c0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
48d0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20  */.  int flags; 
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
4900: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c  configuration fl
4910: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  ags */.  int iLe
4920: 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  afPgno;         
4930: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4940: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
4950: 6d 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61  mber */.  Fts5Da
4960: 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
4970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4980: 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a  rent leaf data *
4990: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e  /.  Fts5Data *pN
49a0: 65 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20  extLeaf;        
49b0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
49c0: 20 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a   (iLeafPgno+1) *
49d0: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66  /.  int iLeafOff
49e0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
49f0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
4a00: 65 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e  et within curren
4a10: 74 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20  t leaf */..  /* 
4a20: 54 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66  The page and off
4a30: 73 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74  set from which t
4a40: 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
4a50: 77 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66  was read. The of
4a60: 66 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68  fset .  ** is th
4a70: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
4a80: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74  first rowid in t
4a90: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
4aa0: 73 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54  st.  */.  int iT
4ab0: 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69  ermLeafPgno;.  i
4ac0: 6e 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  nt iTermLeafOffs
4ad0: 65 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  et;..  /* The fo
4ae0: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79  llowing are only
4af0: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
4b00: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4b10: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a  E flag is set. *
4b20: 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  /.  int iRowidOf
4b30: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
4b40: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65      /* Current e
4b50: 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66  ntry in aRowidOf
4b60: 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  fset[] */.  int 
4b70: 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  nRowidOffset;   
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4b90: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
4ba0: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
4bb0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
4bc0: 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  aRowidOffset;   
4bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4be0: 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f  ray of offset to
4bf0: 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f   rowid fields */
4c00: 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ..  Fts5DlidxIte
4c10: 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20  r *pDlidx;      
4c20: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
4c30: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
4c40: 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69  ex */..  /* Vari
4c50: 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20  ables populated 
4c60: 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74  based on current
4c70: 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73   entry. */.  Fts
4c80: 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ca0: 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  Current term */.
4cb0: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
4ce0: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73  id */.  int nPos
4cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4d00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4d10: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75  r of bytes in cu
4d20: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  rrent position l
4d30: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  ist */.  int bDe
4d40: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
4d60: 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66   if the delete f
4d70: 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b  lag is set */.};
4d80: 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  ..#define FTS5_S
4d90: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30  EGITER_ONETERM 0
4da0: 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35  x01.#define FTS5
4db0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
4dc0: 20 30 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62   0x02.../*.** Ob
4dd0: 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69  ject for iterati
4de0: 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  ng through the c
4df0: 6f 6e 65 6e 74 73 20 6f 66 20 61 20 73 69 6e 67  onents of a sing
4e00: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  le internal node
4e10: 20 69 6e 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a   in .** memory..
4e20: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 4e 6f  */.struct Fts5No
4e30: 64 65 49 74 65 72 20 7b 0a 20 20 2f 2a 20 49 6e  deIter {.  /* In
4e40: 74 65 72 6e 61 6c 2e 20 53 65 74 20 61 6e 64 20  ternal. Set and 
4e50: 6d 61 6e 61 67 65 64 20 62 79 20 66 74 73 35 4e  managed by fts5N
4e60: 6f 64 65 49 74 65 72 58 58 58 28 29 20 66 75 6e  odeIterXXX() fun
4e70: 63 74 69 6f 6e 73 2e 20 45 78 63 65 70 74 2c 20  ctions. Except, 
4e80: 0a 20 20 2a 2a 20 74 68 65 20 45 4f 46 20 74 65  .  ** the EOF te
4e90: 73 74 20 66 6f 72 20 74 68 65 20 69 74 65 72 61  st for the itera
4ea0: 74 6f 72 20 69 73 20 28 46 74 73 35 4e 6f 64 65  tor is (Fts5Node
4eb0: 49 74 65 72 2e 61 44 61 74 61 3d 3d 30 29 2e 20  Iter.aData==0). 
4ec0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
4ed0: 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61  aData;.  int nDa
4ee0: 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ta;.  int iOff;.
4ef0: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
4f00: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35  iables */.  Fts5
4f10: 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69  Buffer term;.  i
4f20: 6e 74 20 6e 45 6d 70 74 79 3b 0a 20 20 69 6e 74  nt nEmpty;.  int
4f30: 20 69 43 68 69 6c 64 3b 0a 20 20 69 6e 74 20 62   iChild;.  int b
4f40: 44 6c 69 64 78 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Dlidx;.};../*.**
4f50: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
4f60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  the following ty
4f70: 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  pe is used to it
4f80: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
4f90: 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
4fa0: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
4fb0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70   record..**.** p
4fc0: 44 61 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72  Data:.**   Recor
4fd0: 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  d containing the
4fe0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64   doclist-index d
4ff0: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a  ata..**.** bEof:
5000: 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75  .**   Set to tru
5010: 65 20 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20  e once iterator 
5020: 68 61 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e  has reached EOF.
5030: 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20  .**.** iOff:.** 
5040: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
5050: 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68  rent offset with
5060: 69 6e 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e  in record pData.
5070: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44  .*/.struct Fts5D
5080: 6c 69 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35  lidxLvl {.  Fts5
5090: 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20  Data *pData;    
50a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
50b0: 61 20 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61  a for current pa
50c0: 67 65 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c  ge of this level
50d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
5100: 66 66 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61  ffset into pData
5110: 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20   */.  int bEof; 
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c      /* At EOF al
5140: 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69  ready */.  int i
5150: 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20  FirstOff;       
5160: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
5170: 20 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72   by reverse iter
5180: 61 74 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  ators */..  /* O
5190: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
51a0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
51b0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
51c0: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
51d0: 72 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61  r of current lea
51e0: 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20  f page */.  i64 
51f0: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
5200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5210: 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66  st rowid on leaf
5220: 20 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b   iLeafPgno */.};
5230: 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64  .struct Fts5Dlid
5240: 78 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c  xIter {.  int nL
5250: 76 6c 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  vl;.  int iSegid
5260: 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c  ;.  Fts5DlidxLvl
5270: 20 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 0a 0a   aLvl[1];.};....
5280: 2f 2a 0a 2a 2a 20 41 6e 20 46 74 73 35 42 74 72  /*.** An Fts5Btr
5290: 65 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73  eeIter object is
52a0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
52b0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 6e 74   through all ent
52c0: 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 62  ries in the.** b
52d0: 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
52e0: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 73  belonging to a s
52f0: 69 6e 67 6c 65 20 66 74 73 35 20 73 65 67 6d 65  ingle fts5 segme
5300: 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nt. In this case
5310: 20 74 68 65 0a 2a 2a 20 22 62 2d 74 72 65 65 20   the.** "b-tree 
5320: 68 69 65 72 61 72 63 68 79 22 20 69 73 20 61 6c  hierarchy" is al
5330: 6c 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 65  l b-tree nodes e
5340: 78 63 65 70 74 20 6c 65 61 76 65 73 2e 20 45 61  xcept leaves. Ea
5350: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  ch entry in the.
5360: 2a 2a 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  ** b-tree hierar
5370: 63 68 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  chy consists of 
5380: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
5390: 2a 0a 2a 2a 20 20 20 69 4c 65 61 66 3a 20 20 54  *.**   iLeaf:  T
53a0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
53b0: 66 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  f the leaf page 
53c0: 74 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  the entry points
53d0: 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72   to..**.**   ter
53e0: 6d 3a 20 20 20 41 20 73 70 6c 69 74 2d 6b 65 79  m:   A split-key
53f0: 20 74 68 61 74 20 61 6c 6c 20 74 65 72 6d 73 20   that all terms 
5400: 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 24 69 4c  on leaf page $iL
5410: 65 61 66 20 6d 75 73 74 20 62 65 20 67 72 65 61  eaf must be grea
5420: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
5430: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
5440: 6f 2e 20 54 68 65 20 22 74 65 72 6d 22 20 61 73  o. The "term" as
5450: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
5460: 65 20 66 69 72 73 74 20 62 2d 74 72 65 65 0a 2a  e first b-tree.*
5470: 2a 20 20 20 20 20 20 20 20 20 20 20 68 69 65 72  *           hier
5480: 61 72 63 68 79 20 65 6e 74 72 79 20 28 74 68 65  archy entry (the
5490: 20 6f 6e 65 20 74 68 61 74 20 70 6f 69 6e 74 73   one that points
54a0: 20 74 6f 20 6c 65 61 66 20 70 61 67 65 20 31 29   to leaf page 1)
54b0: 20 69 73 20 61 6c 77 61 79 73 20 0a 2a 2a 20 20   is always .**  
54c0: 20 20 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74           an empt
54d0: 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
54e0: 20 20 6e 45 6d 70 74 79 3a 20 54 68 65 20 6e 75    nEmpty: The nu
54f0: 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20 28 74  mber of empty (t
5500: 65 72 6d 6c 65 73 73 29 20 6c 65 61 66 20 70 61  ermless) leaf pa
5510: 67 65 73 20 74 68 61 74 20 69 6d 6d 65 64 69 61  ges that immedia
5520: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  tely.**         
5530: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65 61    following iLea
5540: 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  f..**.** The Fts
5550: 35 42 74 72 65 65 49 74 65 72 20 6f 62 6a 65 63  5BtreeIter objec
5560: 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  t is only used a
5570: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
5580: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63 6f  tegrity-check co
5590: 64 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  de..*/.struct Ft
55a0: 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
55b0: 20 7b 0a 20 20 46 74 73 35 4e 6f 64 65 49 74 65   {.  Fts5NodeIte
55c0: 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  r s;            
55d0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
55e0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
55f0: 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 44   node */.  Fts5D
5600: 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20  ata *pData;     
5610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5620: 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ta for the curre
5630: 6e 74 20 6e 6f 64 65 20 2a 2f 0a 7d 3b 0a 73 74  nt node */.};.st
5640: 72 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74  ruct Fts5BtreeIt
5650: 65 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  er {.  Fts5Index
5660: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
5670: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
5680: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
5690: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
56a0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
56b0: 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
56c0: 72 6f 75 67 68 20 74 68 69 73 20 73 65 67 6d 65  rough this segme
56d0: 6e 74 27 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  nt's b-tree */. 
56e0: 20 69 6e 74 20 6e 4c 76 6c 3b 20 20 20 20 20 20   int nLvl;      
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 4c 76 6c   /* Size of aLvl
5710: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74  [] array */.  Ft
5720: 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
5730: 20 2a 61 4c 76 6c 3b 20 20 20 20 20 20 20 2f 2a   *aLvl;       /*
5740: 20 4c 65 76 65 6c 20 66 6f 72 20 65 61 63 68 20   Level for each 
5750: 74 69 65 72 20 6f 66 20 62 2d 74 72 65 65 20 2a  tier of b-tree *
5760: 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76  /..  /* Output v
5770: 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74  ariables */.  Ft
5780: 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
57a0: 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f   Current term */
57b0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 3b 20 20 20  .  int iLeaf;   
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 20 2f 2a 20 4c 65 61 66 20 63 6f 6e 74 61     /* Leaf conta
57e0: 69 6e 69 6e 67 20 74 65 72 6d 73 20 3e 3d 20 63  ining terms >= c
57f0: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
5800: 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20 20   int nEmpty;    
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22 65   /* Number of "e
5830: 6d 70 74 79 22 20 6c 65 61 76 65 73 20 66 6f 6c  mpty" leaves fol
5840: 6c 6f 77 69 6e 67 20 69 4c 65 61 66 20 2a 2f 0a  lowing iLeaf */.
5850: 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20    int bEof;     
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
5880: 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 6e 74   at EOF */.  int
5890: 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20   bDlidx;        
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
58b0: 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
58c0: 69 73 74 73 20 61 20 64 6c 69 64 78 20 2a 2f 0a  ists a dlidx */.
58d0: 7d 3b 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  };...static void
58e0: 20 66 74 73 35 50 75 74 55 31 36 28 75 38 20 2a   fts5PutU16(u8 *
58f0: 61 4f 75 74 2c 20 75 31 36 20 69 56 61 6c 29 7b  aOut, u16 iVal){
5900: 0a 20 20 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56  .  aOut[0] = (iV
5910: 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31  al>>8);.  aOut[1
5920: 5d 20 3d 20 28 69 56 61 6c 26 30 78 46 46 29 3b  ] = (iVal&0xFF);
5930: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 31 36 20 66  .}..static u16 f
5940: 74 73 35 47 65 74 55 31 36 28 63 6f 6e 73 74 20  ts5GetU16(const 
5950: 75 38 20 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75  u8 *aIn){.  retu
5960: 72 6e 20 28 28 75 31 36 29 61 49 6e 5b 30 5d 20  rn ((u16)aIn[0] 
5970: 3c 3c 20 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a  << 8) + aIn[1];.
5980: 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  } ../*.** Alloca
5990: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
59a0: 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
59b0: 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 20 73  nByte bytes in s
59c0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
59d0: 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
59e0: 63 6f 75 6e 74 65 72 65 64 2c 20 72 65 74 75 72  countered, retur
59f0: 6e 20 4e 55 4c 4c 20 61 6e 64 20 73 65 74 20 74  n NULL and set t
5a00: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  he error code in
5a10: 0a 2a 2a 20 74 68 65 20 46 74 73 35 49 6e 64 65  .** the Fts5Inde
5a20: 78 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  x handle passed 
5a30: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
5a40: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
5a50: 20 76 6f 69 64 20 2a 66 74 73 35 49 64 78 4d 61   void *fts5IdxMa
5a60: 6c 6c 6f 63 28 46 74 73 35 49 6e 64 65 78 20 2a  lloc(Fts5Index *
5a70: 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  p, int nByte){. 
5a80: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
5a90: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70  ts5MallocZero(&p
5aa0: 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a  ->rc, nByte);.}.
5ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
5ac0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
5ad0: 68 65 20 70 4c 65 66 74 20 62 75 66 66 65 72 20  he pLeft buffer 
5ae0: 77 69 74 68 20 74 68 65 20 70 52 69 67 68 74 2f  with the pRight/
5af0: 6e 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a  nRight blob..**.
5b00: 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66  ** Return -ve if
5b10: 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65   pLeft is smalle
5b20: 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30  r than pRight, 0
5b30: 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75   if they are equ
5b40: 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20  al or.** +ve if 
5b50: 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65  pRight is smalle
5b60: 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e  r than pLeft. In
5b70: 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a   other words:.**
5b80: 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70  .**     res = *p
5b90: 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a  Left - *pRight.*
5ba0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
5bb0: 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
5bc0: 6f 62 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  ob(.  Fts5Buffer
5bd0: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20   *pLeft,        
5be0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 68 61        /* Left ha
5bf0: 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  nd side of compa
5c00: 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  rison */.  const
5c10: 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74   u8 *pRight, int
5c20: 20 6e 52 69 67 68 74 20 20 20 20 2f 2a 20 52 69   nRight    /* Ri
5c30: 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  ght hand side of
5c40: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29   comparison */.)
5c50: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
5c60: 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69  IN(pLeft->n, nRi
5c70: 67 68 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ght);.  int res 
5c80: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e  = memcmp(pLeft->
5c90: 70 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d 70 29  p, pRight, nCmp)
5ca0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d  ;.  return (res=
5cb0: 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d  =0 ? (pLeft->n -
5cc0: 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b   nRight) : res);
5cd0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .}.../*.** Compa
5ce0: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5cf0: 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66 66 65  of the two buffe
5d00: 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  rs using memcmp(
5d10: 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72  ). If one buffer
5d20: 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78 20  .** is a prefix 
5d30: 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74  of the other, it
5d40: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
5d50: 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a  he lesser..**.**
5d60: 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70   Return -ve if p
5d70: 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  Left is smaller 
5d80: 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69  than pRight, 0 i
5d90: 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c  f they are equal
5da0: 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52   or.** +ve if pR
5db0: 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  ight is smaller 
5dc0: 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f  than pLeft. In o
5dd0: 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a  ther words:.**.*
5de0: 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65  *     res = *pLe
5df0: 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a  ft - *pRight.*/.
5e00: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42  static int fts5B
5e10: 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73  ufferCompare(Fts
5e20: 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20  5Buffer *pLeft, 
5e30: 46 74 73 35 42 75 66 66 65 72 20 2a 70 52 69 67  Fts5Buffer *pRig
5e40: 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  ht){.  int nCmp 
5e50: 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20  = MIN(pLeft->n, 
5e60: 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e  pRight->n);.  in
5e70: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
5e80: 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d  Left->p, pRight-
5e90: 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  >p, nCmp);.  ret
5ea0: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70  urn (res==0 ? (p
5eb0: 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74  Left->n - pRight
5ec0: 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a  ->n) : res);.}..
5ed0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5ee0: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66  BUG.static int f
5ef0: 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 0a  ts5BlobCompare(.
5f00: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 65 66    const u8 *pLef
5f10: 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 20 0a 20  t, int nLeft, . 
5f20: 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68   const u8 *pRigh
5f30: 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29 7b  t, int nRight.){
5f40: 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49  .  int nCmp = MI
5f50: 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 29  N(nLeft, nRight)
5f60: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
5f70: 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69 67  mcmp(pLeft, pRig
5f80: 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  ht, nCmp);.  ret
5f90: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 6e  urn (res==0 ? (n
5fa0: 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20 3a  Left - nRight) :
5fb0: 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a   res);.}.#endif.
5fc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
5fd0: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62  e read-only blob
5fe0: 20 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20 69   handle, if it i
5ff0: 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  s open..*/.stati
6000: 63 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73 65  c void fts5Close
6010: 52 65 61 64 65 72 28 46 74 73 35 49 6e 64 65 78  Reader(Fts5Index
6020: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
6030: 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71  Reader ){.    sq
6040: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
6050: 64 65 72 20 3d 20 70 2d 3e 70 52 65 61 64 65 72  der = p->pReader
6060: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72  ;.    p->pReader
6070: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
6080: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65  3_blob_close(pRe
6090: 61 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  ader);.  }.}..st
60a0: 61 74 69 63 20 46 74 73 35 44 61 74 61 20 2a 66  atic Fts5Data *f
60b0: 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66  ts5DataReadOrBuf
60c0: 66 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78  fer(.  Fts5Index
60d0: 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66 66   *p, .  Fts5Buff
60e0: 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 69 36 34  er *pBuf, .  i64
60f0: 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 46 74 73   iRowid.){.  Fts
6100: 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20 30 3b  5Data *pRet = 0;
6110: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
6120: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
6130: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6140: 4b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  K;..    if( p->p
6150: 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Reader ){.      
6160: 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 79  /* This call may
6170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
6180: 42 4f 52 54 20 69 66 20 74 68 65 72 65 20 68 61  BORT if there ha
6190: 73 20 62 65 65 6e 20 61 20 73 61 76 65 70 6f 69  s been a savepoi
61a0: 6e 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  nt.      ** roll
61b0: 62 61 63 6b 20 73 69 6e 63 65 20 69 74 20 77 61  back since it wa
61c0: 73 20 6c 61 73 74 20 75 73 65 64 2e 20 49 6e 20  s last used. In 
61d0: 74 68 69 73 20 63 61 73 65 20 61 20 6e 65 77 20  this case a new 
61e0: 62 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20 20  blob handle.    
61f0: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
6200: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  .  */.      sqli
6210: 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20  te3_blob *pBlob 
6220: 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20  = p->pReader;.  
6230: 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d      p->pReader =
6240: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
6250: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
6260: 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64  en(pBlob, iRowid
6270: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
6280: 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29   p->pReader==0 )
6290: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64  ;.      p->pRead
62a0: 65 72 20 3d 20 70 42 6c 6f 62 3b 0a 20 20 20 20  er = pBlob;.    
62b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
62c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66  _OK ){.        f
62d0: 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
62e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
62f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6300: 41 42 4f 52 54 20 29 20 72 63 20 3d 20 53 51 4c  ABORT ) rc = SQL
6310: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
6320: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 62 6c 6f     /* If the blo
6330: 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20  b handle is not 
6340: 79 65 74 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 61  yet open, open a
6350: 6e 64 20 73 65 65 6b 20 69 74 2e 20 4f 74 68 65  nd seek it. Othe
6360: 72 77 69 73 65 2c 20 75 73 65 0a 20 20 20 20 2a  rwise, use.    *
6370: 2a 20 74 68 65 20 62 6c 6f 62 5f 72 65 6f 70 65  * the blob_reope
6380: 6e 28 29 20 41 50 49 20 74 6f 20 72 65 73 65 65  n() API to resee
6390: 6b 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62  k the existing b
63a0: 6c 6f 62 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  lob handle.  */.
63b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64      if( p->pRead
63c0: 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  er==0 && rc==SQL
63d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
63e0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
63f0: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
6400: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6410: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70  ite3_blob_open(p
6420: 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20  Config->db, .   
6430: 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e         pConfig->
6440: 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
6450: 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69  , "block", iRowi
6460: 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65  d, 0, &p->pReade
6470: 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  r.      );.    }
6480: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68  ..    /* If eith
6490: 65 72 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  er of the sqlite
64a0: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72  3_blob_open() or
64b0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
64c0: 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20  open() calls.   
64d0: 20 2a 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e   ** above return
64e0: 65 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ed SQLITE_ERROR,
64f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6500: 4f 52 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74  ORRUPT_VTAB inst
6510: 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20  ead..    ** All 
6520: 74 68 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73  the reasons thos
6530: 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68  e functions migh
6540: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
6550: 45 52 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a  ERROR - missing.
6560: 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69      ** table, mi
6570: 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62  ssing row, non-b
6580: 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63  lob/text in bloc
6590: 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63  k column - indic
65a0: 61 74 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b  ate .    ** back
65b0: 69 6e 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70  ing store corrup
65c0: 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66  tion.  */.    if
65d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
65e0: 4f 52 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  OR ) rc = FTS5_C
65f0: 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28  ORRUPT;..    if(
6600: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6610: 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74  {.      u8 *aOut
6620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6630: 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62      /* Read blob
6640: 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20   data into this 
6650: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20  buffer */.      
6660: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69  int nByte = sqli
6670: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
6680: 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20  ->pReader);.    
6690: 20 20 69 66 28 20 70 42 75 66 20 29 7b 0a 20 20    if( pBuf ){.  
66a0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
66b0: 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20 20 20  Zero(pBuf);.    
66c0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
66d0: 6f 77 28 26 72 63 2c 20 70 42 75 66 2c 20 6e 42  ow(&rc, pBuf, nB
66e0: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 61 4f  yte);.        aO
66f0: 75 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20  ut = pBuf->p;.  
6700: 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20        pBuf->n = 
6710: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c  nByte;.      }el
6720: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
6730: 6e 53 70 61 63 65 20 3d 20 6e 42 79 74 65 20 2b  nSpace = nByte +
6740: 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
6750: 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20 20 20  PADDING;.       
6760: 20 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74   pRet = (Fts5Dat
6770: 61 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  a*)sqlite3Fts5Ma
6780: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53  llocZero(&rc, nS
6790: 70 61 63 65 2b 73 69 7a 65 6f 66 28 46 74 73 35  pace+sizeof(Fts5
67a0: 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 20 20  Data));.        
67b0: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
67c0: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 20 3d 20        pRet->n = 
67d0: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20  nByte;.         
67e0: 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70 20   aOut = pRet->p 
67f0: 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b  = (u8*)&pRet[1];
6800: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6810: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
6820: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6830: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
6840: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d  te3_blob_read(p-
6850: 3e 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c 20  >pReader, aOut, 
6860: 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20  nByte, 0);.     
6870: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
6880: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
68a0: 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  ee(pRet);.      
68b0: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
68c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
68d0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d  >rc = rc;.    p-
68e0: 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20  >nRead++;.  }.. 
68f0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
6900: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
6910: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
6920: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
6930: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
6940: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
6950: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
6960: 6e 20 65 72 72 6f 72 20 6c 65 66 74 20 69 6e 20  n error left in 
6970: 74 68 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65  the .** Fts5Inde
6980: 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  x object..*/.sta
6990: 74 69 63 20 46 74 73 35 44 61 74 61 20 2a 66 74  tic Fts5Data *ft
69a0: 73 35 44 61 74 61 52 65 61 64 28 46 74 73 35 49  s5DataRead(Fts5I
69b0: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f  ndex *p, i64 iRo
69c0: 77 69 64 29 7b 0a 20 20 46 74 73 35 44 61 74 61  wid){.  Fts5Data
69d0: 20 2a 70 52 65 74 20 3d 20 66 74 73 35 44 61 74   *pRet = fts5Dat
69e0: 61 52 65 61 64 4f 72 42 75 66 66 65 72 28 70 2c  aReadOrBuffer(p,
69f0: 20 30 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 61   0, iRowid);.  a
6a00: 73 73 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29  ssert( (pRet==0)
6a10: 3d 3d 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  ==(p->rc!=SQLITE
6a20: 5f 4f 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  _OK) );.  return
6a30: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
6a40: 52 65 61 64 20 61 20 72 65 63 6f 72 64 20 66 72  Read a record fr
6a50: 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
6a60: 62 6c 65 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ble into the buf
6a70: 66 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20  fer supplied as 
6a80: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72  the.** second ar
6a90: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
6aa0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6ab0: 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20 6c 65  , an error is le
6ac0: 66 74 20 69 6e 20 74 68 65 20 46 74 73 35 49 6e  ft in the Fts5In
6ad0: 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  dex object. If a
6ae0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61  n.** error has a
6af0: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
6b00: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
6b10: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
6b20: 20 69 73 20 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e   is a .** no-op.
6b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6b40: 66 74 73 35 44 61 74 61 42 75 66 66 65 72 28 46  fts5DataBuffer(F
6b50: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
6b60: 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
6b70: 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 28 76  64 iRowid){.  (v
6b80: 6f 69 64 29 66 74 73 35 44 61 74 61 52 65 61 64  oid)fts5DataRead
6b90: 4f 72 42 75 66 66 65 72 28 70 2c 20 70 42 75 66  OrBuffer(p, pBuf
6ba0: 2c 20 69 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a  , iRowid);.}../*
6bb0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
6bc0: 66 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61 20  ference to data 
6bd0: 72 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64 20  record returned 
6be0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
6bf0: 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74  ll to.** fts5Dat
6c00: 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74  aRead()..*/.stat
6c10: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
6c20: 52 65 6c 65 61 73 65 28 46 74 73 35 44 61 74 61  Release(Fts5Data
6c30: 20 2a 70 44 61 74 61 29 7b 0a 20 20 73 71 6c 69   *pData){.  sqli
6c40: 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b  te3_free(pData);
6c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54  .}../*.** INSERT
6c60: 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72 65   OR REPLACE a re
6c70: 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f  cord into the %_
6c80: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  data table..*/.s
6c90: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
6ca0: 61 74 61 57 72 69 74 65 28 46 74 73 35 49 6e 64  ataWrite(Fts5Ind
6cb0: 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
6cc0: 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  d, const u8 *pDa
6cd0: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a  ta, int nData){.
6ce0: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
6cf0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
6d00: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74  ..  if( p->pWrit
6d10: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  er==0 ){.    int
6d20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6d30: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
6d40: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
6d50: 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20  onfig;.    char 
6d60: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 46  *zSql = sqlite3F
6d70: 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 0a  ts5Mprintf(&rc,.
6d80: 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
6d90: 20 49 4e 54 4f 20 27 25 71 27 2e 25 51 28 69 64   INTO '%q'.%Q(id
6da0: 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28  , block) VALUES(
6db0: 3f 2c 3f 29 22 2c 20 70 43 6f 6e 66 69 67 2d 3e  ?,?)", pConfig->
6dc0: 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
6dd0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
6de0: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  zSql ){.      rc
6df0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
6e00: 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64  re_v2(pConfig->d
6e10: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d  b, zSql, -1, &p-
6e20: 3e 70 57 72 69 74 65 72 2c 20 30 29 3b 0a 20 20  >pWriter, 0);.  
6e30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6e40: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zSql);.    }.  
6e50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6e60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
6e70: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
6e80: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
6e90: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ..  sqlite3_bind
6ea0: 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65  _int64(p->pWrite
6eb0: 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  r, 1, iRowid);. 
6ec0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
6ed0: 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32  ob(p->pWriter, 2
6ee0: 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
6ef0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6f00: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6f10: 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d  ->pWriter);.  p-
6f20: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
6f30: 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  set(p->pWriter);
6f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
6f50: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
6f60: 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  SQL:.**.**     D
6f70: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
6f80: 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45  a WHERE id BETWE
6f90: 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24  EN $iFirst AND $
6fa0: 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  iLast.*/.static 
6fb0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c  void fts5DataDel
6fc0: 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ete(Fts5Index *p
6fd0: 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36  , i64 iFirst, i6
6fe0: 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20  4 iLast){.  if( 
6ff0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
7000: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
7010: 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30  ( p->pDeleter==0
7020: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
7030: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
7040: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
7050: 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  nfig;.    char *
7060: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
7070: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
7080: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
7090: 27 2e 25 51 20 57 48 45 52 45 20 69 64 3e 3d 3f  '.%Q WHERE id>=?
70a0: 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f   AND id<=?", pCo
70b0: 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44  nfig->zDb, p->zD
70c0: 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20  ataTbl.    );.  
70d0: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
70e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
70f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
7100: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
7110: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
7120: 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  v2(pConfig->db, 
7130: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44  zSql, -1, &p->pD
7140: 65 6c 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  eleter, 0);.    
7150: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
7160: 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
7170: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7180: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  K ){.      p->rc
7190: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
71a0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
71b0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
71c0: 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72  nt64(p->pDeleter
71d0: 2c 20 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  , 1, iFirst);.  
71e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
71f0: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
7200: 32 2c 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c  2, iLast);.  sql
7210: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65  ite3_step(p->pDe
7220: 6c 65 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  leter);.  p->rc 
7230: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
7240: 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a  p->pDeleter);.}.
7250: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c  ./*.** Remove al
7260: 6c 20 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69  l records associ
7270: 61 74 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e  ated with segmen
7280: 74 20 69 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61  t iSegid..*/.sta
7290: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
72a0: 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46  aRemoveSegment(F
72b0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
72c0: 20 69 53 65 67 69 64 29 7b 0a 20 20 69 36 34 20   iSegid){.  i64 
72d0: 69 46 69 72 73 74 20 3d 20 46 54 53 35 5f 53 45  iFirst = FTS5_SE
72e0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
72f0: 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69 36 34  id, 0, 0);.  i64
7300: 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f 53 45   iLast = FTS5_SE
7310: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
7320: 69 64 2b 31 2c 20 30 2c 20 30 29 2d 31 3b 0a 20  id+1, 0, 0)-1;. 
7330: 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
7340: 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73 74  p, iFirst, iLast
7350: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
7360: 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
7370: 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75 63 74  to an Fts5Struct
7380: 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74 75 72  ure object retur
7390: 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
73a0: 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74  r .** call to ft
73b0: 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
73c0: 29 20 6f 72 20 66 74 73 35 53 74 72 75 63 74 75  ) or fts5Structu
73d0: 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73  reDecode()..*/.s
73e0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
73f0: 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
7400: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7410: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70  Struct){.  if( p
7420: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e  Struct ){.    in
7430: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
7440: 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  ; i<pStruct->nLe
7450: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
7460: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
7470: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  truct->aLevel[i]
7480: 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20  .aSeg);.    }.  
7490: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
74a0: 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Struct);.  }.}..
74b0: 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
74c0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
74d0: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
74e0: 64 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  d currently stor
74f0: 65 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64  ed in serialized
7500: 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20  .** form within 
7510: 62 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61  buffer pData/nDa
7520: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74  ta..**.** The Ft
7530: 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76  s5Structure.aLev
7540: 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74  el[] and each Ft
7550: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7560: 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a  .aSeg[] array.**
7570: 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61   are over-alloca
7580: 74 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e  ted by one slot.
7590: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
75a0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65   structure conte
75b0: 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72  nts.** to be mor
75c0: 65 20 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e  e easily edited.
75d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
75e0: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75  or occurs, *ppOu
75f0: 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  t is set to NULL
7600: 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65   and an SQLite e
7610: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74  rror code.** ret
7620: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
7630: 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20  , *ppOut is set 
7640: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
7650: 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a  new object and.*
7660: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
7670: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
7680: 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72  int fts5Structur
7690: 65 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74  eDecode(.  const
76a0: 20 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20   u8 *pData,     
76b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
76c0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
76d0: 73 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63  serialized struc
76e0: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ture */.  int nD
76f0: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
7700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
7710: 65 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74  e of buffer pDat
7720: 61 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  a in bytes */.  
7730: 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20  int *piCookie,  
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
7760: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
7770: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
7780: 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20   **ppOut        
7790: 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72     /* OUT: Deser
77a0: 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a  ialized object *
77b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
77c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
77d0: 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c   i = 0;.  int iL
77e0: 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c  vl;.  int nLevel
77f0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67   = 0;.  int nSeg
7800: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ment = 0;.  int 
7810: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
7820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7830: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
7840: 20 61 6c 6c 6f 63 61 74 65 20 61 74 20 70 52 65   allocate at pRe
7850: 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
7860: 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20  ture *pRet = 0; 
7870: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
7880: 75 72 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65  ure object to re
7890: 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72  turn */..  /* Gr
78a0: 61 62 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  ab the cookie va
78b0: 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 70 69 43  lue */.  if( piC
78c0: 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69  ookie ) *piCooki
78d0: 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47  e = sqlite3Fts5G
78e0: 65 74 33 32 28 70 44 61 74 61 29 3b 0a 20 20 69  et32(pData);.  i
78f0: 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64   = 4;..  /* Read
7900: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
7910: 72 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20  r of levels and 
7920: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
7930: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20  e start of the. 
7940: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72 65   ** structure re
7950: 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d  cord.  */.  i +=
7960: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7970: 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76  (&pData[i], nLev
7980: 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35  el);.  i += fts5
7990: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
79a0: 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29  ta[i], nSegment)
79b0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  ;.  nByte = (.  
79c0: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
79d0: 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20  tructure) +     
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79f0: 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65  * Main structure
7a00: 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
7a10: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
7a20: 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 29 20  vel) * (nLevel) 
7a30: 20 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d       /* aLevel[]
7a40: 20 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20   array */.  );. 
7a50: 20 70 52 65 74 20 3d 20 28 46 74 73 35 53 74 72   pRet = (Fts5Str
7a60: 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46  ucture*)sqlite3F
7a70: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
7a80: 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66  c, nByte);..  if
7a90: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52  ( pRet ){.    pR
7aa0: 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65  et->nLevel = nLe
7ab0: 76 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  vel;.    pRet->n
7ac0: 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65  Segment = nSegme
7ad0: 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c  nt;.    i += sql
7ae0: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
7af0: 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52  t(&pData[i], &pR
7b00: 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  et->nWriteCounte
7b10: 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76  r);..    for(iLv
7b20: 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l=0; rc==SQLITE_
7b30: 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65  OK && iLvl<nLeve
7b40: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
7b50: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
7b60: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52  evel *pLvl = &pR
7b70: 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  et->aLevel[iLvl]
7b80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74  ;.      int nTot
7b90: 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  al;.      int iS
7ba0: 65 67 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20  eg;..      i += 
7bb0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7bc0: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7bd0: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
7be0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7bf0: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7c00: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61  nTotal);.      a
7c10: 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70  ssert( nTotal>=p
7c20: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20  Lvl->nMerge );. 
7c30: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
7c40: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
7c50: 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33  Segment*)sqlite3
7c60: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
7c70: 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e  rc, .          n
7c80: 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46  Total * sizeof(F
7c90: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7ca0: 65 6e 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20  ent).      );.. 
7cb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7cc0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7cd0: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
7ce0: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7cf0: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
7d00: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
7d10: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7d20: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7d30: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7d40: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
7d50: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  id);.          i
7d60: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7d70: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
7d80: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
7d90: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20  nHeight);.      
7da0: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
7db0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7dc0: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
7dd0: 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg].pgnoFirst);
7de0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7df0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7e00: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7e10: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
7e20: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Last);.        }
7e30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7e40: 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
7e50: 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29  ureRelease(pRet)
7e60: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
7e70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7e80: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20  }.  }..  *ppOut 
7e90: 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e  = pRet;.  return
7ea0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f   rc;.}../*.**.*/
7eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7ec0: 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
7ed0: 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  el(int *pRc, Fts
7ee0: 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
7ef0: 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70  truct){.  if( *p
7f00: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
7f10: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7f20: 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
7f30: 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74  pStruct;.    int
7f40: 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63   nLevel = pStruc
7f50: 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69  t->nLevel;.    i
7f60: 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20  nt nByte = (.   
7f70: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7f80: 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20  Structure) +    
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fa0: 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20   Main structure 
7fb0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f  */.        sizeo
7fc0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7fd0: 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b  evel) * (nLevel+
7fe0: 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20  1)  /* aLevel[] 
7ff0: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a  array */.    );.
8000: 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 73  .    pStruct = s
8010: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
8020: 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a  Struct, nByte);.
8030: 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20      if( pStruct 
8040: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
8050: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
8060: 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a  [nLevel], 0, siz
8070: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8080: 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20  eLevel));.      
8090: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
80a0: 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75  +;.      *ppStru
80b0: 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20  ct = pStruct;.  
80c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
80d0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
80e0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  EM;.    }.  }.}.
80f0: 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65  ./*.** Extend le
8100: 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74  vel iLvl so that
8110: 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66   there is room f
8120: 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74  or at least nExt
8130: 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65  ra more.** segme
8140: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
8150: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
8160: 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20  eExtendLevel(.  
8170: 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73  int *pRc, .  Fts
8180: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8190: 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c  uct, .  int iLvl
81a0: 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  , .  int nExtra,
81b0: 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a   .  int bInsert.
81c0: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
81d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
81e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
81f0: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
8200: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
8210: 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ];.    Fts5Struc
8220: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65  tureSegment *aNe
8230: 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  w;.    int nByte
8240: 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ;..    nByte = (
8250: 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78  pLvl->nSeg + nEx
8260: 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  tra) * sizeof(Ft
8270: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8280: 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  nt);.    aNew = 
8290: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
82a0: 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74  pLvl->aSeg, nByt
82b0: 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  e);.    if( aNew
82c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49   ){.      if( bI
82d0: 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nsert==0 ){.    
82e0: 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
82f0: 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c  [pLvl->nSeg], 0,
8300: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8310: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20  ctureSegment) * 
8320: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
8330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
8340: 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e  t nMove = pLvl->
8350: 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74  nSeg * sizeof(Ft
8360: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8370: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  nt);.        mem
8380: 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72  move(&aNew[nExtr
8390: 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29  a], aNew, nMove)
83a0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
83b0: 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (aNew, 0, sizeof
83c0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
83d0: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
83e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
83f0: 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65  pLvl->aSeg = aNe
8400: 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  w;.    }else{.  
8410: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
8420: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
8430: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
8440: 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e  , deserialize an
8450: 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72  d return the str
8460: 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a  ucture record..*
8470: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72  *.** The Fts5Str
8480: 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20  ucture.aLevel[] 
8490: 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72  and each Fts5Str
84a0: 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67  uctureLevel.aSeg
84b0: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
84c0: 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61  over-allocated a
84d0: 73 20 64 65 73 63 72 69 62 65 64 20 66 6f 72 20  s described for 
84e0: 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72  function fts5Str
84f0: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a  uctureDecode() .
8500: 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ** above..**.** 
8510: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8520: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
8530: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
8540: 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74  r code left in t
8550: 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20  he.** Fts5Index 
8560: 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72  handle. If an er
8570: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
8580: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
8590: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
85a0: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
85b0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
85c0: 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ic Fts5Structure
85d0: 20 2a 66 74 73 35 53 74 72 75 63 74 75 72 65 52   *fts5StructureR
85e0: 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ead(Fts5Index *p
85f0: 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
8600: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
8610: 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72  onfig;.  Fts5Str
8620: 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30  ucture *pRet = 0
8630: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65  ;        /* Obje
8640: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
8650: 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
8660: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
8670: 20 20 2f 2a 20 25 5f 64 61 74 61 20 65 6e 74 72    /* %_data entr
8680: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 74 72  y containing str
8690: 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 2a 2f  ucture record */
86a0: 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20  .  int iCookie; 
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
86d0: 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 0a 20  ion cookie */.. 
86e0: 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
86f0: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54  aRead(p, FTS5_ST
8700: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a  RUCTURE_ROWID);.
8710: 20 20 69 66 28 20 21 70 44 61 74 61 20 29 20 72    if( !pData ) r
8720: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 72 63  eturn 0;.  p->rc
8730: 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
8740: 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c  Decode(pData->p,
8750: 20 70 44 61 74 61 2d 3e 6e 2c 20 26 69 43 6f 6f   pData->n, &iCoo
8760: 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a 0a 20 20  kie, &pRet);..  
8770: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8780: 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d  E_OK && pConfig-
8790: 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69  >iCookie!=iCooki
87a0: 65 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  e ){.    p->rc =
87b0: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
87c0: 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20  igLoad(pConfig, 
87d0: 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 0a 20  iCookie);.  }.. 
87e0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
87f0: 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70  (pData);.  if( p
8800: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
8810: 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  ){.    fts5Struc
8820: 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74  tureRelease(pRet
8830: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  );.    pRet = 0;
8840: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
8850: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  et;.}../*.** Ret
8860: 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
8870: 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
8880: 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74   in index struct
8890: 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 69  ure pStruct. Thi
88a0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
88b0: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
88c0: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
88d0: 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  t() conditions..
88e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
88f0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
8900: 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43  t fts5StructureC
8910: 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73  ountSegments(Fts
8920: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8930: 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  uct){.  int nSeg
8940: 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ment = 0;       
8950: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8960: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
8970: 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  nts */.  if( pSt
8980: 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
8990: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
89a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
89b0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
89c0: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
89d0: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
89e0: 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
89f0: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
8a00: 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20      nSegment += 
8a10: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8a20: 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20  iLvl].nSeg;.    
8a30: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8a40: 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64  nSegment;.}.#end
8a50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c  if../*.** Serial
8a60: 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ize and store th
8a70: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
8a80: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
8a90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8aa0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
8ab0: 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49  ode in the Fts5I
8ac0: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20  ndex object. If 
8ad0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20  an.** error has 
8ae0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
8af0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
8b00: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
8b10: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
8b20: 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74  tructureWrite(Ft
8b30: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
8b40: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8b50: 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ct){.  if( p->rc
8b60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8b70: 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75     Fts5Buffer bu
8b80: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8b90: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65   /* Buffer to se
8ba0: 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69  rialize record i
8bb0: 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nto */.    int i
8bc0: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
8bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
8be0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
8bf0: 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
8c00: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20    int iCookie;  
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20  /* Cookie value 
8c30: 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20  to store */..   
8c40: 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
8c50: 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
8c60: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
8c70: 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
8c80: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62  );.    memset(&b
8c90: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
8ca0: 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
8cb0: 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63   /* Append the c
8cc0: 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61  urrent configura
8cd0: 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20  tion cookie */. 
8ce0: 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e     iCookie = p->
8cf0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
8d00: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69  ;.    if( iCooki
8d10: 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20  e<0 ) iCookie = 
8d20: 30 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  0;.    fts5Buffe
8d30: 72 41 70 70 65 6e 64 33 32 28 26 70 2d 3e 72 63  rAppend32(&p->rc
8d40: 2c 20 26 62 75 66 2c 20 69 43 6f 6f 6b 69 65 29  , &buf, iCookie)
8d50: 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ;..    fts5Buffe
8d60: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8d70: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72  ->rc, &buf, pStr
8d80: 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20  uct->nLevel);.  
8d90: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8da0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8db0: 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e   &buf, pStruct->
8dc0: 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 66  nSegment);.    f
8dd0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8de0: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8df0: 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74  uf, (i64)pStruct
8e00: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
8e10: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  ;..    for(iLvl=
8e20: 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
8e30: 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
8e40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  {.      int iSeg
8e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8e60: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
8e70: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
8e80: 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
8e90: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
8ea0: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
8eb0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8ec0: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  Lvl];.      fts5
8ed0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8ee0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8ef0: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a   pLvl->nMerge);.
8f00: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
8f10: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
8f20: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
8f30: 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73  >nSeg);.      as
8f40: 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72  sert( pLvl->nMer
8f50: 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29  ge<=pLvl->nSeg )
8f60: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ;..      for(iSe
8f70: 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e  g=0; iSeg<pLvl->
8f80: 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
8f90: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
8fa0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8fb0: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8fc0: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ->aSeg[iSeg].iSe
8fd0: 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  gid);.        ft
8fe0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
8ff0: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9000: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9010: 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20  eg].nHeight);.  
9020: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9030: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9040: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9050: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
9060: 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
9070: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9080: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9090: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
90a0: 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b  iSeg].pgnoLast);
90b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
90c0: 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
90d0: 65 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54  e(p, FTS5_STRUCT
90e0: 55 52 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70  URE_ROWID, buf.p
90f0: 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74  , buf.n);.    ft
9100: 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
9110: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30  f);.  }.}..#if 0
9120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9130: 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
9140: 69 6e 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a  int*,Fts5Buffer*
9150: 2c 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  ,Fts5Structure*)
9160: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ;.static void ft
9170: 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65  s5PrintStructure
9180: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61  (const char *zCa
9190: 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63  ption, Fts5Struc
91a0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
91b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
91c0: 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66  E_OK;.  Fts5Buff
91d0: 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74  er buf;.  memset
91e0: 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  (&buf, 0, sizeof
91f0: 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65  (buf));.  fts5De
9200: 62 75 67 53 74 72 75 63 74 75 72 65 28 26 72 63  bugStructure(&rc
9210: 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 29  , &buf, pStruct)
9220: 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f  ;.  fprintf(stdo
9230: 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20  ut, "%s: %s\n", 
9240: 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29  zCaption, buf.p)
9250: 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75  ;.  fflush(stdou
9260: 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  t);.  fts5Buffer
9270: 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65  Free(&buf);.}.#e
9280: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
9290: 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28  5PrintStructure(
92a0: 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61  x,y).#endif..sta
92b0: 74 69 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d  tic int fts5Segm
92c0: 65 6e 74 53 69 7a 65 28 46 74 73 35 53 74 72 75  entSize(Fts5Stru
92d0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
92e0: 65 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20  eg){.  return 1 
92f0: 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  + pSeg->pgnoLast
9300: 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   - pSeg->pgnoFir
9310: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  st;.}../*.** Ret
9320: 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e  urn a copy of in
9330: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53  dex structure pS
9340: 74 72 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70  truct. Except, p
9350: 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a  romote as many .
9360: 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70  ** segments as p
9370: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c  ossible to level
9380: 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e   iPromote. If an
9390: 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c   OOM occurs, NUL
93a0: 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  L is .** returne
93b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
93c0: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50  d fts5StructureP
93d0: 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35  romoteTo(.  Fts5
93e0: 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20  Index *p,.  int 
93f0: 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20  iPromote,.  int 
9400: 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73  szPromote,.  Fts
9410: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
9420: 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c  uct.){.  int il,
9430: 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63   is;.  Fts5Struc
9440: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20  tureLevel *pOut 
9450: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
9460: 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20  el[iPromote];.. 
9470: 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67   if( pOut->nMerg
9480: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  e==0 ){.    for(
9490: 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69  il=iPromote+1; i
94a0: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
94b0: 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  l; il++){.      
94c0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
94d0: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
94e0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b  uct->aLevel[il];
94f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
9500: 3e 6e 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e  >nMerge ) return
9510: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70  ;.      for(is=p
9520: 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e  Lvl->nSeg-1; is>
9530: 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20  =0; is--){.     
9540: 20 20 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35     int sz = fts5
9550: 53 65 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76  SegmentSize(&pLv
9560: 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20  l->aSeg[is]);.  
9570: 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50        if( sz>szP
9580: 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b  romote ) return;
9590: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72  .        fts5Str
95a0: 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
95b0: 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
95c0: 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20  t, iPromote, 1, 
95d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
95e0: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
95f0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
9600: 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c  Out->aSeg, &pLvl
9610: 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65  ->aSeg[is], size
9620: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
9630: 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20  Segment));.     
9640: 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b     pOut->nSeg++;
9650: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e  .        pLvl->n
9660: 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Seg--;.      }. 
9670: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9680: 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  * A new segment 
9690: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72  has just been wr
96a0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69  itten to level i
96b0: 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72  Lvl of index str
96c0: 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63  ucture.** pStruc
96d0: 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
96e0: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
96f0: 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75  ny segments shou
9700: 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a  ld be promoted.*
9710: 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53  * as a result. S
9720: 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d  egments are prom
9730: 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e  oted in two scen
9740: 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
9750: 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74  ) If the segment
9760: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73   just written is
9770: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e   smaller than on
9780: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
9790: 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69  ts.**      withi
97a0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  n the previous p
97b0: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20  opulated level, 
97c0: 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74  it is promoted t
97d0: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  o the previous.*
97e0: 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64  *      populated
97f0: 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20   level..**.**   
9800: 62 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e  b) If the segmen
9810: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69  t just written i
9820: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
9830: 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74  e newest segment
9840: 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20   on.**      the 
9850: 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c  next populated l
9860: 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20  evel, then that 
9870: 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79  segment, and any
9880: 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a   other adjacent.
9890: 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73  **      segments
98a0: 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
98b0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
98c0: 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  one just written
98d0: 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70  , are .**      p
98e0: 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  romoted. .**.** 
98f0: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  If one or more s
9900: 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d  egments are prom
9910: 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75 63 74  oted, the struct
9920: 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70  ure object is up
9930: 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c  dated.** to refl
9940: 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ect this..*/.sta
9950: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
9960: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20  ucturePromote(. 
9970: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
99a0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
99b0: 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
99d0: 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74  Index level just
99e0: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74   updated */.  Ft
99f0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9a00: 72 75 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a  ruct          /*
9a10: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
9a20: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
9a30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9a40: 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20  .    int iTst;. 
9a50: 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20     int iPromote 
9a60: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a  = -1;.    int sz
9a70: 50 72 6f 6d 6f 74 65 3b 20 20 20 20 20 20 20 20  Promote;        
9a80: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f          /* Promo
9a90: 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73  te anything this
9aa0: 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72   size or smaller
9ab0: 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75   */.    Fts5Stru
9ac0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
9ad0: 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74  eg;   /* Segment
9ae0: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
9af0: 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20  .    int szSeg; 
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65     /* Size of se
9b20: 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74  gment just writt
9b30: 65 6e 20 2a 2f 0a 0a 0a 20 20 20 20 70 53 65 67  en */...    pSeg
9b40: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9b50: 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70  vel[iLvl].aSeg[p
9b60: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9b70: 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20  Lvl].nSeg-1];.  
9b80: 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70    szSeg = (1 + p
9b90: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
9ba0: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29  pSeg->pgnoFirst)
9bb0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
9bc0: 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61  for condition (a
9bd0: 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73  ) */.    for(iTs
9be0: 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d  t=iLvl-1; iTst>=
9bf0: 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  0 && pStruct->aL
9c00: 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d  evel[iTst].nSeg=
9c10: 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20  =0; iTst--);.   
9c20: 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a   if( iTst>=0 ){.
9c30: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9c40: 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30     int szMax = 0
9c50: 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  ;.      Fts5Stru
9c60: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74  ctureLevel *pTst
9c70: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9c80: 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20  vel[iTst];.     
9c90: 20 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e   assert( pTst->n
9ca0: 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Merge==0 );.    
9cb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73    for(i=0; i<pTs
9cc0: 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  t->nSeg; i++){. 
9cd0: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
9ce0: 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67  pTst->aSeg[i].pg
9cf0: 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61  noLast - pTst->a
9d00: 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74  Seg[i].pgnoFirst
9d10: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   + 1;.        if
9d20: 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d  ( sz>szMax ) szM
9d30: 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d  ax = sz;.      }
9d40: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78  .      if( szMax
9d50: 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20  >=szSeg ){.     
9d60: 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20     /* Condition 
9d70: 28 61 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f  (a) is true. Pro
9d80: 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74 20  mote the newest 
9d90: 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c  segment on level
9da0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76   .        ** iLv
9db0: 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e  l to level iTst.
9dc0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72    */.        iPr
9dd0: 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20  omote = iTst;.  
9de0: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
9df0: 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d  = szMax;.      }
9e00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
9e10: 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  f condition (a) 
9e20: 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75  is not met, assu
9e30: 6d 65 20 28 62 29 20 69 73 20 74 72 75 65 2e 20  me (b) is true. 
9e40: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9e50: 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61  To().    ** is a
9e60: 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20   no-op if it is 
9e70: 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  not.  */.    if(
9e80: 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20   iPromote<0 ){. 
9e90: 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20       iPromote = 
9ea0: 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72  iLvl;.      szPr
9eb0: 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20  omote = szSeg;. 
9ec0: 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
9ed0: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
9ee0: 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50  p, iPromote, szP
9ef0: 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29  romote, pStruct)
9f00: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
9f10: 49 66 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f  If the pIter->iO
9f20: 66 66 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e  ff offset curren
9f30: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  tly points to an
9f40: 20 65 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e   entry indicatin
9f50: 67 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65  g one.** or more
9f60: 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73   term-less nodes
9f70: 2c 20 61 64 76 61 6e 63 65 20 70 61 73 74 20 69  , advance past i
9f80: 74 20 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d  t and set pIter-
9f90: 3e 6e 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68  >nEmpty to.** th
9fa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74  e number of empt
9fb0: 79 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a  y child nodes..*
9fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
9fd0: 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65  s5NodeIterGobble
9fe0: 4e 45 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49  NEmpty(Fts5NodeI
9ff0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
a000: 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70  f( pIter->iOff<p
a010: 49 74 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30  Iter->nData && 0
a020: 3d 3d 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  ==(pIter->aData[
a030: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30  pIter->iOff] & 0
a040: 78 66 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65  xfe) ){.    pIte
a050: 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65  r->bDlidx = pIte
a060: 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e  r->aData[pIter->
a070: 69 4f 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20  iOff] & 0x01;.  
a080: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b    pIter->iOff++;
a090: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
a0a0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
a0b0: 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74  t32(&pIter->aDat
a0c0: 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20  a[pIter->iOff], 
a0d0: 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a  pIter->nEmpty);.
a0e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
a0f0: 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a  er->nEmpty = 0;.
a100: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64      pIter->bDlid
a110: 78 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  x = 0;.  }.}../*
a120: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74  .** Advance to t
a130: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 77 69  he next entry wi
a140: 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 2e 0a 2a  thin the node..*
a150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
a160: 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 69  s5NodeIterNext(i
a170: 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 4e 6f 64  nt *pRc, Fts5Nod
a180: 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  eIter *pIter){. 
a190: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66   if( pIter->iOff
a1a0: 3e 3d 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 29  >=pIter->nData )
a1b0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 44 61  {.    pIter->aDa
a1c0: 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ta = 0;.    pIte
a1d0: 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 70 49 74  r->iChild += pIt
a1e0: 65 72 2d 3e 6e 45 6d 70 74 79 3b 0a 20 20 7d 65  er->nEmpty;.  }e
a1f0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 50 72  lse{.    int nPr
a200: 65 2c 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74  e, nNew;.    pIt
a210: 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  er->iOff += fts5
a220: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
a230: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
a240: 3e 69 4f 66 66 5d 2c 20 6e 50 72 65 29 3b 0a 20  >iOff], nPre);. 
a250: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
a260: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
a270: 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  2(&pIter->aData[
a280: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 4e  pIter->iOff], nN
a290: 65 77 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ew);.    pIter->
a2a0: 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d 32 3b  term.n = nPre-2;
a2b0: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
a2c0: 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 26  ppendBlob(pRc, &
a2d0: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65  pIter->term, nNe
a2e0: 77 2c 20 70 49 74 65 72 2d 3e 61 44 61 74 61 2b  w, pIter->aData+
a2f0: 70 49 74 65 72 2d 3e 69 4f 66 66 29 3b 0a 20 20  pIter->iOff);.  
a300: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
a310: 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72   nNew;.    pIter
a320: 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 28 31 20 2b  ->iChild += (1 +
a330: 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b   pIter->nEmpty);
a340: 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
a350: 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49  rGobbleNEmpty(pI
a360: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  ter);.    if( *p
a370: 52 63 20 29 20 70 49 74 65 72 2d 3e 61 44 61 74  Rc ) pIter->aDat
a380: 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  a = 0;.  }.}.../
a390: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
a3a0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
a3b0: 65 63 74 20 70 49 74 65 72 20 74 6f 20 69 74 65  ect pIter to ite
a3c0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
a3d0: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73 65 67   internal.** seg
a3e0: 6d 65 6e 74 20 6e 6f 64 65 20 69 6e 20 70 44 61  ment node in pDa
a3f0: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
a400: 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49  id fts5NodeIterI
a410: 6e 69 74 28 63 6f 6e 73 74 20 75 38 20 2a 61 44  nit(const u8 *aD
a420: 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
a430: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49  Fts5NodeIter *pI
a440: 74 65 72 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  ter){.  memset(p
a450: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
a460: 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
a470: 72 2d 3e 61 44 61 74 61 20 3d 20 61 44 61 74 61  r->aData = aData
a480: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 44 61 74 61  ;.  pIter->nData
a490: 20 3d 20 6e 44 61 74 61 3b 0a 20 20 70 49 74 65   = nData;.  pIte
a4a0: 72 2d 3e 69 4f 66 66 20 3d 20 66 74 73 35 47 65  r->iOff = fts5Ge
a4b0: 74 56 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c  tVarint32(aData,
a4c0: 20 70 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b   pIter->iChild);
a4d0: 0a 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47  .  fts5NodeIterG
a4e0: 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65  obbleNEmpty(pIte
a4f0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
a500: 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c  e any memory all
a510: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  ocated by the it
a520: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  erator object..*
a530: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
a540: 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46  s5NodeIterFree(F
a550: 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74  ts5NodeIter *pIt
a560: 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  er){.  fts5Buffe
a570: 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65  rFree(&pIter->te
a580: 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  rm);.}../*.** Ad
a590: 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
a5a0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
a5b0: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20   only argument. 
a5c0: 49 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  If the end of th
a5d0: 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e  e .** doclist-in
a5e0: 64 65 78 20 70 61 67 65 20 69 73 20 72 65 61 63  dex page is reac
a5f0: 68 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  hed, return non-
a600: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
a610: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  int fts5DlidxLvl
a620: 4e 65 78 74 28 46 74 73 35 44 6c 69 64 78 4c 76  Next(Fts5DlidxLv
a630: 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35  l *pLvl){.  Fts5
a640: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70 4c  Data *pData = pL
a650: 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66  vl->pData;..  if
a660: 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20  ( pLvl->iOff==0 
a670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a680: 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a  Lvl->bEof==0 );.
a690: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
a6a0: 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f   1;.    pLvl->iO
a6b0: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
a6c0: 69 6e 74 33 32 28 26 70 44 61 74 61 2d 3e 70 5b  int32(&pData->p[
a6d0: 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50  1], pLvl->iLeafP
a6e0: 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  gno);.    pLvl->
a6f0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
a700: 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
a710: 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36  pLvl->iOff], (u6
a720: 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64  4*)&pLvl->iRowid
a730: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69  );.    pLvl->iFi
a740: 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69  rstOff = pLvl->i
a750: 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Off;.  }else{.  
a760: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
a770: 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69  for(iOff=pLvl->i
a780: 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d  Off; iOff<pData-
a790: 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20  >n; iOff++){.   
a7a0: 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b     if( pData->p[
a7b0: 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a  iOff] ) break; .
a7c0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
a7d0: 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a  Off<pData->n ){.
a7e0: 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a        i64 iVal;.
a7f0: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61        pLvl->iLea
a800: 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d  fPgno += (iOff -
a810: 20 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31   pLvl->iOff) + 1
a820: 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
a830: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
a840: 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Data->p[iOff], (
a850: 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20  u64*)&iVal);.   
a860: 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20     pLvl->iRowid 
a870: 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70  += iVal;.      p
a880: 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  Lvl->iOff = iOff
a890: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a8a0: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
a8b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
a8c0: 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f  return pLvl->bEo
a8d0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  f;.}../*.** Adva
a8e0: 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
a8f0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
a900: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
a910: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
a920: 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 46  DlidxIterNextR(F
a930: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
a940: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
a950: 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20  r, int iLvl){.  
a960: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
a970: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
a980: 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65  l[iLvl];..  asse
a990: 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e  rt( iLvl<pIter->
a9a0: 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74  nLvl );.  if( ft
a9b0: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70  s5DlidxLvlNext(p
a9c0: 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Lvl) ){.    if( 
a9d0: 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72  (iLvl+1) < pIter
a9e0: 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20  ->nLvl ){.      
a9f0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
aa00: 74 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76  tR(p, pIter, iLv
aa10: 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l+1);.      if( 
aa20: 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20  pLvl[1].bEof==0 
aa30: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  ){.        fts5D
aa40: 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
aa50: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >pData);.       
aa60: 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c   memset(pLvl, 0,
aa70: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
aa80: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  xLvl));.        
aa90: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
aaa0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
aab0: 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
aac0: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
aad0: 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c  r->iSegid, iLvl,
aae0: 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67   pLvl[1].iLeafPg
aaf0: 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
ab00: 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
ab10: 3e 70 44 61 74 61 20 29 20 66 74 73 35 44 6c 69  >pData ) fts5Dli
ab20: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b  dxLvlNext(pLvl);
ab30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ab40: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74   }..  return pIt
ab50: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
ab60: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
ab70: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
ab80: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
ab90: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
aba0: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  ter){.  return f
abb0: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
abc0: 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  R(p, pIter, 0);.
abd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
abe0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
abf0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
ac00: 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f  nt has the follo
ac10: 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a  wing fields set.
ac20: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54  ** as follows. T
ac30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
ac40: 73 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66  s up the rest of
ac50: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
ac60: 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e   that it.** poin
ac70: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
ac80: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
ac90: 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  list-index..**.*
aca0: 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20  *   pData:.**   
acb0: 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63    pointer to doc
acc0: 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72  list-index recor
acd0: 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  d, .**.** When t
ace0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
acf0: 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c  called pIter->iL
ad00: 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70  eafPgno is the p
ad10: 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a  age number the.*
ad20: 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73  * doclist is ass
ad30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 28 74 68  ociated with (th
ad40: 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20  e one featuring 
ad50: 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74  the term)..*/.st
ad60: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
ad70: 64 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35  dxIterFirst(Fts5
ad80: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
ad90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
ada0: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
adb0: 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nLvl; i++){.    
adc0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
add0: 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d  (&pIter->aLvl[i]
ade0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
adf0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62  pIter->aLvl[0].b
ae00: 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  Eof;.}...static 
ae10: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
ae20: 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
ae30: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
ae40: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
ae50: 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  rn p->rc!=SQLITE
ae60: 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c  _OK || pIter->aL
ae70: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73  vl[0].bEof;.}..s
ae80: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
ae90: 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73  lidxIterLast(Fts
aea0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
aeb0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
aec0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
aed0: 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65   Advance each le
aee0: 76 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20  vel to the last 
aef0: 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73  entry on the las
af00: 74 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28  t page */.  for(
af10: 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b  i=pIter->nLvl-1;
af20: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
af30: 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  K && i>=0; i--){
af40: 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76  .    Fts5DlidxLv
af50: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
af60: 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77  ->aLvl[i];.    w
af70: 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c  hile( fts5DlidxL
af80: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20  vlNext(pLvl)==0 
af90: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  );.    pLvl->bEo
afa0: 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  f = 0;..    if( 
afb0: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73  i>0 ){.      Fts
afc0: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c  5DlidxLvl *pChil
afd0: 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20  d = &pLvl[-1];. 
afe0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
aff0: 65 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61  ease(pChild->pDa
b000: 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ta);.      memse
b010: 74 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a  t(pChild, 0, siz
b020: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
b030: 29 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64  ));.      pChild
b040: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
b050: 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20  taRead(p, .     
b060: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
b070: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
b080: 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e  gid, i-1, pLvl->
b090: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
b0a0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
b0b0: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
b0c0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
b0d0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
b0e0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76  ment to the prev
b0f0: 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  ious entry..*/.s
b100: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
b110: 69 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44  idxLvlPrev(Fts5D
b120: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a  lidxLvl *pLvl){.
b130: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76    int iOff = pLv
b140: 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  l->iOff;..  asse
b150: 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d  rt( pLvl->bEof==
b160: 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c  0 );.  if( iOff<
b170: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
b180: 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45   ){.    pLvl->bE
b190: 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
b1a0: 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76  .    u8 *a = pLv
b1b0: 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20  l->pData->p;.   
b1c0: 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   i64 iVal;.    i
b1d0: 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69  nt iLimit;.    i
b1e0: 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e  nt ii;.    int n
b1f0: 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Zero = 0;..    /
b200: 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66  * Currently iOff
b210: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
b220: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76  irst byte of a v
b230: 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63  arint. This bloc
b240: 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d  k .    ** decrem
b250: 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20  ents iOff until 
b260: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
b270: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
b280: 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20  he previous .   
b290: 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69   ** varint. Taki
b2a0: 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72  ng care not to r
b2b0: 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c  ead any memory l
b2c0: 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63  ocations that oc
b2d0: 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  cur.    ** befor
b2e0: 65 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20  e the buffer in 
b2f0: 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20  memory.  */.    
b300: 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39  iLimit = (iOff>9
b310: 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a   ? iOff-9 : 0);.
b320: 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20      for(iOff--; 
b330: 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66  iOff>iLimit; iOf
b340: 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  f--){.      if( 
b350: 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38  (a[iOff-1] & 0x8
b360: 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  0)==0 ) break;. 
b370: 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65     }..    fts5Ge
b380: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
b390: 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a  , (u64*)&iVal);.
b3a0: 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64      pLvl->iRowid
b3b0: 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c   -= iVal;.    pL
b3c0: 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b  vl->iLeafPgno--;
b3d0: 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61  ..    /* Skip ba
b3e0: 63 6b 77 61 72 64 73 20 70 61 73 74 20 61 6e 79  ckwards past any
b3f0: 20 30 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a   0x00 varints. *
b400: 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66  /.    for(ii=iOf
b410: 66 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69  f-1; ii>=pLvl->i
b420: 46 69 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69  FirstOff && a[ii
b430: 5d 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a  ]==0x00; ii--){.
b440: 20 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20        nZero++;. 
b450: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e     }.    if( ii>
b460: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
b470: 20 26 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38   && (a[ii] & 0x8
b480: 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  0) ){.      /* T
b490: 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74  he byte immediat
b4a0: 65 6c 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c  ely before the l
b4b0: 61 73 74 20 30 78 30 30 20 62 79 74 65 20 68 61  ast 0x00 byte ha
b4c0: 73 20 74 68 65 20 30 78 38 30 20 62 69 74 0a 20  s the 0x80 bit. 
b4d0: 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20       ** set. So 
b4e0: 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 69 73  the last 0x00 is
b4f0: 20 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30   only a varint 0
b500: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 38 20   if there are 8 
b510: 6d 6f 72 65 20 30 78 38 30 0a 20 20 20 20 20 20  more 0x80.      
b520: 2a 2a 20 62 79 74 65 73 20 62 65 66 6f 72 65 20  ** bytes before 
b530: 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20  a[ii]. */.      
b540: 69 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20  int bZero = 0;  
b550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b560: 72 75 65 20 69 66 20 6c 61 73 74 20 30 78 30 30  rue if last 0x00
b570: 20 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20   counts */.     
b580: 20 69 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76   if( (ii-8)>=pLv
b590: 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a  l->iFirstOff ){.
b5a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
b5b0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20         for(j=1; 
b5c0: 6a 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d  j<=8 && (a[ii-j]
b5d0: 20 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a   & 0x80); j++);.
b5e0: 20 20 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20          bZero = 
b5f0: 28 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (j>8);.      }. 
b600: 20 20 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d       if( bZero==
b610: 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20  0 ) nZero--;.   
b620: 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65   }.    pLvl->iLe
b630: 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b  afPgno -= nZero;
b640: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
b650: 3d 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a  = iOff - nZero;.
b660: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c    }..  return pL
b670: 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61  vl->bEof;.}..sta
b680: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
b690: 78 49 74 65 72 50 72 65 76 52 28 46 74 73 35 49  xIterPrevR(Fts5I
b6a0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
b6b0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  dxIter *pIter, i
b6c0: 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35  nt iLvl){.  Fts5
b6d0: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d  DlidxLvl *pLvl =
b6e0: 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c   &pIter->aLvl[iL
b6f0: 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  vl];..  assert( 
b700: 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c  iLvl<pIter->nLvl
b710: 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c   );.  if( fts5Dl
b720: 69 64 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29  idxLvlPrev(pLvl)
b730: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76   ){.    if( (iLv
b740: 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c  l+1) < pIter->nL
b750: 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  vl ){.      fts5
b760: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70  DlidxIterPrevR(p
b770: 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29  , pIter, iLvl+1)
b780: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
b790: 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20  [1].bEof==0 ){. 
b7a0: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
b7b0: 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61  elease(pLvl->pDa
b7c0: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ta);.        mem
b7d0: 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a  set(pLvl, 0, siz
b7e0: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
b7f0: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c  ));.        pLvl
b800: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
b810: 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20  taRead(p, .     
b820: 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44         FTS5_DLID
b830: 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69  X_ROWID(pIter->i
b840: 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76  Segid, iLvl, pLv
b850: 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a  l[1].iLeafPgno).
b860: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
b870: 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61     if( pLvl->pDa
b880: 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
b890: 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
b8a0: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30  LvlNext(pLvl)==0
b8b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c   );.          pL
b8c0: 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20  vl->bEof = 0;.  
b8d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b8e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
b8f0: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
b900: 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69  0].bEof;.}.stati
b910: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
b920: 74 65 72 50 72 65 76 28 46 74 73 35 49 6e 64 65  terPrev(Fts5Inde
b930: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
b940: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
b950: 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49  eturn fts5DlidxI
b960: 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65  terPrevR(p, pIte
b970: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
b980: 46 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  Free a doclist-i
b990: 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62  ndex iterator ob
b9a0: 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62  ject allocated b
b9b0: 79 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  y fts5DlidxIterI
b9c0: 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nit()..*/.static
b9d0: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
b9e0: 74 65 72 46 72 65 65 28 46 74 73 35 44 6c 69 64  terFree(Fts5Dlid
b9f0: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
ba00: 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
ba10: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
ba20: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
ba30: 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Lvl; i++){.     
ba40: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
ba50: 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e  (pIter->aLvl[i].
ba60: 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
ba70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ba80: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
ba90: 61 74 69 63 20 46 74 73 35 44 6c 69 64 78 49 74  atic Fts5DlidxIt
baa0: 65 72 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65  er *fts5DlidxIte
bab0: 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
bac0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
bad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35           /* Fts5
bae0: 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   Backend to iter
baf0: 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
bb00: 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45  /* True for ORDE
bb30: 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e  R BY ASC */.  in
bb40: 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  t iSegid,       
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb60: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
bb70: 20 69 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20   int iLeafPg    
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75   /* Leaf page nu
bba0: 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69  mber to load dli
bbb0: 64 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46  dx for */.){.  F
bbc0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
bbd0: 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ter = 0;.  int i
bbe0: 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20  ;.  int bDone = 
bbf0: 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70  0;..  for(i=0; p
bc00: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
bc10: 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b  && bDone==0; i++
bc20: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
bc30: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c   = sizeof(Fts5Dl
bc40: 69 64 78 49 74 65 72 29 20 2b 20 69 20 2a 20 73  idxIter) + i * s
bc50: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
bc60: 76 6c 29 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  vl);.    Fts5Dli
bc70: 64 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20  dxIter *pNew;.. 
bc80: 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 44     pNew = (Fts5D
bc90: 6c 69 64 78 49 74 65 72 2a 29 73 71 6c 69 74 65  lidxIter*)sqlite
bca0: 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c  3_realloc(pIter,
bcb0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
bcc0: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
bcd0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
bce0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
bcf0: 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  e{.      i64 iRo
bd00: 77 69 64 20 3d 20 46 54 53 35 5f 44 4c 49 44 58  wid = FTS5_DLIDX
bd10: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
bd20: 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20 20 20 20  , iLeafPg);.    
bd30: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
bd40: 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c  pLvl = &pNew->aL
bd50: 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49 74  vl[i];.      pIt
bd60: 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  er = pNew;.     
bd70: 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c   memset(pLvl, 0,
bd80: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
bd90: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c  xLvl));.      pL
bda0: 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
bdb0: 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
bdc0: 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
bdd0: 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26 20 28 70  Lvl->pData && (p
bde0: 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d  Lvl->pData->p[0]
bdf0: 20 26 20 30 78 30 30 30 31 29 3d 3d 30 20 29 7b   & 0x0001)==0 ){
be00: 0a 20 20 20 20 20 20 20 20 62 44 6f 6e 65 20 3d  .        bDone =
be10: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
be20: 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20    pIter->nLvl = 
be30: 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  i+1;.    }.  }..
be40: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
be50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49  ITE_OK ){.    pI
be60: 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  ter->iSegid = iS
be70: 65 67 69 64 3b 0a 20 20 20 20 69 66 28 20 62 52  egid;.    if( bR
be80: 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ev==0 ){.      f
be90: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
bea0: 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65  t(pIter);.    }e
beb0: 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44  lse{.      fts5D
bec0: 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70 2c 20  lidxIterLast(p, 
bed0: 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
bee0: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  }..  if( p->rc!=
bef0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bf00: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
bf10: 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70  ee(pIter);.    p
bf20: 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Iter = 0;.  }.. 
bf30: 20 72 65 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d   return pIter;.}
bf40: 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  ..static i64 fts
bf50: 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
bf60: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
bf70: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
bf80: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69  pIter->aLvl[0].i
bf90: 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20  Rowid;.}.static 
bfa0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
bfb0: 72 50 67 6e 6f 28 46 74 73 35 44 6c 69 64 78 49  rPgno(Fts5DlidxI
bfc0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
bfd0: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
bfe0: 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a  l[0].iLeafPgno;.
bff0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
c000: 74 73 35 4c 65 61 66 48 65 61 64 65 72 28 46 74  ts5LeafHeader(Ft
c010: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 2c 20 69  s5Data *pLeaf, i
c020: 6e 74 20 2a 70 69 52 6f 77 69 64 2c 20 69 6e 74  nt *piRowid, int
c030: 20 2a 70 69 54 65 72 6d 29 7b 0a 20 20 2a 70 69   *piTerm){.  *pi
c040: 52 6f 77 69 64 20 3d 20 28 69 6e 74 29 66 74 73  Rowid = (int)fts
c050: 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
c060: 70 5b 30 5d 29 3b 0a 20 20 2a 70 69 54 65 72 6d  p[0]);.  *piTerm
c070: 20 3d 20 28 69 6e 74 29 66 74 73 35 47 65 74 55   = (int)fts5GetU
c080: 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29  16(&pLeaf->p[2])
c090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
c0a0: 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61  the next leaf pa
c0b0: 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d  ge into the segm
c0c0: 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f  ent iterator..*/
c0d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c0e0: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
c0f0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
c100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c110: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
c120: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
c130: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
c140: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
c150: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
c160: 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70  dvance to next p
c170: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  age */.){.  Fts5
c180: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
c190: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
c1a0: 70 53 65 67 3b 0a 20 20 66 74 73 35 44 61 74 61  pSeg;.  fts5Data
c1b0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
c1c0: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
c1d0: 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69  iLeafPgno++;.  i
c1e0: 66 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  f( pIter->pNextL
c1f0: 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
c200: 74 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  t( pIter->iLeafP
c210: 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  gno<=pSeg->pgnoL
c220: 61 73 74 20 29 3b 0a 20 20 20 20 70 49 74 65 72  ast );.    pIter
c230: 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d  ->pLeaf = pIter-
c240: 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20 20 20 20  >pNextLeaf;.    
c250: 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
c260: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
c270: 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ( pIter->iLeafPg
c280: 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  no<=pSeg->pgnoLa
c290: 73 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  st ){.    pIter-
c2a0: 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74  >pLeaf = fts5Dat
c2b0: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
c2c0: 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52    FTS5_SEGMENT_R
c2d0: 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69  OWID(pSeg->iSegi
c2e0: 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65  d, 0, pIter->iLe
c2f0: 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20  afPgno).    );. 
c300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
c310: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
c320: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  }.}../*.** Argum
c330: 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20  ent p points to 
c340: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
c350: 69 6e 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20  ing a varint to 
c360: 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  be interpreted a
c370: 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20  s a.** position 
c380: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e  list size field.
c390: 20 52 65 61 64 20 74 68 65 20 76 61 72 69 6e 74   Read the varint
c3a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
c3b0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a  number of bytes.
c3c0: 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20  ** read. Before 
c3d0: 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a  returning, set *
c3e0: 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62  pnSz to the numb
c3f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
c400: 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c  he position.** l
c410: 69 73 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20  ist, and *pbDel 
c420: 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 64  to true if the d
c430: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
c440: 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  t, or false othe
c450: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
c460: 20 69 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c   int fts5GetPosl
c470: 69 73 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38  istSize(const u8
c480: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20   *p, int *pnSz, 
c490: 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69  int *pbDel){.  i
c4a0: 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20  nt nSz;.  int n 
c4b0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
c4c0: 32 28 70 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73  2(p, nSz);.  ass
c4d0: 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29  ert_nc( nSz>=0 )
c4e0: 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f  ;.  *pnSz = nSz/
c4f0: 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53  2;.  *pbDel = nS
c500: 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65  z & 0x0001;.  re
c510: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
c520: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
c530: 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74  afOffset current
c540: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
c550: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
c560: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
c570: 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65  t size field. Re
c580: 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
c590: 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74  the field and st
c5a0: 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65  ore it.** in the
c5b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
c5c0: 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74  bles:.**.**   Ft
c5d0: 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a  s5SegIter.nPos.*
c5e0: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
c5f0: 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65  bDel.**.** Leave
c600: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
c610: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e  afOffset pointin
c620: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  g to the first b
c630: 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  yte of the .** p
c640: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  osition list con
c650: 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a  tent (if any)..*
c660: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
c670: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
c680: 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
c690: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
c6a0: 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er){.  if( p->rc
c6b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c6c0: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49     int iOff = pI
c6d0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c6e0: 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20  ;  /* Offset to 
c6f0: 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 69  read at */.    i
c700: 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  f( iOff>=pIter->
c710: 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20  pLeaf->n ){.    
c720: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
c730: 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73  ORRUPT;.    }els
c740: 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  e{.      const u
c750: 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70  8 *a = &pIter->p
c760: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3b 0a 20  Leaf->p[iOff];. 
c770: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
c780: 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47  fOffset += fts5G
c790: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 61 2c  etPoslistSize(a,
c7a0: 20 26 70 49 74 65 72 2d 3e 6e 50 6f 73 2c 20 26   &pIter->nPos, &
c7b0: 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20  pIter->bDel);.  
c7c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
c7d0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
c7e0: 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74  afOffset current
c7f0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
c800: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
c810: 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22  he .** "nSuffix"
c820: 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65 72 6d   field of a term
c830: 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  . Function param
c840: 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61  eter nKeep conta
c850: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  ins the value.**
c860: 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66 69 78   of the "nPrefix
c870: 22 20 66 69 65 6c 64 20 28 69 66 20 74 68 65 72  " field (if ther
c880: 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74 20 69  e was one - it i
c890: 73 20 70 61 73 73 65 64 20 30 20 69 66 20 74 68  s passed 0 if th
c8a0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
c8b0: 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73  st term in the s
c8c0: 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54  egment)..**.** T
c8d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  his function pop
c8e0: 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ulates:.**.**   
c8f0: 46 74 73 35 53 65 67 49 74 65 72 2e 74 65 72 6d  Fts5SegIter.term
c900: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
c910: 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63  r.rowid.**.** ac
c920: 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65  cordingly and le
c930: 61 76 65 73 20 28 46 74 73 35 53 65 67 49 74 65  aves (Fts5SegIte
c940: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29 20 73  r.iLeafOffset) s
c950: 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  et to the conten
c960: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  t of.** the firs
c970: 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e  t position list.
c980: 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   The position li
c990: 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  st belonging to 
c9a0: 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74  document .** (Ft
c9b0: 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77 69 64  s5SegIter.iRowid
c9c0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
c9d0: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
c9e0: 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 20  dTerm(Fts5Index 
c9f0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
ca00: 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65  *pIter, int nKee
ca10: 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  p){.  u8 *a = pI
ca20: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
ca30: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
ca40: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
ca50: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
ca60: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
ca70: 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74  fset;  /* Offset
ca80: 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20   to read at */. 
ca90: 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e 65 77   /* Bytes of new
cac0: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66   data */..  iOff
cad0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
cae0: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e  t32(&a[iOff], nN
caf0: 65 77 29 3b 0a 20 20 70 49 74 65 72 2d 3e 74 65  ew);.  pIter->te
cb00: 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  rm.n = nKeep;.  
cb10: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
cb20: 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49  Blob(&p->rc, &pI
cb30: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
cb40: 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f   &a[iOff]);.  iO
cb50: 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49  ff += nNew;.  pI
cb60: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
cb70: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70  fset = iOff;.  p
cb80: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
cb90: 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
cba0: 61 66 50 67 6e 6f 3b 0a 20 20 69 66 28 20 69 4f  afPgno;.  if( iO
cbb0: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
cbc0: 2d 3e 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 53  ->n ){.    fts5S
cbd0: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
cbe0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  , pIter);.    if
cbf0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
cc00: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
cc10: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
cc20: 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
cc30: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65  ORRUPT;.      re
cc40: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
cc50: 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20  iOff = 4;.    a 
cc60: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
cc70: 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d  p;.  }.  iOff +=
cc80: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
cc90: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
cca0: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
ccb0: 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e  owid);.  pIter->
ccc0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
ccd0: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ff;.}../*.** Ini
cce0: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72  tialize the iter
ccf0: 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65  ator object pIte
cd00: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
cd10: 6f 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73  ough the entries
cd20: 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70   in.** segment p
cd30: 53 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f  Seg. The iterato
cd40: 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
cd50: 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
cd60: 65 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74  entry when .** t
cd70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
cd80: 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  urns..**.** If a
cd90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
cda0: 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
cdb0: 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
cdc0: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
cdd0: 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
cde0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
cdf0: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
ce00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
ce10: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
ce20: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
ce30: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e  id fts5SegIterIn
ce40: 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
ce50: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ce60: 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
ce70: 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  ex object */.  F
ce80: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
ce90: 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f  ent *pSeg,     /
cea0: 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
ceb0: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
cec0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cee0: 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
cef0: 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ate */.){.  if( 
cf00: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d  pSeg->pgnoFirst=
cf10: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
cf20: 73 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  s happens if the
cf30: 20 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e   segment is bein
cf40: 67 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70  g used as an inp
cf50: 75 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65  ut to an increme
cf60: 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67  ntal.    ** merg
cf70: 65 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68  e and all data h
cf80: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
cf90: 22 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66  "trimmed". See f
cfa0: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66  unction.    ** f
cfb0: 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
cfc0: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49  ) for details. I
cfd0: 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76  n this case leav
cfe0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65  e the iterator e
cff0: 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65  mpty..    ** The
d000: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65   caller will see
d010: 20 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65   the (pIter->pLe
d020: 61 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d  af==0) and assum
d030: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  e the iterator i
d040: 73 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20  s.    ** at EOF 
d050: 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20  already. */.    
d060: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
d070: 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Leaf==0 );.    r
d080: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
d090: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d0a0: 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  OK ){.    memset
d0b0: 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
d0c0: 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20  f(*pIter));.    
d0d0: 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
d0e0: 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  eg;.    pIter->i
d0f0: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d  LeafPgno = pSeg-
d100: 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20  >pgnoFirst-1;.  
d110: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
d120: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
d130: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
d140: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d150: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65      u8 *a = pIte
d160: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
d170: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d180: 73 65 74 20 3d 20 66 74 73 35 47 65 74 55 31 36  set = fts5GetU16
d190: 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 66 74 73  (&a[2]);.    fts
d1a0: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
d1b0: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
d1c0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
d1d0: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
d1e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
d1f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d200: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
d210: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
d220: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74  eated by calls t
d230: 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75  o.** Fts5IndexQu
d240: 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20 46  ery() with the F
d250: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
d260: 45 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ESC flag set..**
d270: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
d280: 20 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61   is in an unusua
d290: 6c 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  l state when thi
d2a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d2b0: 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73  lled: the.** Fts
d2c0: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
d2d0: 66 73 65 74 20 76 61 72 69 61 62 6c 65 20 69 73  fset variable is
d2e0: 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
d2f0: 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  et of the start 
d300: 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69  of.** the positi
d310: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
d320: 6c 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ld for the first
d330: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
d340: 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  on the page..** 
d350: 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69  Fts5SegIter.rowi
d360: 64 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50  d is set, but nP
d370: 6f 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20  os and bDel are 
d380: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  not..**.** This 
d390: 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65  function advance
d3a0: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  s the iterator s
d3b0: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
d3c0: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a   to the last .**
d3d0: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
d3e0: 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c  on the page and,
d3f0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69   if necessary, i
d400: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a  nitializes the .
d410: 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  ** aRowidOffset[
d420: 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73  ] and iRowidOffs
d430: 65 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74  et variables. At
d440: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
d450: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  iterator.** is i
d460: 6e 20 69 74 73 20 72 65 67 75 6c 61 72 20 73 74  n its regular st
d470: 61 74 65 20 2d 20 46 74 73 35 53 65 67 49 74 65  ate - Fts5SegIte
d480: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
d490: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
d4a0: 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65  t.** byte of the
d4b0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
d4c0: 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65  ontent associate
d4d0: 64 20 77 69 74 68 20 73 61 69 64 20 72 6f 77 69  d with said rowi
d4e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
d4f0: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
d500: 65 72 73 65 49 6e 69 74 50 61 67 65 28 46 74 73  erseInitPage(Fts
d510: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
d520: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
d530: 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d    int n = pIter-
d540: 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 20 20 69 6e 74  >pLeaf->n;.  int
d550: 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61   i = pIter->iLea
d560: 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61  fOffset;.  u8 *a
d570: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
d580: 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64  >p;.  int iRowid
d590: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 77  Offset = 0;..  w
d5a0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
d5b0: 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20  64 iDelta = 0;. 
d5c0: 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
d5d0: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20   int bDummy;..  
d5e0: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f    i += fts5GetPo
d5f0: 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d 2c  slistSize(&a[i],
d600: 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
d610: 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b  ;.    i += nPos;
d620: 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29 20  .    if( i>=n ) 
d630: 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d 20  break;.    i += 
d640: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
d650: 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  [i], (u64*)&iDel
d660: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 69 44 65  ta);.    if( iDe
d670: 6c 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  lta==0 ) break;.
d680: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
d690: 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20  d += iDelta;..  
d6a0: 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73    if( iRowidOffs
d6b0: 65 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69  et>=pIter->nRowi
d6c0: 64 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  dOffset ){.     
d6d0: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65   int nNew = pIte
d6e0: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
d6f0: 2b 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  + 8;.      int *
d700: 61 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c  aNew = (int*)sql
d710: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74  ite3_realloc(pIt
d720: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
d730: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e  , nNew*sizeof(in
d740: 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  t));.      if( a
d750: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
d760: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
d770: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
d780: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d790: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77       pIter->aRow
d7a0: 69 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b  idOffset = aNew;
d7b0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52  .      pIter->nR
d7c0: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65  owidOffset = nNe
d7d0: 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49  w;.    }..    pI
d7e0: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
d7f0: 74 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b  t[iRowidOffset++
d800: 5d 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ] = pIter->iLeaf
d810: 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65  Offset;.    pIte
d820: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d830: 20 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d   i;.  }.  pIter-
d840: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20  >iRowidOffset = 
d850: 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20  iRowidOffset;.  
d860: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
d870: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  Pos(p, pIter);.}
d880: 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
d890: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
d8a0: 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
d8b0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
d8c0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
d8d0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  r){.  assert( pI
d8e0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
d8f0: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
d900: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
d910: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
d920: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
d930: 52 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74  RM );..  fts5Dat
d940: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
d950: 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d  pLeaf);.  pIter-
d960: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68  >pLeaf = 0;.  wh
d970: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
d980: 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e  TE_OK && pIter->
d990: 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
d9a0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
d9b0: 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
d9c0: 70 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d  pNew;.    pIter-
d9d0: 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20  >iLeafPgno--;.  
d9e0: 20 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74    pNew = fts5Dat
d9f0: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
da00: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20  GMENT_ROWID(.   
da10: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53         pIter->pS
da20: 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  eg->iSegid, 0, p
da30: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a  Iter->iLeafPgno.
da40: 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20      ));.    if( 
da50: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  pNew ){.      if
da60: 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ( pIter->iLeafPg
da70: 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d  no==pIter->iTerm
da80: 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
da90: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
daa0: 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70  TermLeafOffset<p
dab0: 4e 65 77 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  New->n ){.      
dac0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
dad0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
dae0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
daf0: 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69  ffset = pIter->i
db00: 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a  TermLeafOffset;.
db10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
db20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
db30: 6e 74 20 69 52 6f 77 69 64 4f 66 66 2c 20 64 75  nt iRowidOff, du
db40: 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 66 74 73  mmy;.        fts
db50: 35 4c 65 61 66 48 65 61 64 65 72 28 70 4e 65 77  5LeafHeader(pNew
db60: 2c 20 26 69 52 6f 77 69 64 4f 66 66 2c 20 26 64  , &iRowidOff, &d
db70: 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 69  ummy);.        i
db80: 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a  f( iRowidOff ){.
db90: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
dba0: 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20  >pLeaf = pNew;. 
dbb0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
dbc0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52  iLeafOffset = iR
dbd0: 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20  owidOff;.       
dbe0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
dbf0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
dc00: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  af ){.        u8
dc10: 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c   *a = &pIter->pL
dc20: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c  eaf->p[pIter->iL
dc30: 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  eafOffset];.    
dc40: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
dc50: 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65  Offset += fts5Ge
dc60: 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a  tVarint(a, (u64*
dc70: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
dc80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
dc90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dca0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
dcb0: 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
dcc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
dcd0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
dce0: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
dcf0: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
dd00: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
dd10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
dd20: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
dd30: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
dd40: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
dd50: 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
dd60: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
dd70: 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41  delete marker. A
dd80: 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69   delete marker i
dd90: 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  s an entry with 
dda0: 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69  a 0 byte.** posi
ddb0: 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  tion-list..*/.st
ddc0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
ddd0: 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 46 74  tiIterIsEmpty(Ft
dde0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
ddf0: 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
de00: 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49  ter){.  Fts5SegI
de10: 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
de20: 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
de30: 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
de40: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  ];.  return (p->
de50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
de60: 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20   pSeg->pLeaf && 
de70: 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a  pSeg->nPos==0);.
de80: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
de90: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
dea0: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
deb0: 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  y. .**.** If an 
dec0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
ded0: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
dee0: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
def0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
df00: 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  It .** is not co
df10: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
df20: 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
df30: 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49  r reaches EOF. I
df40: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
df50: 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
df60: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
df70: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
df80: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
df90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dfa0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
dfb0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
dfe0: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
dff0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
e000: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
e010: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
e020: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  vance */.  int *
e030: 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
e040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
e050: 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74  T: Set for new t
e060: 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  erm */.){.  asse
e070: 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30  rt( pbNewTerm==0
e080: 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d   || *pbNewTerm==
e090: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  0 );.  if( p->rc
e0a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e0b0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c     if( pIter->fl
e0c0: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e0d0: 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20  ER_REVERSE ){.  
e0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
e0f0: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  r->pNextLeaf==0 
e100: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
e110: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
e120: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  >0 ){.        u8
e130: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
e140: 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 69  af->p;.        i
e150: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20  nt iOff;.       
e160: 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
e170: 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
e180: 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74         i64 iDelt
e190: 61 3b 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65  a;..        pIte
e1a0: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d  r->iRowidOffset-
e1b0: 2d 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  -;.        pIter
e1c0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
e1d0: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52  iOff = pIter->aR
e1e0: 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72  owidOffset[pIter
e1f0: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b  ->iRowidOffset];
e200: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
e210: 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
e220: 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e  ize(&a[iOff], &n
e230: 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
e240: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
e250: 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 66 74 73  Pos;.        fts
e260: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
e270: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
e280: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  ta);.        pIt
e290: 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44  er->iRowid -= iD
e2a0: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 66 74  elta;.        ft
e2b0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
e2c0: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
e2d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e2e0: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
e2f0: 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
e300: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
e310: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e320: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
e330: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a  = pIter->pLeaf;.
e340: 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
e350: 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65        int bNewTe
e360: 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  rm = 0;.      in
e370: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20  t nKeep = 0;..  
e380: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
e390: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
e3a0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77   position list w
e3b0: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
e3c0: 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  t page. */.     
e3d0: 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e   u8 *a = pLeaf->
e3e0: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  p;.      int n =
e3f0: 20 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20   pLeaf->n;..    
e400: 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
e410: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49  iLeafOffset + pI
e420: 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 20 20  ter->nPos;..    
e430: 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
e440: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
e450: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20  ext entry is on 
e460: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
e470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 36 34 20   */.        u64 
e480: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
e490: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
e4a0: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
e4b0: 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b  iOff], &iDelta);
e4c0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
e4d0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
e4e0: 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
e4f0: 69 44 65 6c 74 61 3d 3d 30 20 29 7b 0a 20 20 20  iDelta==0 ){.   
e500: 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20         bNewTerm 
e510: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 1;.          i
e520: 66 28 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20  f( iOff>=n ){.  
e530: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
e540: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
e550: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
e560: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e570: 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20  fOffset = 4;.   
e580: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
e590: 20 69 4f 66 66 21 3d 66 74 73 35 47 65 74 55 31   iOff!=fts5GetU1
e5a0: 36 28 26 61 5b 32 5d 29 20 29 7b 0a 20 20 20 20  6(&a[2]) ){.    
e5b0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e5c0: 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74  LeafOffset += ft
e5d0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
e5e0: 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
e5f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e600: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e610: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77       pIter->iRow
e620: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
e630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e640: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
e650: 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Seg==0 ){.      
e660: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73    const u8 *pLis
e670: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  t = 0;.        c
e680: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
e690: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c  ;.        int nL
e6a0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ist;.        if(
e6b0: 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67   0==(pIter->flag
e6c0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
e6d0: 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20  _ONETERM) ){.   
e6e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
e6f0: 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
e700: 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20  ->pHash);.      
e710: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
e720: 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e  ashScanEntry(p->
e730: 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
e740: 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
e750: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e760: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e770: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
e780: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
e790: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
e7a0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e7b0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  f = 0;.        }
e7c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e7d0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20  pIter->pLeaf->p 
e7e0: 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20  = (u8*)pList;.  
e7f0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
e800: 4c 65 61 66 2d 3e 6e 20 3d 20 6e 4c 69 73 74 3b  Leaf->n = nList;
e810: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e820: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
e830: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
e840: 74 65 72 6d 2c 20 73 74 72 6c 65 6e 28 7a 54 65  term, strlen(zTe
e850: 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d 29  rm), (u8*)zTerm)
e860: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e870: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e880: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
e890: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
e8a0: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
e8b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
e8c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  se{.        iOff
e8d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a   = 0;.        /*
e8e0: 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e   Next entry is n
e8f0: 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ot on the curren
e900: 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  t page */.      
e910: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30    while( iOff==0
e920: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
e930: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
e940: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
e950: 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70         pLeaf = p
e960: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20  Iter->pLeaf;.   
e970: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
e980: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e990: 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66         if( (iOff
e9a0: 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
e9b0: 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20 29 7b 0a  Leaf->p[0])) ){.
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
e9d0: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
e9e0: 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
e9f0: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
ea00: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
ea10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
ea20: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
ea30: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
ea40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c    }.          el
ea50: 73 65 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66  se if( (iOff = f
ea60: 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
ea70: 2d 3e 70 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  ->p[2])) ){.    
ea80: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
ea90: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
eaa0: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  f;.            b
eab0: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
eac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ead0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
eae0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
eaf0: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f  e iterator is no
eb00: 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c  w at EOF. If so,
eb10: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
eb20: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  /.      if( pIte
eb30: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
eb40: 20 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d      if( bNewTerm
eb50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
eb60: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
eb70: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
eb80: 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20  ETERM ){.       
eb90: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
eba0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
ebb0: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
ebc0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
ebd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
ebe0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e{.            f
ebf0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
ec00: 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65  rm(p, pIter, nKe
ec10: 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ep);.           
ec20: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
ec30: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
ec50: 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e  pbNewTerm ) *pbN
ec60: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
ec70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ec80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ec90: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
eca0: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
ecb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ecc0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  }.    }.  }.}..#
ecd0: 64 65 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54  define SWAPVAL(T
ece0: 2c 20 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b  , a, b) { T tmp;
ecf0: 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74   tmp=a; a=b; b=t
ed00: 6d 70 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  mp; }../*.** Ite
ed10: 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72  rator pIter curr
ed20: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
ed30: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
ed40: 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68  in a doclist. Th
ed50: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  is.** function s
ed60: 65 74 73 20 74 68 65 20 69 74 65 72 61 74 6f 72  ets the iterator
ed70: 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 65 72   up so that iter
ed80: 61 74 65 73 20 69 6e 20 72 65 76 65 72 73 65 20  ates in reverse 
ed90: 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a  order through.**
eda0: 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f   the doclist..*/
edb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
edc0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
edd0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ede0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
edf0: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
ee00: 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74  er *pDlidx = pIt
ee10: 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74  er->pDlidx;.  Ft
ee20: 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20  s5Data *pLast = 
ee30: 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73  0;.  int pgnoLas
ee40: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44  t = 0;..  if( pD
ee50: 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  lidx ){.    int 
ee60: 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e  iSegid = pIter->
ee70: 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
ee80: 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73    pgnoLast = fts
ee90: 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
eea0: 44 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73  Dlidx);.    pLas
eeb0: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
eec0: 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
eed0: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30  _ROWID(iSegid, 0
eee0: 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20  , pgnoLast));.  
eef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
ef00: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
ef30: 74 20 77 69 74 68 69 6e 20 70 4c 65 61 66 20 2a  t within pLeaf *
ef40: 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
ef50: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
ef60: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  Leaf;         /*
ef70: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
ef80: 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75  ta */..    /* Cu
ef90: 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67  rrently, Fts5Seg
efa0: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
efb0: 20 28 61 6e 64 20 69 4f 66 66 29 20 70 6f 69 6e   (and iOff) poin
efc0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
efd0: 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 66 20  .    ** byte of 
efe0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f  position-list co
eff0: 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75  ntent for the cu
f000: 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63  rrent rowid. Bac
f010: 6b 20 69 74 20 75 70 0a 20 20 20 20 2a 2a 20 73  k it up.    ** s
f020: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
f030: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
f040: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
f050: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a  st size field. *
f060: 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  /.    pIter->iLe
f070: 61 66 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69  afOffset -= sqli
f080: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
f090: 4c 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a  Len(pIter->nPos*
f0a0: 32 2b 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a  2+pIter->bDel);.
f0b0: 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72      iOff = pIter
f0c0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
f0d0: 20 20 20 61 73 73 65 72 74 28 20 69 4f 66 66 3e     assert( iOff>
f0e0: 3d 34 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  =4 );..    /* Se
f0f0: 61 72 63 68 20 66 6f 72 20 61 20 6e 65 77 20 74  arch for a new t
f100: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63  erm within the c
f110: 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 49 66 20  urrent leaf. If 
f120: 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  one can be found
f130: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
f140: 69 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  is page contains
f150: 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77   the largest row
f160: 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  id for the curre
f170: 6e 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  nt term. */.    
f180: 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61  while( iOff<pLea
f190: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  f->n ){.      in
f1a0: 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 36  t nPos;.      i6
f1b0: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
f1c0: 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20  int bDummy;..   
f1d0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70     /* Read the p
f1e0: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
f1f0: 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20  e field */.     
f200: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
f210: 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 4c 65  PoslistSize(&pLe
f220: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50  af->p[iOff], &nP
f230: 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
f240: 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73      iOff += nPos
f250: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
f260: 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 20 62 72 65  >=pLeaf->n ) bre
f270: 61 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 6f  ak;..      /* Ro
f280: 77 69 64 20 64 65 6c 74 61 2e 20 4f 72 2c 20 69  wid delta. Or, i
f290: 66 20 30 78 30 30 2c 20 74 68 65 20 65 6e 64 20  f 0x00, the end 
f2a0: 6f 66 20 64 6f 63 6c 69 73 74 20 6d 61 72 6b 65  of doclist marke
f2b0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73  r. */.      nPos
f2c0: 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
f2d0: 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
f2e0: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
f2f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 65 6c  ;.      if( iDel
f300: 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ta==0 ) break;. 
f310: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f       iOff += nPo
f320: 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  s;.    }..    /*
f330: 20 49 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69   If this conditi
f340: 6f 6e 20 69 73 20 74 72 75 65 20 74 68 65 6e 20  on is true then 
f350: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69  the largest rowi
f360: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
f370: 74 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61  t.    ** term ma
f380: 79 20 6e 6f 74 20 62 65 20 73 74 6f 72 65 64 20  y not be stored 
f390: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
f3a0: 61 67 65 2e 20 53 6f 20 73 65 61 72 63 68 20 66  age. So search f
f3b0: 6f 72 77 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a  orward to.    **
f3c0: 20 73 65 65 20 77 68 65 72 65 20 73 61 69 64 20   see where said 
f3d0: 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 69 73 2e  rowid really is.
f3e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 66    */.    if( iOf
f3f0: 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  f>=pLeaf->n ){. 
f400: 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20       int pgno;. 
f410: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
f420: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
f430: 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a  = pIter->pSeg;..
f440: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73        /* The las
f450: 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64  t rowid in the d
f460: 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62  oclist may not b
f470: 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e on the current
f480: 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20   page. Search.  
f490: 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74      ** forward t
f4a0: 6f 20 66 69 6e 64 20 74 68 65 20 70 61 67 65 20  o find the page 
f4b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
f4c0: 61 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20  ast rowid.  */. 
f4d0: 20 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49       for(pgno=pI
f4e0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31  ter->iLeafPgno+1
f4f0: 3b 20 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f  ; !p->rc && pgno
f500: 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  <=pSeg->pgnoLast
f510: 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20  ; pgno++){.     
f520: 20 20 20 69 36 34 20 69 41 62 73 20 3d 20 46 54     i64 iAbs = FT
f530: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
f540: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30  (pSeg->iSegid, 0
f550: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
f560: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20   Fts5Data *pNew 
f570: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
f580: 2c 20 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20  , iAbs);.       
f590: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
f5a0: 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
f5b0: 64 2c 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  d, iTerm;.      
f5c0: 20 20 20 20 66 74 73 35 4c 65 61 66 48 65 61 64      fts5LeafHead
f5d0: 65 72 28 70 4e 65 77 2c 20 26 69 52 6f 77 69 64  er(pNew, &iRowid
f5e0: 2c 20 26 69 54 65 72 6d 29 3b 0a 20 20 20 20 20  , &iTerm);.     
f5f0: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 20       if( iRowid 
f600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
f610: 57 41 50 56 41 4c 28 46 74 73 35 44 61 74 61 2a  WAPVAL(Fts5Data*
f620: 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a  , pNew, pLast);.
f630: 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f              pgno
f640: 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Last = pgno;.   
f650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f660: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
f670: 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  se(pNew);.      
f680: 20 20 20 20 69 66 28 20 69 54 65 72 6d 20 29 20      if( iTerm ) 
f690: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f6b0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73   }..  /* If pLas
f6c0: 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69  t is NULL at thi
f6d0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
f6e0: 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72  e last rowid for
f6f0: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20   this doclist.  
f700: 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  ** lies on the p
f710: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  age currently in
f720: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
f730: 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73  terator. In this
f740: 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65   case .  ** pIte
f750: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69  r->iLeafOffset i
f760: 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
f770: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f   point to the po
f780: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
f790: 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f  .  ** field asso
f7a0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
f7b0: 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72  first relevant r
f7c0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
f7d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20  ..  **.  ** Or, 
f7e0: 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d  if pLast is non-
f7f0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
f800: 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63   the page that c
f810: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74  ontains the last
f820: 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20  .  ** rowid. In 
f830: 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67  this case config
f840: 75 72 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ure the iterator
f850: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
f860: 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66  ts to the.  ** f
f870: 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  irst rowid on th
f880: 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  is page..  */.  
f890: 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20  if( pLast ){.   
f8a0: 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20   int dummy;.    
f8b0: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74  int iOff;.    ft
f8c0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
f8d0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
f8e0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
f8f0: 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72  pLast;.    pIter
f900: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67  ->iLeafPgno = pg
f910: 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 66 74 73 35  noLast;.    fts5
f920: 4c 65 61 66 48 65 61 64 65 72 28 70 4c 61 73 74  LeafHeader(pLast
f930: 2c 20 26 69 4f 66 66 2c 20 26 64 75 6d 6d 79 29  , &iOff, &dummy)
f940: 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
f950: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61  s5GetVarint(&pLa
f960: 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  st->p[iOff], (u6
f970: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
f980: 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  d);.    pIter->i
f990: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f9a0: 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65  f;.  }..  fts5Se
f9b0: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
f9c0: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
f9d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
f9e0: 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
f9f0: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
fa00: 66 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61  first rowid of a
fa10: 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65   doclist..** The
fa20: 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
fa30: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
fa40: 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20   with the final 
fa50: 74 65 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72  term on the curr
fa60: 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66  ent .** page. If
fa70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
fa80: 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65  m is the last te
fa90: 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  rm on the page, 
faa0: 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63  load the .** doc
fab0: 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20  list-index from 
fac0: 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c  disk and initial
fad0: 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ize an iterator 
fae0: 61 74 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64  at (pIter->pDlid
faf0: 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  x)..*/.static vo
fb00: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
fb10: 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65  adDlidx(Fts5Inde
fb20: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
fb30: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
fb40: 20 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70   iSeg = pIter->p
fb50: 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69  Seg->iSegid;.  i
fb60: 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72  nt bRev = (pIter
fb70: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
fb80: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b  EGITER_REVERSE);
fb90: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
fba0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
fbb0: 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65  f; /* Current le
fbc0: 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73  af data */..  as
fbd0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
fbe0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
fbf0: 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
fc00: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
fc10: 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lidx==0 );..  /*
fc20: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 75   Check if the cu
fc30: 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e  rrent doclist en
fc40: 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  ds on this page.
fc50: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74   If it does, ret
fc60: 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77  urn.  ** early w
fc70: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74  ithout loading t
fc80: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
fc90: 20 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20   (as it belongs 
fca0: 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20  to a different. 
fcb0: 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69   ** term. */.  i
fcc0: 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  f( pIter->iTermL
fcd0: 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
fce0: 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
fcf0: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
fd00: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
fd10: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20   pIter->nPos;.  
fd20: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c    while( iOff<pL
fd30: 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  eaf->n ){.      
fd40: 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
fd50: 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
fd60: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20    i64 iDelta;.. 
fd70: 20 20 20 20 20 2f 2a 20 69 4f 66 66 20 69 73 20       /* iOff is 
fd80: 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f 66  currently the of
fd90: 66 73 65 74 20 6f 66 20 74 68 65 20 73 74 61 72  fset of the star
fda0: 74 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69  t of position li
fdb0: 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20  st data */.     
fdc0: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
fdd0: 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70  Varint(&pLeaf->p
fde0: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
fdf0: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66  Delta);.      if
fe00: 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65  ( iDelta==0 ) re
fe10: 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  turn;.      asse
fe20: 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61  rt_nc( iOff<pLea
fe30: 66 2d 3e 6e 20 29 3b 0a 20 20 20 20 20 20 69 4f  f->n );.      iO
fe40: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73  ff += fts5GetPos
fe50: 6c 69 73 74 53 69 7a 65 28 26 70 4c 65 61 66 2d  listSize(&pLeaf-
fe60: 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c  >p[iOff], &nPos,
fe70: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
fe80: 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20   iOff += nPos;. 
fe90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65     }.  }..  pIte
fea0: 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35  r->pDlidx = fts5
feb0: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
fec0: 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74   bRev, iSeg, pIt
fed0: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
fee0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  o);.}../*.** Ini
fef0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65  tialize the obje
ff00: 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  ct pIter to poin
ff10: 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f  t to term pTerm/
ff20: 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67  nTerm within seg
ff30: 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66  ment.** pSeg. If
ff40: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63   there is no suc
ff50: 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e  h term in the in
ff60: 64 65 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f  dex, the iterato
ff70: 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e  r is set to EOF.
ff80: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
ff90: 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
ffa0: 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
ffb0: 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
ffc0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
ffd0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73  .** an error has
ffe0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
fff0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
10000 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
10010 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
10020 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10030 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69  s5SegIterSeekIni
10040 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
10050 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
10060 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
10070 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  kend */.  const 
10080 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
10090 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
100a0 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a  m to seek to */.
100b0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
100e0 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73  5INDEX_XXX flags
100f0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
10100 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
10110 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
10120 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20  tion of segment 
10130 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
10140 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
10150 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
10160 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b  o populate */.){
10170 0a 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a  .  int iPg = 1;.
10180 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 62    int h;.  int b
10190 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  Ge = (flags & FT
101a0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
101b0 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64  AN);.  int bDlid
101c0 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
101d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
101e0 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
101f0 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20  list-index */.. 
10200 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20   assert( bGe==0 
10210 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
10220 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
10230 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
10240 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d  ( pTerm && nTerm
10250 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74   );.  memset(pIt
10260 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
10270 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
10280 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20  >pSeg = pSeg;.. 
10290 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
102a0 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ets stack variab
102b0 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65  le iPg to the le
102c0 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  af page number t
102d0 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e  hat may.  ** con
102e0 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d  tain term (pTerm
102f0 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69  /nTerm), if it i
10300 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
10310 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 66   segment. */.  f
10320 6f 72 28 68 3d 70 53 65 67 2d 3e 6e 48 65 69 67  or(h=pSeg->nHeig
10330 68 74 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d 29 7b  ht-1; h>0; h--){
10340 0a 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65  .    Fts5NodeIte
10350 72 20 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  r node;         
10360 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72       /* For iter
10370 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e  ating through in
10380 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 2a 2f 0a  ternal nodes */.
10390 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
103a0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
103b0 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
103c0 2c 20 68 2c 20 69 50 67 29 3b 0a 20 20 20 20 46  , h, iPg);.    F
103d0 74 73 35 44 61 74 61 20 2a 70 4e 6f 64 65 20 3d  ts5Data *pNode =
103e0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
103f0 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66   iRowid);.    if
10400 28 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65  ( pNode==0 ) bre
10410 61 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f 64  ak;..    fts5Nod
10420 65 49 74 65 72 49 6e 69 74 28 70 4e 6f 64 65 2d  eIterInit(pNode-
10430 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26 6e  >p, pNode->n, &n
10440 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ode);.    assert
10450 28 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d 30  ( node.term.n==0
10460 20 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20 6e   );..    iPg = n
10470 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20  ode.iChild;.    
10480 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44  bDlidx = node.bD
10490 6c 69 64 78 3b 0a 20 20 20 20 66 6f 72 28 66 74  lidx;.    for(ft
104a0 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
104b0 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a 20  p->rc, &node);. 
104c0 20 20 20 20 20 20 20 6e 6f 64 65 2e 61 44 61 74         node.aDat
104d0 61 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43  a && fts5BufferC
104e0 6f 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64 65  ompareBlob(&node
104f0 2e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54  .term, pTerm, nT
10500 65 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20 20  erm)<=0;.       
10510 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
10520 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29  t(&p->rc, &node)
10530 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50  .    ){.      iP
10540 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b  g = node.iChild;
10550 0a 20 20 20 20 20 20 62 44 6c 69 64 78 20 3d 20  .      bDlidx = 
10560 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20  node.bDlidx;.   
10570 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49   }.    fts5NodeI
10580 74 65 72 46 72 65 65 28 26 6e 6f 64 65 29 3b 0a  terFree(&node);.
10590 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
105a0 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a  ase(pNode);.  }.
105b0 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d  .  if( iPg<pSeg-
105c0 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20  >pgnoFirst ){.  
105d0 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67    iPg = pSeg->pg
105e0 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c  noFirst;.    bDl
105f0 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  idx = 0;.  }..  
10600 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
10610 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74   = iPg - 1;.  ft
10620 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
10630 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  e(p, pIter);..  
10640 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
10650 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   ){.    int res;
10660 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
10670 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
10680 74 55 31 36 28 26 70 49 74 65 72 2d 3e 70 4c 65  tU16(&pIter->pLe
10690 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 66  af->p[2]);.    f
106a0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
106b0 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  rm(p, pIter, 0);
106c0 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
106d0 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
106e0 72 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  r);.    do {.   
106f0 20 20 20 72 65 73 20 3d 20 66 74 73 35 42 75 66     res = fts5Buf
10700 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
10710 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
10720 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
10730 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62    if( res>=0 ) b
10740 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 74 73 35  reak;.      fts5
10750 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70  SegIterNext(p, p
10760 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 77  Iter, 0);.    }w
10770 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 70 4c 65  hile( pIter->pLe
10780 61 66 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  af && p->rc==SQL
10790 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 69  ITE_OK );..    i
107a0 66 28 20 62 47 65 3d 3d 30 20 26 26 20 72 65 73  f( bGe==0 && res
107b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   ){.      /* Set
107c0 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
107d0 6e 74 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20 20  nt to EOF */.   
107e0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
107f0 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
10800 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
10810 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Leaf = 0;.    }.
10820 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
10830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
10840 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74  Ge==0 ){.    pIt
10850 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
10860 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
10870 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  M;.    if( pIter
10880 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
10890 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
108a0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
108b0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  C ){.        pIt
108c0 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
108d0 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
108e0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
108f0 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20   if( bDlidx ){. 
10900 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
10910 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 70  erLoadDlidx(p, p
10920 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
10930 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
10940 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
10950 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
10960 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
10970 72 73 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  rse(p, pIter);. 
10980 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
109a0 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20  lize the object 
109b0 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74  pIter to point t
109c0 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65  o term pTerm/nTe
109d0 72 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  rm within the.**
109e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
109f0 74 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20  table. If there 
10a00 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20  is no such term 
10a10 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c  in the hash-tabl
10a20 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61  e, the .** itera
10a30 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f  tor is set to EO
10a40 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  F..**.** If an e
10a50 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
10a60 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
10a70 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
10a80 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
10a90 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
10aa0 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
10ab0 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
10ac0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
10ad0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
10ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10af0 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49  fts5SegIterHashI
10b00 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
10b10 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10b20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
10b30 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  ackend */.  cons
10b40 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
10b50 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
10b60 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a  erm to seek to *
10b70 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b90 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
10ba0 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61  TS5INDEX_XXX fla
10bb0 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  gs */.  Fts5SegI
10bc0 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
10bd0 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
10be0 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
10bf0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
10c00 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pList = 0;.  int
10c10 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f   nList = 0;.  co
10c20 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20  nst u8 *z = 0;. 
10c30 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61   int n = 0;..  a
10c40 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20  ssert( p->pHash 
10c50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
10c60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
10c70 0a 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30  ..  if( pTerm==0
10c80 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
10c90 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
10ca0 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  N) ){.    p->rc 
10cb0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
10cc0 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61  hScanInit(p->pHa
10cd0 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  sh, (const char*
10ce0 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a  )pTerm, nTerm);.
10cf0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
10d00 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e  ashScanEntry(p->
10d10 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
10d20 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c  ar**)&z, &pList,
10d30 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20   &nList);.    n 
10d40 3d 20 28 7a 20 3f 20 73 74 72 6c 65 6e 28 28 63  = (z ? strlen((c
10d50 6f 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20  onst char*)z) : 
10d60 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
10d70 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
10d80 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
10d90 45 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74  ETERM;.    sqlit
10da0 65 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28  e3Fts5HashQuery(
10db0 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
10dc0 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
10dd0 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
10de0 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54  ist);.    z = pT
10df0 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65  erm;.    n = nTe
10e00 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rm;.  }..  if( p
10e10 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35  List ){.    Fts5
10e20 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
10e30 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
10e40 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
10e50 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a  Iter->term, n, z
10e60 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
10e70 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
10e80 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
10e90 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
10ea0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10eb0 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38    pLeaf->p = (u8
10ec0 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65  *)pList;.    pLe
10ed0 61 66 2d 3e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20  af->n = nList;. 
10ee0 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
10ef0 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74  = pLeaf;.    pIt
10f00 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
10f10 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
10f20 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29  pLeaf->p, (u64*)
10f30 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
10f40 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  ..    if( flags 
10f50 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
10f60 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
10f70 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
10f80 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
10f90 45 52 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35  ERSE;.      fts5
10fa0 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
10fb0 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
10fc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10fd0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
10fe0 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
10ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11000 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74  *.** Zero the it
11010 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
11020 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
11030 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
11040 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43 6c  id fts5SegIterCl
11050 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72 20  ear(Fts5SegIter 
11060 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42  *pIter){.  fts5B
11070 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
11080 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44  ->term);.  fts5D
11090 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
110a0 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35  ->pLeaf);.  fts5
110b0 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
110c0 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
110d0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
110e0 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  ee(pIter->pDlidx
110f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
11100 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e(pIter->aRowidO
11110 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74  ffset);.  memset
11120 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
11130 66 28 46 74 73 35 53 65 67 49 74 65 72 29 29 3b  f(Fts5SegIter));
11140 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
11150 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG../*.** T
11160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11170 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
11180 74 68 65 20 62 69 67 20 61 73 73 65 72 74 28 29  the big assert()
11190 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65   procedure imple
111a0 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73  mented by.** fts
111b0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
111c0 53 65 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75  Setup(). It ensu
111d0 72 65 73 20 74 68 61 74 20 74 68 65 20 72 65 73  res that the res
111e0 75 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ult currently st
111f0 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73  ored.** in *pRes
11200 20 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20   is the correct 
11210 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
11220 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
11230 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  positions of the
11240 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72  .** two iterator
11250 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
11260 64 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70  d fts5AssertComp
11270 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20  arisonResult(.  
11280 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
11290 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35   *pIter, .  Fts5
112a0 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46  SegIter *p1,.  F
112b0 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a  ts5SegIter *p2,.
112c0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
112d0 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20  Res.){.  int i1 
112e0 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53  = p1 - pIter->aS
112f0 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70  eg;.  int i2 = p
11300 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  2 - pIter->aSeg;
11310 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61  ..  if( p1->pLea
11320 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29  f || p2->pLeaf )
11330 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c  {.    if( p1->pL
11340 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
11350 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
11360 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20  irst==i2 );.    
11370 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
11380 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
11390 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
113a0 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20  irst==i1 );.    
113b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
113c0 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e   nMin = MIN(p1->
113d0 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d  term.n, p2->term
113e0 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  .n);.      int r
113f0 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e  es = memcmp(p1->
11400 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d  term.p, p2->term
11410 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20  .p, nMin);.     
11420 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
11430 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d  s = p1->term.n -
11440 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20   p2->term.n;..  
11450 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
11460 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11470 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
11480 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
11490 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64  sert( p1->iRowid
114a0 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a  !=p2->iRowid );.
114b0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 28          res = ((
114c0 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d  p1->iRowid > p2-
114d0 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
114e0 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b  >bRev) ? -1 : 1;
114f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
11510 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29  es->bTermEq==0 )
11520 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
11530 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
11540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
11550 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29  es->iFirst==i1 )
11560 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11580 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20  Res->iFirst==i2 
11590 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
115a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
115b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
115c0 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51   no-op unless SQ
115d0 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
115e0 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20  fined when this 
115f0 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d  module.** is com
11600 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63  piled. In that c
11610 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ase, this functi
11620 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c  on is essentiall
11630 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a  y an assert() .*
11640 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  * statement used
11650 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
11660 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
11670 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73  the pIter->aFirs
11680 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  t[] array.** are
11690 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61   correct..*/.sta
116a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73  tic void fts5Ass
116b0 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
116c0 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  p(Fts5Index *p, 
116d0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
116e0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
116f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11700 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
11710 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
11720 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29  ter->nSeg; i+=2)
11730 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
11740 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72  ter *p1 = &pIter
11750 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20  ->aSeg[i];.     
11760 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
11770 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
11780 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  i+1];.      Fts5
11790 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
117a0 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28  &pIter->aFirst[(
117b0 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29  pIter->nSeg + i)
117c0 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73   / 2];.      fts
117d0 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f  5AssertCompariso
117e0 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70  nResult(pIter, p
117f0 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20  1, p2, pRes);.  
11800 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31    }..    for(i=1
11810 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67  ; i<(pIter->nSeg
11820 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20   / 2); i+=2){.  
11830 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
11840 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
11850 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20  aFirst[i];.     
11860 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
11870 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
11880 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
11890 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  *2].iFirst ];.  
118a0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
118b0 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p2 = &pIter->aS
118c0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
118d0 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20  t[i*2+1].iFirst 
118e0 5d 3b 0a 0a 20 20 20 20 20 20 66 74 73 35 41 73  ];..      fts5As
118f0 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
11900 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20  sult(pIter, p1, 
11910 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  p2, pRes);.    }
11920 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
11930 65 66 69 6e 65 20 66 74 73 35 41 73 73 65 72 74  efine fts5Assert
11940 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 78  MultiIterSetup(x
11950 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,y).#endif../*.*
11960 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
11970 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f  son necessary to
11980 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d   populate pIter-
11990 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a  >aFirst[iOut]..*
119a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75  *.** If the retu
119b0 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f  rned value is no
119c0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
119d0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
119e0 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74  an entry.** in t
119f0 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d  he pIter->aSeg[]
11a00 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20 28   array that is (
11a10 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61  a) not at EOF, a
11a20 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a  nd (b) pointing.
11a30 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74  ** to a key that
11a40 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
11a50 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68  of another, high
11a60 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a  er priority, .**
11a70 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f   segment-iterato
11a80 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61  r in the pSeg->a
11a90 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Seg[] array..*/.
11aa0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
11ab0 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72  ultiIterDoCompar
11ac0 65 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  e(Fts5MultiSegIt
11ad0 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69  er *pIter, int i
11ae0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20  Out){.  int i1; 
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
11b10 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74   of left-hand Ft
11b20 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69  s5SegIter */.  i
11b30 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20  nt i2;          
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11b50 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
11b60 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
11b70 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b  r */.  int iRes;
11b80 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
11b90 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
11ba0 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20     /* Left-hand 
11bb0 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
11bc0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
11bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11be0 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46   /* Right-hand F
11bf0 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
11c00 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
11c10 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
11c20 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73  st[iOut];..  ass
11c30 65 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d  ert( iOut<pIter-
11c40 3e 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20  >nSeg && iOut>0 
11c50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
11c60 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70  er->bRev==0 || p
11c70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b  Iter->bRev==1 );
11c80 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70  ..  if( iOut>=(p
11c90 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b  Iter->nSeg/2) ){
11ca0 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20  .    i1 = (iOut 
11cb0 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29  - pIter->nSeg/2)
11cc0 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69   * 2;.    i2 = i
11cd0 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1 + 1;.  }else{.
11ce0 20 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e      i1 = pIter->
11cf0 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69  aFirst[iOut*2].i
11d00 46 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20  First;.    i2 = 
11d10 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
11d20 75 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a  ut*2+1].iFirst;.
11d30 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65    }.  p1 = &pIte
11d40 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70  r->aSeg[i1];.  p
11d50 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  2 = &pIter->aSeg
11d60 5b 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62  [i2];..  pRes->b
11d70 54 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66  TermEq = 0;.  if
11d80 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
11d90 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {           /* I
11da0 66 20 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a  f p1 is at EOF *
11db0 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b  /.    iRes = i2;
11dc0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d  .  }else if( p2-
11dd0 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20  >pLeaf==0 ){    
11de0 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74 20   /* If p2 is at 
11df0 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20  EOF */.    iRes 
11e00 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = i1;.  }else{. 
11e10 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73     int res = fts
11e20 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26  5BufferCompare(&
11e30 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74  p1->term, &p2->t
11e40 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65  erm);.    if( re
11e50 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  s==0 ){.      as
11e60 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20  sert( i2>i1 );. 
11e70 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32 21       assert( i2!
11e80 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73  =0 );.      pRes
11e90 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20  ->bTermEq = 1;. 
11ea0 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f       if( p1->iRo
11eb0 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20  wid==p2->iRowid 
11ec0 29 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62  ){.        p1->b
11ed0 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a  Del = p2->bDel;.
11ee0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
11ef0 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  2;.      }.     
11f00 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f   res = ((p1->iRo
11f10 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64  wid > p2->iRowid
11f20 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20  )==pIter->bRev) 
11f30 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d  ? -1 : +1;.    }
11f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73  .    assert( res
11f50 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  !=0 );.    if( r
11f60 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52  es<0 ){.      iR
11f70 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c  es = i1;.    }el
11f80 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d  se{.      iRes =
11f90 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   i2;.    }.  }..
11fa0 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d    pRes->iFirst =
11fb0 20 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20   iRes;.  return 
11fc0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
11fd0 20 74 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f   the seg-iter so
11fe0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
11ff0 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
12000 69 64 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66  id on page iLeaf
12010 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61  Pgno..** It is a
12020 6e 20 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20  n error if leaf 
12030 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e  iLeafPgno does n
12040 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
12050 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a  ains no rowids..
12060 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12070 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
12080 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
12090 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
120a0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
120b0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
120c0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
120d0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
120e0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
120f0 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
12100 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20  t iLeafPgno.){. 
12110 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67   assert( iLeafPg
12120 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no>pIter->iLeafP
12130 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c  gno );..  if( iL
12140 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70  eafPgno>pIter->p
12150 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
12160 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
12170 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c  5_CORRUPT;.  }el
12180 73 65 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61  se{.    fts5Data
12190 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
121a0 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70  NextLeaf);.    p
121b0 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
121c0 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  = 0;.    pIter->
121d0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61  iLeafPgno = iLea
121e0 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73  fPgno-1;.    fts
121f0 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
12200 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12210 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
12220 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65  QLITE_OK || pIte
12230 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c  r->iLeafPgno==iL
12240 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20  eafPgno );..    
12250 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12260 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
12270 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38  t iOff;.      u8
12280 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
12290 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74  af->p;.      int
122a0 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   n = pIter->pLea
122b0 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f 66  f->n;..      iOf
122c0 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
122d0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[0]);.      if(
122e0 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e   iOff<4 || iOff>
122f0 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =n ){.        p-
12300 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
12310 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
12320 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
12330 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
12340 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
12350 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
12360 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
12370 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
12380 66 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  f;.        fts5S
12390 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
123a0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
123b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
123c0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
123d0 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
123e0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
123f0 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74  rgument until it
12400 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61   is at or .** pa
12410 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20  st rowid iFrom. 
12420 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
12430 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d  e value of iFrom
12440 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  , the iterator i
12450 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64 76 61  s.** always adva
12460 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e  nced at least on
12470 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
12480 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
12490 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e  xtFrom(.  Fts5In
124a0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
124b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
124c0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
124d0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
124e0 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
124f0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
12500 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
12510 20 20 69 36 34 20 69 4d 61 74 63 68 20 20 20 20    i64 iMatch    
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65    /* Advance ite
12540 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74 20 74  rator at least t
12550 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20  his far */.){.  
12560 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65  int bRev = (pIte
12570 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
12580 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29  SEGITER_REVERSE)
12590 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ;.  Fts5DlidxIte
125a0 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65  r *pDlidx = pIte
125b0 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74  r->pDlidx;.  int
125c0 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74   iLeafPgno = pIt
125d0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  er->iLeafPgno;. 
125e0 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a   int bMove = 1;.
125f0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
12600 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
12610 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
12620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
12630 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20 61  r->pDlidx );.  a
12640 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
12650 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20 62 52  eaf );..  if( bR
12660 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ev==0 ){.    whi
12670 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74  le( !fts5DlidxIt
12680 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
12690 20 26 26 20 69 4d 61 74 63 68 3e 66 74 73 35 44   && iMatch>fts5D
126a0 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
126b0 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69  lidx) ){.      i
126c0 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44  LeafPgno = fts5D
126d0 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
126e0 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35  idx);.      fts5
126f0 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
12700 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a   pDlidx);.    }.
12710 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
12720 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d  LeafPgno>=pIter-
12730 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d  >iLeafPgno || p-
12740 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20 69  >rc );.    if( i
12750 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
12760 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
12770 20 20 20 66 74 73 35 53 65 67 49 74 65 72 47 6f     fts5SegIterGo
12780 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65 72 2c  toPage(p, pIter,
12790 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20   iLeafPgno);.   
127a0 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20     bMove = 0;.  
127b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
127c0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
127d0 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a  pNextLeaf==0 );.
127e0 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 61 74      assert( iMat
127f0 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  ch<pIter->iRowid
12800 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   );.    while( !
12810 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
12820 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
12830 4d 61 74 63 68 3c 66 74 73 35 44 6c 69 64 78 49  Match<fts5DlidxI
12840 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
12850 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
12860 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20 70  idxIterPrev(p, p
12870 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20  Dlidx);.    }.  
12880 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74    iLeafPgno = ft
12890 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
128a0 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 61 73  pDlidx);..    as
128b0 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49  sert( fts5DlidxI
128c0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
128d0 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d  ) || iLeafPgno<=
128e0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
128f0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c 65   );..    if( iLe
12900 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c  afPgno<pIter->iL
12910 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
12920 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
12930 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b  o = iLeafPgno+1;
12940 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
12950 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
12960 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12970 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20    bMove = 0;.   
12980 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28   }.  }..  while(
12990 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
129a0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f  K ){.    if( bMo
129b0 76 65 20 29 20 66 74 73 35 53 65 67 49 74 65 72  ve ) fts5SegIter
129c0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
129d0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
129e0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ->pLeaf==0 ) bre
129f0 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  ak;.    if( bRev
12a00 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52  ==0 && pIter->iR
12a10 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62  owid>=iMatch ) b
12a20 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52  reak;.    if( bR
12a30 65 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  ev!=0 && pIter->
12a40 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29  iRowid<=iMatch )
12a50 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76   break;.    bMov
12a60 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  e = 1;.  }.}.../
12a70 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74  *.** Free the it
12a80 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
12a90 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
12aa0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
12ab0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
12ac0 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74  MultiIterFree(Ft
12ad0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
12ae0 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
12af0 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
12b00 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
12b10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12b20 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
12b30 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
12b40 74 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d  terClear(&pIter-
12b50 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d  >aSeg[i]);.    }
12b60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12b70 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  e(pIter);.  }.}.
12b80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
12b90 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
12ba0 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ed(.  Fts5Index 
12bb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12bc0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
12bd0 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
12be0 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
12bf0 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
12c00 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Iter,        /* 
12c10 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61  Iterator to upda
12c20 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  te aFirst[] arra
12c30 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  y for */.  int i
12c40 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20  Changed,        
12c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12c60 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61  dex of sub-itera
12c70 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65  tor just advance
12c80 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73  d */.  int iMins
12c90 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
12ca0 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
12cb0 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73  m entry in aFirs
12cc0 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b  t[] to set */.){
12cd0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
12ce0 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69  i=(pIter->nSeg+i
12cf0 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69  Changed)/2; i>=i
12d00 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d  Minset && p->rc=
12d10 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f  =SQLITE_OK; i=i/
12d20 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b  2){.    int iEq;
12d30 0a 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20  .    if( (iEq = 
12d40 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
12d50 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29  ompare(pIter, i)
12d60 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  ) ){.      fts5S
12d70 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70  egIterNext(p, &p
12d80 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 2c  Iter->aSeg[iEq],
12d90 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70   0);.      i = p
12da0 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71  Iter->nSeg + iEq
12db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
12dc0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
12dd0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
12de0 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
12df0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12e00 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
12e10 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
12e20 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
12e30 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
12e40 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  pIter,        /*
12e50 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64   Iterator to upd
12e60 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72  ate aFirst[] arr
12e70 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ay for */.  int 
12e80 69 43 68 61 6e 67 65 64 20 20 20 20 20 20 20 20  iChanged        
12e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12ea0 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72  ndex of sub-iter
12eb0 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63  ator just advanc
12ec0 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ed */.){.  int i
12ed0 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ;.  Fts5SegIter 
12ee0 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e  *pNew = &pIter->
12ef0 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a  aSeg[iChanged];.
12f00 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
12f10 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  Other = &pIter->
12f20 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20  aSeg[iChanged ^ 
12f30 30 78 30 30 30 31 5d 3b 0a 0a 20 20 66 6f 72 28  0x0001];..  for(
12f40 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69  i=(pIter->nSeg+i
12f50 43 68 61 6e 67 65 64 29 2f 32 3b 20 70 2d 3e 72  Changed)/2; p->r
12f60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d  c==SQLITE_OK; i=
12f70 69 2f 32 29 7b 0a 20 20 20 20 46 74 73 35 43 52  i/2){.    Fts5CR
12f80 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
12f90 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b  Iter->aFirst[i];
12fa0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ..    assert( pN
12fb0 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20  ew->pLeaf );.   
12fc0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
12fd0 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74  TermEq==0 || pOt
12fe0 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20  her->pLeaf );.  
12ff0 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d    .    if( pRes-
13000 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20  >bTermEq ){.    
13010 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
13020 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77  id==pOther->iRow
13030 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  id ){.        re
13040 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
13050 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
13060 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52  >iRowid>pNew->iR
13070 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
13080 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ev ){.        pN
13090 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20  ew = pOther;.   
130a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
130b0 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 70  Res->iFirst = (p
130c0 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65  New - pIter->aSe
130d0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 31  g);.    if( i==1
130e0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70   ) break;..    p
130f0 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  Other = &pIter->
13100 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
13110 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e  rst[i ^ 0x0001].
13120 69 46 69 72 73 74 20 5d 3b 0a 20 20 7d 0a 0a 20  iFirst ];.  }.. 
13130 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
13140 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
13150 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  rator to the nex
13160 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
13170 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
13180 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
13190 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73  e is left in Fts
131a0 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73  5Index.rc. It is
131b0 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65   not .** conside
131c0 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
131d0 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
131e0 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20  ches EOF, or if 
131f0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  it is already at
13200 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68   .** EOF when th
13210 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13220 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
13230 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
13240 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49  terNext(.  Fts5I
13250 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
13260 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
13270 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d  ter,.  int bFrom
13280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13290 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
132a0 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d  f argument iFrom
132b0 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69   is valid */.  i
132c0 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20  64 iFrom        
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
132e0 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61  * Advance at lea
132f0 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68 69  st as far as thi
13300 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  s */.){.  if( p-
13310 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13320 7b 0a 20 20 20 20 69 6e 74 20 62 55 73 65 46 72  {.    int bUseFr
13330 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 20 20  om = bFrom;.    
13340 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  do {.      int i
13350 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61  First = pIter->a
13360 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b  First[1].iFirst;
13370 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
13380 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 46  erm = 0;.      F
13390 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
133a0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
133b0 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 61  iFirst];.      a
133c0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
133d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
133e0 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26   if( bUseFrom &&
133f0 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b   pSeg->pDlidx ){
13400 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
13410 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20  IterNextFrom(p, 
13420 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20  pSeg, iFrom);.  
13430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13440 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
13450 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65  xt(p, pSeg, &bNe
13460 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  wTerm);.      }.
13470 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d  .      if( pSeg-
13480 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65  >pLeaf==0 || bNe
13490 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c  wTerm .       ||
134a0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
134b0 76 61 6e 63 65 52 6f 77 69 64 28 70 2c 20 70 49  vanceRowid(p, pI
134c0 74 65 72 2c 20 69 46 69 72 73 74 29 0a 20 20 20  ter, iFirst).   
134d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74     ){.        ft
134e0 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
134f0 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46  ced(p, pIter, iF
13500 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  irst, 1);.      
13510 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  }.      fts5Asse
13520 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
13530 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20  (p, pIter);..   
13540 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b     bUseFrom = 0;
13550 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49 74  .    }while( pIt
13560 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26  er->bSkipEmpty &
13570 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  & fts5MultiIterI
13580 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29  sEmpty(p, pIter)
13590 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
135a0 63 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  c Fts5MultiSegIt
135b0 65 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65  er *fts5MultiIte
135c0 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e  rAlloc(.  Fts5In
135d0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
135e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
135f0 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
13600 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
13610 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46   int nSeg.){.  F
13620 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
13630 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c  *pNew;.  int nSl
13640 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
13650 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65           /* Powe
13660 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67  r of two >= nSeg
13670 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74   */..  for(nSlot
13680 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20  =2; nSlot<nSeg; 
13690 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a  nSlot=nSlot*2);.
136a0 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78    pNew = fts5Idx
136b0 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20  Malloc(p, .     
136c0 20 73 69 7a 65 6f 66 28 46 74 73 35 4d 75 6c 74   sizeof(Fts5Mult
136d0 69 53 65 67 49 74 65 72 29 20 2b 20 20 20 20 20  iSegIter) +     
136e0 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a       /* pNew */.
136f0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
13700 35 53 65 67 49 74 65 72 29 20 2a 20 6e 53 6c 6f  5SegIter) * nSlo
13710 74 20 2b 20 20 20 20 20 20 20 2f 2a 20 70 4e 65  t +       /* pNe
13720 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20  w->aSeg[] */.   
13730 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52     sizeof(Fts5CR
13740 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20  esult) * nSlot  
13750 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e         /* pNew->
13760 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b  aFirst[] */.  );
13770 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
13780 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20     pNew->nSeg = 
13790 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d  nSlot;.    pNew-
137a0 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 65 67  >aSeg = (Fts5Seg
137b0 49 74 65 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  Iter*)&pNew[1];.
137c0 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
137d0 20 3d 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a   = (Fts5CResult*
137e0 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c  )&pNew->aSeg[nSl
137f0 6f 74 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ot];.  }.  retur
13800 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
13810 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
13820 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
13830 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
13840 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69  he new object wi
13850 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
13860 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 61  erate through da
13870 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65 20  ta in structure 
13880 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69  pStruct..** If i
13890 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68  Level is -ve, th
138a0 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61  en all data in a
138b0 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d  ll segments is m
138c0 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c  erged. Or, if iL
138d0 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  evel.** is zero 
138e0 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74 61  or greater, data
138f0 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
13900 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74  nSegment segment
13910 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65  s on level iLeve
13920 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a  l.** is merged..
13930 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  **.** The iterat
13940 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69  or initially poi
13950 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
13960 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72   term/rowid entr
13970 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65  y in the .** ite
13980 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  rated data..*/.s
13990 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
139a0 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46  ultiIterNew(.  F
139b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
139d0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
139e0 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
139f0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
13a00 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20  ure *pStruct,   
13a10 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
13a20 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 69  re of specific i
13a30 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53  ndex */.  int bS
13a40 6b 69 70 45 6d 70 74 79 2c 20 20 20 20 20 20 20  kipEmpty,       
13a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13a60 65 20 74 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65  e to ignore dele
13a70 74 65 2d 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74  te-keys */.  int
13a80 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13aa0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
13ab0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  XXX flags */.  c
13ac0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
13ad0 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
13ae0 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
13af0 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f  o (or NULL/0) */
13b00 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69     /* Level to i
13b30 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61  terate (-1 for a
13b40 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  ll) */.  int nSe
13b50 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  gment,          
13b60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13b70 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
13b80 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e  o merge (iLevel>
13b90 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c  =0) */.  Fts5Mul
13ba0 74 69 53 65 67 49 74 65 72 20 2a 2a 70 70 4f 75  tiSegIter **ppOu
13bb0 74 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20  t        /* New 
13bc0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
13bd0 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20  nt nSeg;        
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13bf0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
13c00 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65  ent-iters in use
13c10 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20   */.  int iIter 
13c20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13c30 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e        /* */.  in
13c40 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
13c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c60 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
13c70 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
13c80 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  s */.  Fts5Struc
13c90 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b  tureLevel *pLvl;
13ca0 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
13cb0 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73  ter *pNew;..  as
13cc0 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20  sert( (pTerm==0 
13cd0 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20  && nTerm==0) || 
13ce0 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f  iLevel<0 );..  /
13cf0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
13d00 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c   for the new mul
13d10 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e  ti-seg-iterator.
13d20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
13d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13d40 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29    if( iLevel<0 )
13d50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13d60 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
13d70 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65  t==fts5Structure
13d80 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
13d90 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20  truct) );.      
13da0 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
13db0 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20  nSegment;.      
13dc0 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73  nSeg += (p->pHas
13dd0 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  h ? 1 : 0);.    
13de0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65  }else{.      nSe
13df0 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d  g = MIN(pStruct-
13e00 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e  >aLevel[iLevel].
13e10 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  nSeg, nSegment);
13e20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
13e30 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
13e40 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
13e50 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66 28 20  p, nSeg);.  if( 
13e60 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
13e70 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d  ;.  pNew->bRev =
13e80 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54   (0!=(flags & FT
13e90 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
13ea0 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53  SC));.  pNew->bS
13eb0 6b 69 70 45 6d 70 74 79 20 3d 20 62 53 6b 69 70  kipEmpty = bSkip
13ec0 45 6d 70 74 79 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Empty;..  /* Ini
13ed0 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20  tialize each of 
13ee0 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65  the component se
13ef0 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e  gment iterators.
13f00 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c   */.  if( iLevel
13f10 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  <0 ){.    Fts5St
13f20 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45  ructureLevel *pE
13f30 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  nd = &pStruct->a
13f40 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
13f50 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 69 66 28 20  Level];.    if( 
13f60 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20  p->pHash ){.    
13f70 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65    /* Add a segme
13f80 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20  nt iterator for 
13f90 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
13fa0 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68  ents of the hash
13fb0 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20   table. */.     
13fc0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
13fd0 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  ter = &pNew->aSe
13fe0 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20  g[iIter++];.    
13ff0 20 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73    fts5SegIterHas
14000 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20  hInit(p, pTerm, 
14010 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49  nTerm, flags, pI
14020 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
14030 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75 63  for(pLvl=&pStruc
14040 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c  t->aLevel[0]; pL
14050 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29  vl<pEnd; pLvl++)
14060 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  {.      for(iSeg
14070 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pLvl->nSeg-1; i
14080 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b  Seg>=0; iSeg--){
14090 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72  .        Fts5Str
140a0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
140b0 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
140c0 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
140d0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
140e0 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  ter = &pNew->aSe
140f0 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20  g[iIter++];.    
14100 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
14110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
14120 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c  s5SegIterInit(p,
14130 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20   pSeg, pIter);. 
14140 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14150 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
14160 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20 70  terSeekInit(p, p
14170 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61  Term, nTerm, fla
14180 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  gs, pSeg, pIter)
14190 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
141a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
141b0 65 7b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  e{.    pLvl = &p
141c0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
141d0 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28  Level];.    for(
141e0 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65  iSeg=nSeg-1; iSe
141f0 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
14200 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14210 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61  Init(p, &pLvl->a
14220 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77  Seg[iSeg], &pNew
14230 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29  ->aSeg[iIter++])
14240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
14250 73 65 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65  sert( iIter==nSe
14260 67 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  g );..  /* If th
14270 65 20 61 62 6f 76 65 20 77 61 73 20 73 75 63 63  e above was succ
14280 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d  essful, each com
14290 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73  ponent iterators
142a0 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a   now points .  *
142b0 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
142c0 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d  ntry in its segm
142d0 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ent. In this cas
142e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  e initialize the
142f0 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20   .  ** aFirst[] 
14300 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e  array. Or, if an
14310 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
14320 72 65 64 2c 20 66 72 65 65 20 74 68 65 20 69 74  red, free the it
14330 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65  erator.  ** obje
14340 63 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f  ct and set the o
14350 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
14360 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
14370 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14380 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49  OK ){.    for(iI
14390 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31  ter=pNew->nSeg-1
143a0 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72  ; iIter>0; iIter
143b0 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  --){.      int i
143c0 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  Eq;.      if( (i
143d0 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
143e0 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77  erDoCompare(pNew
143f0 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20  , iIter)) ){.   
14400 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14410 4e 65 78 74 28 70 2c 20 26 70 4e 65 77 2d 3e 61  Next(p, &pNew->a
14420 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20  Seg[iEq], 0);.  
14430 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
14440 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
14450 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29  New, iEq, iIter)
14460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14470 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75      fts5AssertMu
14480 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20  ltiIterSetup(p, 
14490 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
144a0 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79  pNew->bSkipEmpty
144b0 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65   && fts5MultiIte
144c0 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77  rIsEmpty(p, pNew
144d0 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  ) ){.      fts5M
144e0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
144f0 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pNew, 0, 0);.   
14500 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
14510 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
14520 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  e(p, pNew);.    
14530 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a  *ppOut = 0;.  }.
14540 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
14550 61 6e 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  an Fts5MultiSegI
14560 74 65 72 20 74 68 61 74 20 69 74 65 72 61 74 65  ter that iterate
14570 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f  s through the do
14580 63 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a  clist provided.*
14590 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
145a0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
145b0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
145c0 74 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74  tiIterNew2(.  Ft
145d0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
145f0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
14600 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
14610 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
14620 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
14630 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
14640 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
14650 67 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  gh */.  int bDes
14660 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
14670 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14680 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72  for descending r
14690 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  owid order */.  
146a0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
146b0 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20   **ppOut        
146c0 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
146d0 0a 29 7b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53  .){.  Fts5MultiS
146e0 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20  egIter *pNew;.  
146f0 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69  pNew = fts5Multi
14700 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 32 29 3b  IterAlloc(p, 2);
14710 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
14720 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
14730 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
14740 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20 70 49 74  Seg[1];..    pIt
14750 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53 35  er->flags = FTS5
14760 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
14770 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d  ;.    if( pData-
14780 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 49  >n>0 ){.      pI
14790 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44 61  ter->pLeaf = pDa
147a0 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  ta;.      pIter-
147b0 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
147c0 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 44 61  ts5GetVarint(pDa
147d0 74 61 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49  ta->p, (u64*)&pI
147e0 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
147f0 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
14800 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a  [1].iFirst = 1;.
14810 20 20 20 20 20 20 69 66 28 20 62 44 65 73 63 20        if( bDesc 
14820 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
14830 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20  >bRev = 1;.     
14840 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
14850 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
14860 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20  REVERSE;.       
14870 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
14880 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
14890 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
148a0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
148b0 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
148c0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
148d0 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d   }.      pData =
148e0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a   0;.    }..    *
148f0 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20 20  ppOut = pNew;.  
14900 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  }..  fts5DataRel
14910 65 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a  ease(pData);.}..
14920 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
14930 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  e if the iterato
14940 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20 69  r is at EOF or i
14950 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
14960 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c  ccurred. .** Fal
14970 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
14980 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
14990 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74 73  MultiIterEof(Fts
149a0 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d  5Index *p, Fts5M
149b0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
149c0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
149d0 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 61  ->rc || pIter->a
149e0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
149f0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70  st[1].iFirst ].p
14a00 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Leaf==0);.}../*.
14a10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f  ** Return the ro
14a20 77 69 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79  wid of the entry
14a30 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74   that the iterat
14a40 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
14a50 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68  nts.** to. If th
14a60 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
14a70 73 20 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68  s to EOF when th
14a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
14a90 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73  alled the.** res
14aa0 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e  ults are undefin
14ab0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ed..*/.static i6
14ac0 34 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  4 fts5MultiIterR
14ad0 6f 77 69 64 28 46 74 73 35 4d 75 6c 74 69 53 65  owid(Fts5MultiSe
14ae0 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
14af0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14b00 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
14b10 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
14b20 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75 72  pLeaf );.  retur
14b30 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  n pIter->aSeg[ p
14b40 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
14b50 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b  iFirst ].iRowid;
14b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
14b70 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
14b80 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74  he next entry at
14b90 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d   or following iM
14ba0 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  atch..*/.static 
14bb0 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
14bc0 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
14bd0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
14be0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
14bf0 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69  *pIter, .  i64 i
14c00 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65  Match.){.  while
14c10 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ( 1 ){.    i64 i
14c20 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d  Rowid;.    fts5M
14c30 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
14c40 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68  pIter, 1, iMatch
14c50 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d  );.    if( fts5M
14c60 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
14c70 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20  Iter) ) break;. 
14c80 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35     iRowid = fts5
14c90 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
14ca0 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
14cb0 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26  Iter->bRev==0 &&
14cc0 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20   iRowid>=iMatch 
14cd0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
14ce0 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20   pIter->bRev!=0 
14cf0 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63  && iRowid<=iMatc
14d00 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d  h ) break;.  }.}
14d10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
14d20 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
14d30 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
14d40 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61  the term associa
14d50 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  ted with the .**
14d60 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
14d70 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
14d80 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  ly points to..*/
14d90 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
14da0 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54   *fts5MultiIterT
14db0 65 72 6d 28 46 74 73 35 4d 75 6c 74 69 53 65 67  erm(Fts5MultiSeg
14dc0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
14dd0 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67   *pn){.  Fts5Seg
14de0 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72  Iter *p = &pIter
14df0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
14e00 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
14e10 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65  ];.  *pn = p->te
14e20 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70  rm.n;.  return p
14e30 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 73 74 61  ->term.p;.}..sta
14e40 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
14e50 6e 6b 49 74 65 72 61 74 65 28 0a 20 20 46 74 73  nkIterate(.  Fts
14e60 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e80 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  Index object */.
14e90 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14ea0 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
14eb0 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20    /* Poslist of 
14ec0 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f  this iterator */
14ed0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f     /* Context po
14f00 69 6e 74 65 72 20 66 6f 72 20 78 43 68 75 6e 6b  inter for xChunk
14f10 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76   callback */.  v
14f20 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29 28 46 74  oid (*xChunk)(Ft
14f30 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c  s5Index*, void*,
14f40 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29   const u8*, int)
14f50 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d  .){.  int nRem =
14f60 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20   pSeg->nPos;    
14f70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14f80 6f 66 20 62 79 74 65 73 20 73 74 69 6c 6c 20 74  of bytes still t
14f90 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35  o come */.  Fts5
14fa0 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 30 3b  Data *pData = 0;
14fb0 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20  .  u8 *pChunk = 
14fc0 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
14fd0 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
14fe0 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b  t];.  int nChunk
14ff0 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65   = MIN(nRem, pSe
15000 67 2d 3e 70 4c 65 61 66 2d 3e 6e 20 2d 20 70 53  g->pLeaf->n - pS
15010 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 29  eg->iLeafOffset)
15020 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70  ;.  int pgno = p
15030 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  Seg->iLeafPgno;.
15040 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d    int pgnoSave =
15050 20 30 3b 0a 0a 20 20 69 66 28 20 28 70 53 65 67   0;..  if( (pSeg
15060 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
15070 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d  EGITER_REVERSE)=
15080 3d 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61  =0 ){.    pgnoSa
15090 76 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d  ve = pgno+1;.  }
150a0 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
150b0 20 20 20 20 78 43 68 75 6e 6b 28 70 2c 20 70 43      xChunk(p, pC
150c0 74 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75  tx, pChunk, nChu
150d0 6e 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d  nk);.    nRem -=
150e0 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73   nChunk;.    fts
150f0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
15100 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  ta);.    if( nRe
15110 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  m<=0 ){.      br
15120 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
15130 20 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20        pgno++;.  
15140 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
15150 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
15160 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
15170 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  Seg->pSeg->iSegi
15180 64 2c 20 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  d, 0, pgno));.  
15190 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30      if( pData==0
151a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
151b0 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74 61 2d  pChunk = &pData-
151c0 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43 68  >p[4];.      nCh
151d0 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20  unk = MIN(nRem, 
151e0 70 44 61 74 61 2d 3e 6e 20 2d 20 34 29 3b 0a 20  pData->n - 4);. 
151f0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70       if( pgno==p
15200 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20 20 20  gnoSave ){.     
15210 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d     assert( pSeg-
15220 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b  >pNextLeaf==0 );
15230 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70  .        pSeg->p
15240 4e 65 78 74 4c 65 61 66 20 3d 20 70 44 61 74 61  NextLeaf = pData
15250 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61 20  ;.        pData 
15260 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
15270 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a   }.  }.}..../*.*
15280 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
15290 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20   segment-id for 
152a0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 53  the structure pS
152b0 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73  truct. The new s
152c0 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73  egment.** id mus
152d0 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  t be between 1 a
152e0 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69  nd 65335 inclusi
152f0 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74  ve, and must not
15300 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   be used by .** 
15310 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78  any currently ex
15320 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20  isting segment. 
15330 49 66 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e  If a free segmen
15340 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66  t id cannot be f
15350 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
15360 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  FULL is returned
15370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
15380 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
15390 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
153a0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
153b0 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74  op. 0 is .** ret
153c0 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
153d0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
153e0 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  t fts5AllocateSe
153f0 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  gid(Fts5Index *p
15400 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
15410 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 75 33 32  *pStruct){.  u32
15420 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20   iSegid = 0;..  
15430 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
15440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
15450 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
15460 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  t>=FTS5_MAX_SEGM
15470 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ENT ){.      p->
15480 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
15490 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
154a0 20 20 20 77 68 69 6c 65 28 20 69 53 65 67 69 64     while( iSegid
154b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
154c0 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
154d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
154e0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
154f0 28 75 33 32 29 2c 20 28 76 6f 69 64 2a 29 26 69  (u32), (void*)&i
15500 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
15510 69 53 65 67 69 64 20 3d 20 28 69 53 65 67 69 64  iSegid = (iSegid
15520 20 25 20 28 28 31 20 3c 3c 20 46 54 53 35 5f 44   % ((1 << FTS5_D
15530 41 54 41 5f 49 44 5f 42 29 20 2d 20 32 29 29 20  ATA_ID_B) - 2)) 
15540 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 61 73 73  + 1;.        ass
15550 65 72 74 28 20 69 53 65 67 69 64 3e 30 20 26 26  ert( iSegid>0 &&
15560 20 69 53 65 67 69 64 3c 3d 36 35 35 33 35 20 29   iSegid<=65535 )
15570 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 4c  ;.        for(iL
15580 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
15590 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
155a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
155b0 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
155c0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
155d0 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
155e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
155f0 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70 53 74   if( iSegid==pSt
15600 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
15610 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l].aSeg[iSeg].iS
15620 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  egid ){.        
15630 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 30        iSegid = 0
15640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
15650 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15660 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15670 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
15680 6e 20 28 69 6e 74 29 69 53 65 67 69 64 3b 0a 7d  n (int)iSegid;.}
15690 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
156a0 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e 74  all data current
156b0 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74 68 65  ly cached in the
156c0 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f   hash-tables..*/
156d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
156e0 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
156f0 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  a(Fts5Index *p){
15700 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48  .  assert( p->pH
15710 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69  ash || p->nPendi
15720 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69  ngData==0 );.  i
15730 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20  f( p->pHash ){. 
15740 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
15750 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73 68  shClear(p->pHash
15760 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
15770 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a  ngData = 0;.  }.
15780 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15790 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
157a0 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73  prefix, in bytes
157b0 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 28 6e  , that buffer (n
157c0 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72 65 73  New/pNew) shares
157d0 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65 72 20  .** with buffer 
157e0 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a  (nOld/pOld)..*/.
157f0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
15800 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20  refixCompress(. 
15810 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74   int nOld, const
15820 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74   u8 *pOld,.  int
15830 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75 38 20   nNew, const u8 
15840 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20 69  *pNew.){.  int i
15850 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74 73 35  ;.  assert( fts5
15860 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4f 6c 64  BlobCompare(pOld
15870 2c 20 6e 4f 6c 64 2c 20 70 4e 65 77 2c 20 6e 4e  , nOld, pNew, nN
15880 65 77 29 3c 30 20 29 3b 0a 20 20 66 6f 72 28 69  ew)<0 );.  for(i
15890 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
158a0 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69  {.    if( pOld[i
158b0 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65  ]!=pNew[i] ) bre
158c0 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
158d0 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   i;.}..static vo
158e0 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  id fts5WriteDlid
158f0 78 43 6c 65 61 72 28 0a 20 20 46 74 73 35 49 6e  xClear(.  Fts5In
15900 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
15910 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
15920 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75 73 68 20  r,.  int bFlush 
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
15950 20 77 72 69 74 65 20 64 6c 69 64 78 20 74 6f 20   write dlidx to 
15960 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  disk */.){.  int
15970 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 62 46   i;.  assert( bF
15980 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69  lush==0 || (pWri
15990 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26  ter->nDlidx>0 &&
159a0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
159b0 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a  [0].buf.n>0) );.
159c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72    for(i=0; i<pWr
159d0 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b  iter->nDlidx; i+
159e0 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  +){.    Fts5Dlid
159f0 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
15a00 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
15a10 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  dx[i];.    if( p
15a20 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20  Dlidx->buf.n==0 
15a30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
15a40 20 62 46 6c 75 73 68 20 29 7b 0a 20 20 20 20 20   bFlush ){.     
15a50 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
15a60 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20  >pgno!=0 );.    
15a70 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
15a80 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  p, .          FT
15a90 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
15aa0 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
15ab0 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29  i, pDlidx->pgno)
15ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69  ,.          pDli
15ad0 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64  dx->buf.p, pDlid
15ae0 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29  x->buf.n.      )
15af0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15b00 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72  te3Fts5BufferZer
15b10 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b  o(&pDlidx->buf);
15b20 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72  .    pDlidx->bPr
15b30 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  evValid = 0;.  }
15b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74  .}../*.** Grow t
15b50 68 65 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  he pWriter->aDli
15b60 64 78 5b 5d 20 61 72 72 61 79 20 74 6f 20 61 74  dx[] array to at
15b70 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d   least nLvl elem
15b80 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ents in size..**
15b90 20 41 6e 79 20 6e 65 77 20 61 72 72 61 79 20 65   Any new array e
15ba0 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a 65 72 6f  lements are zero
15bb0 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
15bc0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
15bd0 6e 74 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  nt fts5WriteDlid
15be0 78 47 72 6f 77 28 0a 20 20 46 74 73 35 49 6e 64  xGrow(.  Fts5Ind
15bf0 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67  ex *p,.  Fts5Seg
15c00 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
15c10 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20  .  int nLvl.){. 
15c20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15c30 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70  TE_OK && nLvl>=p
15c40 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29  Writer->nDlidx )
15c50 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57  {.    Fts5DlidxW
15c60 72 69 74 65 72 20 2a 61 44 6c 69 64 78 20 3d 20  riter *aDlidx = 
15c70 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
15c80 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
15c90 63 28 0a 20 20 20 20 20 20 20 20 70 57 72 69 74  c(.        pWrit
15ca0 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65  er->aDlidx, size
15cb0 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74  of(Fts5DlidxWrit
15cc0 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29  er) * nLvl.    )
15cd0 3b 0a 20 20 20 20 69 66 28 20 61 44 6c 69 64 78  ;.    if( aDlidx
15ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
15cf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15d00 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
15d10 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
15d20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
15d30 57 72 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20  Writer) * (nLvl 
15d40 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  - pWriter->nDlid
15d50 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  x);.      memset
15d60 28 26 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72  (&aDlidx[pWriter
15d70 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42  ->nDlidx], 0, nB
15d80 79 74 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69  yte);.      pWri
15d90 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44  ter->aDlidx = aD
15da0 6c 69 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69  lidx;.      pWri
15db0 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c  ter->nDlidx = nL
15dc0 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  vl;.    }.  }.  
15dd0 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
15de0 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 22 6e 45  ./*.** If an "nE
15df0 6d 70 74 79 22 20 72 65 63 6f 72 64 20 6d 75 73  mpty" record mus
15e00 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
15e10 74 68 65 20 62 2d 74 72 65 65 20 62 65 66 6f 72  the b-tree befor
15e20 65 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 74 65  e the next.** te
15e30 72 6d 2c 20 77 72 69 74 65 20 69 74 20 6e 6f 77  rm, write it now
15e40 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
15e50 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
15e60 4e 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78  NEmpty(Fts5Index
15e70 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
15e80 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
15e90 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  if( pWriter->nEm
15ea0 70 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  pty ){.    int b
15eb0 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 46 74  Flag = 0;.    Ft
15ec0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
15ed0 67 3b 0a 20 20 20 20 70 50 67 20 3d 20 26 70 57  g;.    pPg = &pW
15ee0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 31  riter->aWriter[1
15ef0 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
15f00 65 72 65 20 77 65 72 65 20 46 54 53 35 5f 4d 49  ere were FTS5_MI
15f10 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20  N_DLIDX_SIZE or 
15f20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65 61 66 20  more empty leaf 
15f30 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 20 20  pages written.  
15f40 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
15f50 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69 74 65  base, also write
15f60 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
15f70 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a  ex to disk.  */.
15f80 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
15f90 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
15fa0 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e  >0 && pWriter->n
15fb0 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f  Empty>=FTS5_MIN_
15fc0 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20  DLIDX_SIZE ){.  
15fd0 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20      bFlag = 1;. 
15fe0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 57 72 69     }.    fts5Wri
15ff0 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70 2c 20  teDlidxClear(p, 
16000 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67 29 3b  pWriter, bFlag);
16010 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
16020 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
16030 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 62  rc, &pPg->buf, b
16040 46 6c 61 67 29 3b 0a 20 20 20 20 66 74 73 35 42  Flag);.    fts5B
16050 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
16060 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e  t(&p->rc, &pPg->
16070 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e 6e 45  buf, pWriter->nE
16080 6d 70 74 79 29 3b 0a 20 20 20 20 70 57 72 69 74  mpty);.    pWrit
16090 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a  er->nEmpty = 0;.
160a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
160b0 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
160c0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 30 29 3b  (p, pWriter, 0);
160d0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
160e0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3d  pWriter->nDlidx=
160f0 3d 30 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 61  =0 || pWriter->a
16100 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d  Dlidx[0].buf.n==
16110 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
16120 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3d 3d  Writer->nDlidx==
16130 30 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 61 44  0 || pWriter->aD
16140 6c 69 64 78 5b 30 5d 2e 62 50 72 65 76 56 61 6c  lidx[0].bPrevVal
16150 69 64 3d 3d 30 20 29 3b 0a 7d 0a 0a 73 74 61 74  id==0 );.}..stat
16160 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
16170 65 42 74 72 65 65 47 72 6f 77 28 46 74 73 35 49  eBtreeGrow(Fts5I
16180 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
16190 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
161a0 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
161b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
161c0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
161d0 61 4e 65 77 3b 0a 20 20 20 20 46 74 73 35 50 61  aNew;.    Fts5Pa
161e0 67 65 57 72 69 74 65 72 20 2a 70 4e 65 77 3b 0a  geWriter *pNew;.
161f0 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 73      int nNew = s
16200 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72  izeof(Fts5PageWr
16210 69 74 65 72 29 20 2a 20 28 70 57 72 69 74 65 72  iter) * (pWriter
16220 2d 3e 6e 57 72 69 74 65 72 2b 31 29 3b 0a 0a 20  ->nWriter+1);.. 
16230 20 20 20 61 4e 65 77 20 3d 20 28 46 74 73 35 50     aNew = (Fts5P
16240 61 67 65 57 72 69 74 65 72 2a 29 73 71 6c 69 74  ageWriter*)sqlit
16250 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74  e3_realloc(pWrit
16260 65 72 2d 3e 61 57 72 69 74 65 72 2c 20 6e 4e 65  er->aWriter, nNe
16270 77 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  w);.    if( aNew
16280 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
16290 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
162a0 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  M;.      return;
162b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 65 77  .    }..    pNew
162c0 20 3d 20 26 61 4e 65 77 5b 70 57 72 69 74 65 72   = &aNew[pWriter
162d0 2d 3e 6e 57 72 69 74 65 72 5d 3b 0a 20 20 20 20  ->nWriter];.    
162e0 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
162f0 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57  sizeof(Fts5PageW
16300 72 69 74 65 72 29 29 3b 0a 20 20 20 20 70 4e 65  riter));.    pNe
16310 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  w->pgno = 1;.   
16320 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
16330 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
16340 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29 3b 0a  &pNew->buf, 1);.
16350 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 57  .    pWriter->nW
16360 72 69 74 65 72 2b 2b 3b 0a 20 20 20 20 70 57 72  riter++;.    pWr
16370 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20  iter->aWriter = 
16380 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  aNew;.  }.}../*.
16390 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
163a0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
163b0 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74  leaf page except
163c0 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20   the first that 
163d0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c  contains.** at l
163e0 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41  east one term. A
163f0 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70  rgument (nTerm/p
16400 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c  Term) is the spl
16410 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20  it-key - a term 
16420 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65  that.** is large
16430 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73  r than all terms
16440 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c   written to earl
16450 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20  ier leaves, and 
16460 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73  equal to or.** s
16470 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
16480 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  first term on th
16490 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a  e new leaf..**.*
164a0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
164b0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
164c0 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
164d0 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20  ts5Index.rc. If 
164e0 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20  an error.** has 
164f0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
16500 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
16510 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
16520 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
16530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16540 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
16550 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
16580 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
16590 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
165a0 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
165b0 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
165c0 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
165d0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
165e0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65       /* First te
165f0 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a  rm on new page *
16600 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65 69 67  /.){.  int iHeig
16610 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69 67 68  ht;.  for(iHeigh
16620 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68 74 2b  t=1; 1; iHeight+
16630 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65  +){.    Fts5Page
16640 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b 0a 0a  Writer *pPage;..
16650 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3e      if( iHeight>
16660 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65  =pWriter->nWrite
16670 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  r ){.      fts5W
16680 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c  riteBtreeGrow(p,
16690 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
166a0 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
166b0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
166c0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
166d0 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67 68 74  >aWriter[iHeight
166e0 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
166f0 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c 20  eBtreeNEmpty(p, 
16700 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20 20 69  pWriter);..    i
16710 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
16720 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
16730 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  z ){.      /* pP
16740 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69 74  age will be writ
16750 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ten to disk. The
16760 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77 72   term will be wr
16770 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 20  itten into the. 
16780 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6f       ** parent o
16790 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20 20  f pPage.  */.   
167a0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
167b0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
167c0 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67  ID(pWriter->iSeg
167d0 69 64 2c 20 69 48 65 69 67 68 74 2c 20 70 50 61  id, iHeight, pPa
167e0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
167f0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
16800 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d  , iRowid, pPage-
16810 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
16820 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  uf.n);.      fts
16830 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
16840 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20  ge->buf);.      
16850 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
16860 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a 20 20  pPage->term);.  
16870 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
16880 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
16890 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
168a0 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29 3b  pPage[-1].pgno);
168b0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67  .      pPage->pg
168c0 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no++;.    }else{
168d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20  .      int nPre 
168e0 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  = fts5PrefixComp
168f0 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d  ress(pPage->term
16900 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e  .n, pPage->term.
16910 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  p, nTerm, pTerm)
16920 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
16930 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
16940 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
16950 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20 20 20  uf, nPre+2);.   
16960 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
16970 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
16980 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
16990 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20 20 20  Term-nPre);.    
169a0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
169b0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
169c0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
169d0 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b 6e 50  m-nPre, pTerm+nP
169e0 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  re);.      fts5B
169f0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
16a00 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e   &pPage->term, n
16a10 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
16a20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16a30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
16a40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
16a50 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75 73 68  alled when flush
16a60 69 6e 67 20 61 20 6c 65 61 66 20 70 61 67 65 20  ing a leaf page 
16a70 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
16a80 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20 61 6c 6c  .** terms at all
16a90 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61   to disk..*/.sta
16aa0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
16ab0 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20  teBtreeNoTerm(. 
16ac0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
16af0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
16b00 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
16b10 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
16b20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
16b30 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  .){.  /* If ther
16b40 65 20 77 65 72 65 20 6e 6f 20 72 6f 77 69 64 73  e were no rowids
16b50 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67   on the leaf pag
16b60 65 20 65 69 74 68 65 72 20 61 6e 64 20 74 68 65  e either and the
16b70 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a 20   doclist-index. 
16b80 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
16b90 62 65 65 6e 20 73 74 61 72 74 65 64 2c 20 61 70  been started, ap
16ba0 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79 74  pend an 0x00 byt
16bb0 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20 69  e to it.  */.  i
16bc0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
16bd0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 26 26  stRowidInPage &&
16be0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
16bf0 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a 20  [0].buf.n>0 ){. 
16c00 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
16c10 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57  er *pDlidx = &pW
16c20 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
16c30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  ;.    assert( pD
16c40 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
16c50 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   );.    sqlite3F
16c60 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
16c70 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
16c80 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b 0a  Dlidx->buf, 0);.
16c90 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
16ca0 65 6e 74 20 74 68 65 20 22 6e 75 6d 62 65 72 20  ent the "number 
16cb0 6f 66 20 73 65 71 75 65 6e 74 69 61 6c 20 6c 65  of sequential le
16cc0 61 76 65 73 20 77 69 74 68 6f 75 74 20 61 20 74  aves without a t
16cd0 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a 2f  erm" counter. */
16ce0 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  .  pWriter->nEmp
16cf0 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ty++;.}..static 
16d00 69 36 34 20 66 74 73 35 44 6c 69 64 78 45 78 74  i64 fts5DlidxExt
16d10 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28 46  ractFirstRowid(F
16d20 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29  ts5Buffer *pBuf)
16d30 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  {.  i64 iRowid;.
16d40 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 69    int iOff;..  i
16d50 4f 66 66 20 3d 20 31 20 2b 20 66 74 73 35 47 65  Off = 1 + fts5Ge
16d60 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
16d70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77  [1], (u64*)&iRow
16d80 69 64 29 3b 0a 20 20 66 74 73 35 47 65 74 56 61  id);.  fts5GetVa
16d90 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f  rint(&pBuf->p[iO
16da0 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77  ff], (u64*)&iRow
16db0 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  id);.  return iR
16dc0 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  owid;.}../*.** R
16dd0 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73 20  owid iRowid has 
16de0 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e 64  just been append
16df0 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ed to the curren
16e00 74 20 6c 65 61 66 20 70 61 67 65 2e 20 49 74 20  t leaf page. It 
16e10 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  is the.** first 
16e20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  on the page. Thi
16e30 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
16e40 64 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ds an appropriat
16e50 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63  e entry to the c
16e60 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73  urrent.** doclis
16e70 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  t-index..*/.stat
16e80 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
16e90 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20 20  eDlidxAppend(.  
16ea0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
16eb0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
16ec0 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34 20  pWriter, .  i64 
16ed0 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20  iRowid.){.  int 
16ee0 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d  i;.  int bDone =
16ef0 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
16f00 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16f10 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b   && bDone==0; i+
16f20 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 56 61 6c  +){.    i64 iVal
16f30 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57  ;.    Fts5DlidxW
16f40 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  riter *pDlidx = 
16f50 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
16f60 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 44  [i];..    if( pD
16f70 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e  lidx->buf.n>=p->
16f80 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
16f90 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  .      /* The cu
16fa0 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e  rrent doclist-in
16fb0 64 65 78 20 70 61 67 65 20 69 73 20 66 75 6c 6c  dex page is full
16fc0 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20 64 69  . Write it to di
16fd0 73 6b 20 61 6e 64 20 70 75 73 68 0a 20 20 20 20  sk and push.    
16fe0 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 69    ** a copy of i
16ff0 52 6f 77 69 64 20 28 77 68 69 63 68 20 77 69 6c  Rowid (which wil
17000 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 66 69 72  l become the fir
17010 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  st rowid on the 
17020 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f  next.      ** do
17030 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65 61 66  clist-index leaf
17040 20 70 61 67 65 29 20 75 70 20 69 6e 74 6f 20 74   page) up into t
17050 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66  he next level of
17060 20 74 68 65 20 62 2d 74 72 65 65 20 0a 20 20 20   the b-tree .   
17070 20 20 20 2a 2a 20 68 69 65 72 61 72 63 68 79 2e     ** hierarchy.
17080 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62 65 69   If the node bei
17090 6e 67 20 66 6c 75 73 68 65 64 20 69 73 20 63 75  ng flushed is cu
170a0 72 72 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74  rrently the root
170b0 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20   node,.      ** 
170c0 61 6c 73 6f 20 70 75 73 68 20 69 74 73 20 66 69  also push its fi
170d0 72 73 74 20 72 6f 77 69 64 20 75 70 77 61 72 64  rst rowid upward
170e0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69  s. */.      pDli
170f0 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30  dx->buf.p[0] = 0
17100 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74  x01;    /* Not t
17110 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  he root node */.
17120 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
17130 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ite(p, .        
17140 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
17150 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67  ID(pWriter->iSeg
17160 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70  id, i, pDlidx->p
17170 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  gno),.          
17180 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70  pDlidx->buf.p, p
17190 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20  Dlidx->buf.n.   
171a0 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35     );.      fts5
171b0 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70  WriteDlidxGrow(p
171c0 2c 20 70 57 72 69 74 65 72 2c 20 69 2b 32 29 3b  , pWriter, i+2);
171d0 0a 20 20 20 20 20 20 70 44 6c 69 64 78 20 3d 20  .      pDlidx = 
171e0 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
171f0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
17200 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
17210 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  && pDlidx[1].buf
17220 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
17230 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 66 74   i64 iFirst = ft
17240 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46 69  s5DlidxExtractFi
17250 72 73 74 52 6f 77 69 64 28 26 70 44 6c 69 64 78  rstRowid(&pDlidx
17260 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20 20 20  ->buf);..       
17270 20 2f 2a 20 54 68 69 73 20 77 61 73 20 74 68 65   /* This was the
17280 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68   root node. Push
17290 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69 64   its first rowid
172a0 20 75 70 20 74 6f 20 74 68 65 20 6e 65 77 20 72   up to the new r
172b0 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  oot. */.        
172c0 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d  pDlidx[1].pgno =
172d0 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20   pDlidx->pgno;. 
172e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
172f0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
17300 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
17310 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b  lidx[1].buf, 0);
17320 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17330 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
17340 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
17350 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70  pDlidx[1].buf, p
17360 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20  Dlidx->pgno);.  
17370 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
17380 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
17390 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
173a0 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72  idx[1].buf, iFir
173b0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 6c  st);.        pDl
173c0 69 64 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69  idx[1].bPrevVali
173d0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  d = 1;.        p
173e0 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d  Dlidx[1].iPrev =
173f0 20 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d   iFirst;.      }
17400 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
17410 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
17420 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20  Dlidx->buf);.   
17430 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76     pDlidx->bPrev
17440 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Valid = 0;.     
17450 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b   pDlidx->pgno++;
17460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17470 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20    bDone = 1;.   
17480 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69   }..    if( pDli
17490 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29  dx->bPrevValid )
174a0 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69  {.      iVal = i
174b0 52 6f 77 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e  Rowid - pDlidx->
174c0 69 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  iPrev;.    }else
174d0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50 67 6e  {.      i64 iPgn
174e0 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72 69  o = (i==0 ? pWri
174f0 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e  ter->aWriter[0].
17500 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31  pgno : pDlidx[-1
17510 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61  ].pgno);.      a
17520 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62  ssert( pDlidx->b
17530 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  uf.n==0 );.     
17540 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
17550 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
17560 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
17570 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20  buf, !bDone);.  
17580 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
17590 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
175a0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
175b0 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a  x->buf, iPgno);.
175c0 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f        iVal = iRo
175d0 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  wid;.    }..    
175e0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
175f0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
17600 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
17610 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 70  uf, iVal);.    p
17620 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
17630 64 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69 64  d = 1;.    pDlid
17640 78 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f 77 69  x->iPrev = iRowi
17650 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  d;.  }.}..static
17660 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
17670 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64  lushLeaf(Fts5Ind
17680 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
17690 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
176a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
176b0 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30  8 zero[] = { 0x0
176c0 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
176d0 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67  x00 };.  Fts5Pag
176e0 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
176f0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
17700 65 72 5b 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f  er[0];.  i64 iRo
17710 77 69 64 3b 0a 0a 20 20 69 66 28 20 70 57 72 69  wid;..  if( pWri
17720 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
17730 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nPage ){.    /* 
17740 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72 69 74  No term was writ
17750 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65  ten to this page
17760 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
17770 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26   0==fts5GetU16(&
17780 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29  pPage->buf.p[2])
17790 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74   );.    fts5Writ
177a0 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20  eBtreeNoTerm(p, 
177b0 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  pWriter);.  }.. 
177c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 75   /* Write the cu
177d0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
177e0 65 20 64 62 2e 20 2a 2f 0a 20 20 69 52 6f 77 69  e db. */.  iRowi
177f0 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
17800 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e  _ROWID(pWriter->
17810 69 53 65 67 69 64 2c 20 30 2c 20 70 50 61 67 65  iSegid, 0, pPage
17820 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44  ->pgno);.  fts5D
17830 61 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77  ataWrite(p, iRow
17840 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70  id, pPage->buf.p
17850 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  , pPage->buf.n);
17860 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
17870 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e  e the next page.
17880 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72   */.  fts5Buffer
17890 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66  Zero(&pPage->buf
178a0 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
178b0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
178c0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34  , &pPage->buf, 4
178d0 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67 65  , zero);.  pPage
178e0 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  ->pgno++;..  /* 
178f0 49 6e 63 72 65 61 73 65 20 74 68 65 20 6c 65 61  Increase the lea
17900 76 65 73 20 77 72 69 74 74 65 6e 20 63 6f 75 6e  ves written coun
17910 74 65 72 20 2a 2f 0a 20 20 70 57 72 69 74 65 72  ter */.  pWriter
17920 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b  ->nLeafWritten++
17930 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  ;..  /* The new 
17940 6c 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65  leaf holds no te
17950 72 6d 73 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f  rms or rowids */
17960 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
17970 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31  stTermInPage = 1
17980 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
17990 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
179a0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   1;.}../*.** App
179b0 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e  end term pTerm/n
179c0 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d  Term to the segm
179d0 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74 74 65  ent being writte
179e0 6e 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20  n by the writer 
179f0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
17a00 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17a10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
17a20 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
17a30 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
17a40 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
17a50 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
17a60 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
17a70 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
17a80 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
17a90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
17aa0 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
17ab0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
17ac0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
17ad0 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
17ae0 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75  t nTerm, const u
17af0 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69  8 *pTerm .){.  i
17b00 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20  nt nPrefix;     
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b20 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65 66 69  * Bytes of prefi
17b30 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f  x compression fo
17b40 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35  r term */.  Fts5
17b50 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
17b60 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  e = &pWriter->aW
17b70 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 61 73 73  riter[0];..  ass
17b80 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e  ert( pPage->buf.
17b90 6e 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 62  n==0 || pPage->b
17ba0 75 66 2e 6e 3e 34 20 29 3b 0a 20 20 69 66 28 20  uf.n>4 );.  if( 
17bb0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20  pPage->buf.n==0 
17bc0 29 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74  ){.    /* Zero t
17bd0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 61 6e  he first term an
17be0 64 20 66 69 72 73 74 20 64 6f 63 69 64 20 66 69  d first docid fi
17bf0 65 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74 61 74  elds */.    stat
17c00 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
17c10 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30  [] = { 0x00, 0x0
17c20 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b  0, 0x00, 0x00 };
17c30 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
17c40 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
17c50 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34  , &pPage->buf, 4
17c60 2c 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61 73 73  , zero);.    ass
17c70 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 62 46  ert( pWriter->bF
17c80 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
17c90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72  ;.  }.  if( p->r
17ca0 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20  c ) return;.  . 
17cb0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
17cc0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
17cd0 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  {.    /* Update 
17ce0 74 68 65 20 22 66 69 72 73 74 20 74 65 72 6d 22  the "first term"
17cf0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
17d00 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  ge header. */.  
17d10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
17d20 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20  >buf.p[2]==0 && 
17d30 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d  pPage->buf.p[3]=
17d40 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 50 75  =0 );.    fts5Pu
17d50 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
17d60 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75  .p[2], pPage->bu
17d70 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65 66 69  f.n);.    nPrefi
17d80 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
17d90 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  Page->pgno!=1 ){
17da0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
17db0 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
17dc0 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20   on a leaf that 
17dd0 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d  is not the leftm
17de0 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20  ost leaf in.    
17df0 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74    ** the segment
17e00 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73   b-tree. In this
17e10 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65   case it is nece
17e20 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74  ssary to add a t
17e30 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  erm to.      ** 
17e40 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
17e50 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29  rchy that is (a)
17e60 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
17e70 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20   largest term . 
17e80 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
17e90 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
17ea0 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73  egment and (b) s
17eb0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65  maller than or e
17ec0 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  qual to.      **
17ed0 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f   this term. In o
17ee0 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72  ther words, a pr
17ef0 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e  efix of (pTerm/n
17f00 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e  Term) that is on
17f10 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
17f20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
17f30 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28  longest prefix (
17f40 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61  pTerm/nTerm) sha
17f50 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  res with the.   
17f60 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74     ** previous t
17f70 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  erm. .      **. 
17f80 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c       ** Usually,
17f90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
17fa0 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  rm is available 
17fb0 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20  in pPage->term. 
17fc0 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  The exception.  
17fd0 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69      ** is if thi
17fe0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
17ff0 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61  erm written in a
18000 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
18010 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20  rge step..      
18020 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
18030 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
18040 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  m is not availab
18050 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74  le, so just writ
18060 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
18070 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  y of (pTerm/nTer
18080 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  m) into the pare
18090 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  nt node. This is
180a0 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
180b0 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20  ** inefficient, 
180c0 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63  but still correc
180d0 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  t.  */.      int
180e0 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
180f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
18100 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  m.n ){.        n
18110 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69   = 1 + fts5Prefi
18120 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
18130 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
18140 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
18150 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Term);.      }. 
18160 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
18170 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74  reeTerm(p, pWrit
18180 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20  er, n, pTerm);. 
18190 20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57       pPage = &pW
181a0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
181b0 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
181c0 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  {.    nPrefix = 
181d0 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
181e0 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  ss(pPage->term.n
181f0 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c  , pPage->term.p,
18200 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
18210 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
18220 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
18230 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
18240 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20  nPrefix);.  }.. 
18250 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e   /* Append the n
18260 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
18270 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e  f new data, then
18280 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69   the term data i
18290 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68  tself.  ** to th
182a0 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  e page. */.  fts
182b0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
182c0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
182d0 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d  ge->buf, nTerm -
182e0 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73   nPrefix);.  fts
182f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
18300 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
18310 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
18320 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e  Prefix, &pTerm[n
18330 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20  Prefix]);..  /* 
18340 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50  Update the Fts5P
18350 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66  ageWriter.term f
18360 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42  ield. */.  fts5B
18370 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
18380 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e   &pPage->term, n
18390 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
183a0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
183b0 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a  ermInPage = 0;..
183c0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
183d0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
183e0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
183f0 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
18400 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  t = 1;..  assert
18410 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69  ( p->rc || (pWri
18420 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26  ter->nDlidx>0 &&
18430 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
18440 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b  [0].buf.n==0) );
18450 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  .  pWriter->aDli
18460 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61  dx[0].pgno = pPa
18470 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 2f 2a 20  ge->pgno;..  /* 
18480 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  If the current l
18490 65 61 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c  eaf page is full
184a0 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69  , flush it to di
184b0 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  sk. */.  if( pPa
184c0 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43  ge->buf.n>=p->pC
184d0 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
184e0 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
184f0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
18500 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
18510 41 70 70 65 6e 64 20 61 20 64 6f 63 69 64 20 61  Append a docid a
18520 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  nd position-list
18530 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74   size field to t
18540 68 65 20 77 72 69 74 65 72 73 20 6f 75 74 70 75  he writers outpu
18550 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
18560 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
18570 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49  ndRowid(.  Fts5I
18580 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
18590 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
185a0 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64  er,.  i64 iRowid
185b0 2c 0a 20 20 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a  ,.  int nPos.){.
185c0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
185d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
185e0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
185f0 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
18600 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 20  aWriter[0];..   
18610 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
18620 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 64  o be the first d
18630 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  ocid written to 
18640 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74 68  the page, set th
18650 65 20 0a 20 20 20 20 2a 2a 20 64 6f 63 69 64 2d  e .    ** docid-
18660 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70  pointer in the p
18670 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f  age-header. Also
18680 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20   append a value 
18690 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20  to the dlidx.   
186a0 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63   ** buffer, in c
186b0 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ase a doclist-in
186c0 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e  dex is required.
186d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72    */.    if( pWr
186e0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
186f0 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
18700 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61 67   fts5PutU16(pPag
18710 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
18720 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66  >buf.n);.      f
18730 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
18740 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20  end(p, pWriter, 
18750 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iRowid);.    }..
18760 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
18770 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 20 20 69   docid. */.    i
18780 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
18790 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
187a0 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69   || pWriter->bFi
187b0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
187c0 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
187d0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
187e0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
187f0 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  uf, iRowid);.   
18800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
18810 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69  sert( p->rc || i
18820 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69  Rowid>pWriter->i
18830 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20  PrevRowid );.   
18840 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
18850 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
18860 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69  , &pPage->buf, i
18870 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d  Rowid - pWriter-
18880 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20  >iPrevRowid);.  
18890 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d    }.    pWriter-
188a0 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52  >iPrevRowid = iR
188b0 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65  owid;.    pWrite
188c0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
188d0 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Doclist = 0;.   
188e0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
188f0 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
18900 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
18910 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
18920 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
18930 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 69 66  , nPos);..    if
18940 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
18950 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
18960 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72   ){.      fts5Wr
18970 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
18980 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a  pWriter);.    }.
18990 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
189a0 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
189b0 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20  ndPoslistData(. 
189c0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
189d0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
189e0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e  *pWriter, .  con
189f0 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20  st u8 *aData, . 
18a00 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20   int nData.){.  
18a10 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
18a20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
18a30 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20  ->aWriter[0];.  
18a40 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44  const u8 *a = aD
18a50 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e  ata;.  int n = n
18a60 44 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72  Data;.  .  asser
18a70 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  t( p->pConfig->p
18a80 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  gsz>0 );.  while
18a90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18aa0 4f 4b 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75  OK && (pPage->bu
18ab0 66 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f  f.n + n)>=p->pCo
18ac0 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
18ad0 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e    int nReq = p->
18ae0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20  pConfig->pgsz - 
18af0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 20 20  pPage->buf.n;.  
18b00 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b    int nCopy = 0;
18b10 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70  .    while( nCop
18b20 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20  y<nReq ){.      
18b30 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  i64 dummy;.     
18b40 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35 47 65   nCopy += fts5Ge
18b50 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70 79  tVarint(&a[nCopy
18b60 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d 79 29  ], (u64*)&dummy)
18b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
18b80 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
18b90 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
18ba0 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29 3b  >buf, nCopy, a);
18bb0 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b  .    a += nCopy;
18bc0 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b  .    n -= nCopy;
18bd0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c  .    fts5WriteFl
18be0 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
18bf0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  er);.  }.  if( n
18c00 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  >0 ){.    fts5Bu
18c10 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
18c20 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
18c30 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d  uf, n, a);.  }.}
18c40 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
18c50 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72  s5WriteAppendZer
18c60 6f 62 79 74 65 28 46 74 73 35 49 6e 64 65 78 20  obyte(Fts5Index 
18c70 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
18c80 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 66  r *pWriter){.  f
18c90 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
18ca0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
18cb0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
18cc0 30 5d 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  0].buf, 0);.}../
18cd0 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64  *.** Flush any d
18ce0 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74 68  ata cached by th
18cf0 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20  e writer object 
18d00 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
18d10 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c   Free any.** all
18d20 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  ocations associa
18d30 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72 69  ted with the wri
18d40 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
18d50 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69 6e  oid fts5WriteFin
18d60 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ish(.  Fts5Index
18d70 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
18d80 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
18d90 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18da0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
18db0 74 20 2a 70 6e 48 65 69 67 68 74 2c 20 20 20 20  t *pnHeight,    
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18dd0 20 4f 55 54 3a 20 48 65 69 67 68 74 20 6f 66 20   OUT: Height of 
18de0 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  the b-tree */.  
18df0 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20 20  int *pnLeaf     
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e10 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f  /* OUT: Number o
18e20 66 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e 20  f leaf pages in 
18e30 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69  b-tree */.){.  i
18e40 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 72  nt i;.  if( p->r
18e50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18e60 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
18e70 65 72 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72  er *pLeaf = &pWr
18e80 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
18e90 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d  ;.    if( pLeaf-
18ea0 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 4c 65 61  >pgno==1 && pLea
18eb0 66 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20  f->buf.n==0 ){. 
18ec0 20 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 30       *pnLeaf = 0
18ed0 3b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68  ;.      *pnHeigh
18ee0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
18ef0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 61  {.      if( pLea
18f00 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  f->buf.n>4 ){.  
18f10 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
18f20 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
18f30 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
18f40 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c      *pnLeaf = pL
18f50 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20  eaf->pgno-1;.   
18f60 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
18f70 6e 57 72 69 74 65 72 3d 3d 31 20 26 26 20 70 57  nWriter==1 && pW
18f80 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46  riter->nEmpty>=F
18f90 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
18fa0 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ZE ){.        ft
18fb0 73 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77  s5WriteBtreeGrow
18fc0 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
18fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18fe0 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
18ff0 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  >1 ){.        ft
19000 73 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70  s5WriteBtreeNEmp
19010 74 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ty(p, pWriter);.
19020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
19030 6e 48 65 69 67 68 74 20 3d 20 70 57 72 69 74 65  nHeight = pWrite
19040 72 2d 3e 6e 57 72 69 74 65 72 3b 0a 0a 20 20 20  r->nWriter;..   
19050 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 57     for(i=1; i<pW
19060 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20  riter->nWriter; 
19070 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74  i++){.        Ft
19080 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
19090 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  g = &pWriter->aW
190a0 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  riter[i];.      
190b0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
190c0 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  p, .            
190d0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
190e0 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67  ID(pWriter->iSeg
190f0 69 64 2c 20 69 2c 20 70 50 67 2d 3e 70 67 6e 6f  id, i, pPg->pgno
19100 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
19110 70 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d  pPg->buf.p, pPg-
19120 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 20 20 29  >buf.n.        )
19130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19140 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
19150 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65  <pWriter->nWrite
19160 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  r; i++){.    Fts
19170 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 67  5PageWriter *pPg
19180 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
19190 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 66 74 73  iter[i];.    fts
191a0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 50 67  5BufferFree(&pPg
191b0 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 66 74 73  ->term);.    fts
191c0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 50 67  5BufferFree(&pPg
191d0 2d 3e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71  ->buf);.  }.  sq
191e0 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74  lite3_free(pWrit
191f0 65 72 2d 3e 61 57 72 69 74 65 72 29 3b 0a 0a 20  er->aWriter);.. 
19200 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69   for(i=0; i<pWri
19210 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b  ter->nDlidx; i++
19220 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
19230 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
19240 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
19250 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  .buf);.  }.  sql
19260 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
19270 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73  r->aDlidx);.}..s
19280 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
19290 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35  riteInit(.  Fts5
192a0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
192b0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
192c0 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67  ter, .  int iSeg
192d0 69 64 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  id.){.  memset(p
192e0 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Writer, 0, sizeo
192f0 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
19300 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53  );.  pWriter->iS
19310 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a  egid = iSegid;..
19320 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74    pWriter->aWrit
19330 65 72 20 3d 20 28 46 74 73 35 50 61 67 65 57 72  er = (Fts5PageWr
19340 69 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c  iter*)fts5IdxMal
19350 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
19360 73 35 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a  s5PageWriter));.
19370 20 20 69 66 28 20 66 74 73 35 57 72 69 74 65 44    if( fts5WriteD
19380 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69  lidxGrow(p, pWri
19390 74 65 72 2c 20 31 29 20 29 20 72 65 74 75 72 6e  ter, 1) ) return
193a0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72  ;.  pWriter->nWr
193b0 69 74 65 72 20 3d 20 31 3b 0a 20 20 70 57 72 69  iter = 1;.  pWri
193c0 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 31 3b  ter->nDlidx = 1;
193d0 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69  .  pWriter->aWri
193e0 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 31 3b  ter[0].pgno = 1;
193f0 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
19400 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31  stTermInPage = 1
19410 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
19420 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 46 6f   fts5WriteInitFo
19430 72 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49  rAppend(.  Fts5I
19440 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
19450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
19460 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
19470 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
19480 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20  iter *pWriter,  
19490 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
194a0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a   to initialize *
194b0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
194c0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20  eSegment *pSeg  
194d0 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6f      /* Segment o
194e0 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e 64 20  bject to append 
194f0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  to */.){.  int n
19500 42 79 74 65 20 3d 20 70 53 65 67 2d 3e 6e 48 65  Byte = pSeg->nHe
19510 69 67 68 74 20 2a 20 73 69 7a 65 6f 66 28 46 74  ight * sizeof(Ft
19520 73 35 50 61 67 65 57 72 69 74 65 72 29 3b 0a 20  s5PageWriter);. 
19530 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c   memset(pWriter,
19540 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
19550 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57  egWriter));.  pW
19560 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  riter->iSegid = 
19570 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
19580 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
19590 20 3d 20 28 46 74 73 35 50 61 67 65 57 72 69 74   = (Fts5PageWrit
195a0 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
195b0 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70  c(p, nByte);.  p
195c0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d  Writer->aDlidx =
195d0 20 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65   (Fts5DlidxWrite
195e0 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
195f0 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
19600 6c 69 64 78 57 72 69 74 65 72 29 29 3b 0a 0a 20  lidxWriter));.. 
19610 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19620 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
19630 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 69   pgno = 1;.    i
19640 6e 74 20 69 3b 0a 20 20 20 20 70 57 72 69 74 65  nt i;.    pWrite
19650 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 31 3b 0a 20  r->nDlidx = 1;. 
19660 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69     pWriter->nWri
19670 74 65 72 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69  ter = pSeg->nHei
19680 67 68 74 3b 0a 20 20 20 20 70 57 72 69 74 65 72  ght;.    pWriter
19690 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
196a0 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  o = pSeg->pgnoLa
196b0 73 74 2b 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  st+1;.    for(i=
196c0 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b  pSeg->nHeight-1;
196d0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
196e0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
196f0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
19700 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
19710 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  d, i, pgno);.   
19720 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
19730 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65  r *pPg = &pWrite
19740 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20  r->aWriter[i];. 
19750 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
19760 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74 73   pgno;.      fts
19770 35 44 61 74 61 42 75 66 66 65 72 28 70 2c 20 26  5DataBuffer(p, &
19780 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  pPg->buf, iRowid
19790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
197a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
197b0 0a 20 20 20 20 20 20 20 20 46 74 73 35 4e 6f 64  .        Fts5Nod
197c0 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20 20 20  eIter ss;.      
197d0 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e    fts5NodeIterIn
197e0 69 74 28 70 50 67 2d 3e 62 75 66 2e 70 2c 20 70  it(pPg->buf.p, p
197f0 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73 73 29 3b  Pg->buf.n, &ss);
19800 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
19810 73 73 2e 61 44 61 74 61 20 29 20 66 74 73 35 4e  ss.aData ) fts5N
19820 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e  odeIterNext(&p->
19830 72 63 2c 20 26 73 73 29 3b 0a 20 20 20 20 20 20  rc, &ss);.      
19840 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
19850 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 74 65  &p->rc, &pPg->te
19860 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73  rm, ss.term.n, s
19870 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20  s.term.p);.     
19880 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e 69 43 68     pgno = ss.iCh
19890 69 6c 64 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ild;.        fts
198a0 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 73  5NodeIterFree(&s
198b0 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
198c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
198d0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
198e0 7c 20 28 70 67 6e 6f 2b 70 57 72 69 74 65 72 2d  | (pgno+pWriter-
198f0 3e 6e 45 6d 70 74 79 29 3d 3d 70 53 65 67 2d 3e  >nEmpty)==pSeg->
19900 70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20  pgnoLast );.    
19910 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
19920 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
19930 20 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74     assert( pWrit
19940 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 74  er->aWriter[0].t
19950 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 7d 0a  erm.n==0 );.  }.
19960 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
19970 72 20 70 49 74 65 72 20 77 61 73 20 75 73 65 64  r pIter was used
19980 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
19990 75 67 68 20 74 68 65 20 69 6e 70 75 74 20 73 65  ugh the input se
199a0 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a  gments of on an.
199b0 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  ** incremental m
199c0 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  erge operation. 
199d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
199e0 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69   called if the i
199f0 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65  ncremental.** me
19a00 72 67 65 20 73 74 65 70 20 68 61 73 20 66 69 6e  rge step has fin
19a10 69 73 68 65 64 20 62 75 74 20 74 68 65 20 69 6e  ished but the in
19a20 70 75 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  put has not been
19a30 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61   completely exha
19a40 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  usted..*/.static
19a50 20 76 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65   void fts5TrimSe
19a60 67 6d 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78  gments(Fts5Index
19a70 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65   *p, Fts5MultiSe
19a80 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
19a90 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42 75   int i;.  Fts5Bu
19aa0 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73  ffer buf;.  mems
19ab0 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
19ac0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
19ad0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
19ae0 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
19af0 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
19b00 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
19b10 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66  >aSeg[i];.    if
19b20 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20  ( pSeg->pSeg==0 
19b30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f  ){.      /* no-o
19b40 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  p */.    }else i
19b50 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d  f( pSeg->pLeaf==
19b60 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  0 ){.      /* Al
19b70 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 69 73  l keys from this
19b80 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 68   input segment h
19b90 61 76 65 20 62 65 65 6e 20 74 72 61 6e 73 66 65  ave been transfe
19ba0 72 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  red to the outpu
19bb0 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65 74 20  t..      ** Set 
19bc0 62 6f 74 68 20 74 68 65 20 66 69 72 73 74 20 61  both the first a
19bd0 6e 64 20 6c 61 73 74 20 70 61 67 65 2d 6e 75 6d  nd last page-num
19be0 62 65 72 73 20 74 6f 20 30 20 74 6f 20 69 6e 64  bers to 0 to ind
19bf0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  icate that the. 
19c00 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
19c10 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a 2f  is now empty. */
19c20 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65  .      pSeg->pSe
19c30 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  g->pgnoLast = 0;
19c40 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65  .      pSeg->pSe
19c50 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30  g->pgnoFirst = 0
19c60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19c70 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53     int iOff = pS
19c80 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  eg->iTermLeafOff
19c90 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73  set;     /* Offs
19ca0 65 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20  et on new first 
19cb0 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20  leaf page */.   
19cc0 20 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69     i64 iLeafRowi
19cd0 64 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74  d;.      Fts5Dat
19ce0 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20  a *pData;.      
19cf0 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e  int iId = pSeg->
19d00 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
19d10 20 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d      u8 aHdr[4] =
19d20 20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78   {0x00, 0x00, 0x
19d30 30 30 2c 20 30 78 30 34 7d 3b 0a 0a 20 20 20 20  00, 0x04};..    
19d40 20 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46    iLeafRowid = F
19d50 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
19d60 44 28 69 49 64 2c 20 30 2c 20 70 53 65 67 2d 3e  D(iId, 0, pSeg->
19d70 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
19d80 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74        pData = ft
19d90 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c  s5DataRead(p, iL
19da0 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
19db0 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
19dc0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
19dd0 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20  Zero(&buf);.    
19de0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
19df0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
19e00 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48   &buf, sizeof(aH
19e10 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20  dr), aHdr);.    
19e20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
19e30 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
19e40 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74  c, &buf, pSeg->t
19e50 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  erm.n);.        
19e60 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
19e70 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
19e80 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c  f, pSeg->term.n,
19e90 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a   pSeg->term.p);.
19ea0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
19eb0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
19ec0 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61  >rc, &buf, pData
19ed0 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20 26 70 44 61  ->n - iOff, &pDa
19ee0 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20  ta->p[iOff]);.  
19ef0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
19f00 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20  lease(pData);.  
19f10 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
19f20 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 70 53  ->pgnoFirst = pS
19f30 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  eg->iTermLeafPgn
19f40 6f 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  o;.        fts5D
19f50 61 74 61 44 65 6c 65 74 65 28 70 2c 20 46 54 53  ataDelete(p, FTS
19f60 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
19f70 69 49 64 2c 20 30 2c 20 31 29 2c 69 4c 65 61 66  iId, 0, 1),iLeaf
19f80 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
19f90 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
19fa0 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75 66   iLeafRowid, buf
19fb0 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20  .p, buf.n);.    
19fc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
19fd0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
19fe0 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  buf);.}..static 
19ff0 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 43 68  void fts5MergeCh
1a000 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46  unkCallback(.  F
1a010 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1a020 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63  void *pCtx, .  c
1a030 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
1a040 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
1a050 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1a060 70 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 53  pWriter = (Fts5S
1a070 65 67 57 72 69 74 65 72 2a 29 70 43 74 78 3b 0a  egWriter*)pCtx;.
1a080 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
1a090 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70 2c 20  dPoslistData(p, 
1a0a0 70 57 72 69 74 65 72 2c 20 70 43 68 75 6e 6b 2c  pWriter, pChunk,
1a0b0 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a   nChunk);.}../*.
1a0c0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
1a0d0 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65  d fts5IndexMerge
1a0e0 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49 6e 64  Level(.  Fts5Ind
1a0f0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1a100 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1a110 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1a120 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1a130 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
1a140 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1a150 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  Stucture of inde
1a160 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  x */.  int iLvl,
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
1a190 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 72  to read input fr
1a1a0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  om */.  int *pnR
1a1b0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
1a1c0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1a1d0 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79   up to this many
1a1e0 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a   output leaves *
1a1f0 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
1a200 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
1a210 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73  *ppStruct;.  Fts
1a220 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
1a230 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
1a240 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
1a250 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
1a260 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20  evel *pLvlOut;. 
1a270 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
1a280 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20  r *pIter = 0;   
1a290 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
1a2a0 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20  read input data 
1a2b0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  */.  int nRem = 
1a2c0 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a  pnRem ? *pnRem :
1a2d0 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c   0;  /* Output l
1a2e0 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74  eaf pages left t
1a2f0 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
1a300 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20   nInput;        
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a320 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  Number of input 
1a330 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74  segments */.  Ft
1a340 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
1a350 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
1a360 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
1a370 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
1a380 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
1a390 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65      /* Output se
1a3a0 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42  gment */.  Fts5B
1a3b0 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e  uffer term;.  in
1a3c0 74 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73  t bRequireDoclis
1a3d0 74 54 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a  tTerm = 0;    /*
1a3e0 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61   Doclist termina
1a3f0 74 6f 72 20 28 30 78 30 30 29 20 72 65 71 75 69  tor (0x00) requi
1a400 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6c  red */.  int bOl
1a410 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
1a420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a430 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 73   if the output s
1a440 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c  egment is the ol
1a450 64 65 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  dest */..  asser
1a460 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  t( iLvl<pStruct-
1a470 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73  >nLevel );.  ass
1a480 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ert( pLvl->nMerg
1a490 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b  e<=pLvl->nSeg );
1a4a0 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74  ..  memset(&writ
1a4b0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
1a4c0 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
1a4d0 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30   memset(&term, 0
1a4e0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1a4f0 66 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76  fer));.  if( pLv
1a500 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20  l->nMerge ){.   
1a510 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72   pLvlOut = &pStr
1a520 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1a530 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  +1];.    assert(
1a540 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30   pLvlOut->nSeg>0
1a550 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d   );.    nInput =
1a560 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20   pLvl->nMerge;. 
1a570 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
1a580 46 6f 72 41 70 70 65 6e 64 28 70 2c 20 26 77 72  ForAppend(p, &wr
1a590 69 74 65 72 2c 20 26 70 4c 76 6c 4f 75 74 2d 3e  iter, &pLvlOut->
1a5a0 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53  aSeg[pLvlOut->nS
1a5b0 65 67 2d 31 5d 29 3b 0a 20 20 20 20 70 53 65 67  eg-1]);.    pSeg
1a5c0 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
1a5d0 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d  g[pLvlOut->nSeg-
1a5e0 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1];.  }else{.   
1a5f0 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74   int iSegid = ft
1a600 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
1a610 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  p, pStruct);..  
1a620 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20    /* Extend the 
1a630 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
1a640 6a 65 63 74 20 61 73 20 72 65 71 75 69 72 65 64  ject as required
1a650 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f   to ensure the o
1a660 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67  utput.    ** seg
1a670 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  ment exists. */.
1a680 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53      if( iLvl==pS
1a690 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20  truct->nLevel-1 
1a6a0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
1a6b0 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
1a6c0 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29  p->rc, ppStruct)
1a6d0 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20  ;.      pStruct 
1a6e0 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
1a6f0 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
1a700 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
1a710 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
1a720 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a   iLvl+1, 1, 0);.
1a730 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
1a740 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c  return;.    pLvl
1a750 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1a760 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70  vel[iLvl];.    p
1a770 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63  LvlOut = &pStruc
1a780 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31  t->aLevel[iLvl+1
1a790 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
1a7a0 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
1a7b0 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
1a7c0 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73  /* Add the new s
1a7d0 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75  egment to the ou
1a7e0 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  tput level */.  
1a7f0 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
1a800 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
1a810 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c  >nSeg];.    pLvl
1a820 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20  Out->nSeg++;.   
1a830 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
1a840 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e   = 1;.    pSeg->
1a850 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
1a860 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53  .    pStruct->nS
1a870 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f  egment++;..    /
1a880 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f  * Read input fro
1a890 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  m all segments i
1a8a0 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65  n the input leve
1a8b0 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20  l */.    nInput 
1a8c0 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20  = pLvl->nSeg;.  
1a8d0 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70  }.  bOldest = (p
1a8e0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20  LvlOut->nSeg==1 
1a8f0 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  && pStruct->nLev
1a900 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20  el==iLvl+2);..  
1a910 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30 20  assert( iLvl>=0 
1a920 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c  );.  for(fts5Mul
1a930 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
1a940 72 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ruct, 0, 0, 0, 0
1a950 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20  , iLvl, nInput, 
1a960 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66  &pIter);.      f
1a970 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
1a980 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20  p, pIter)==0;.  
1a990 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1a9a0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
1a9b0 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46  0, 0).  ){.    F
1a9c0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1a9d0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
1a9e0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
1a9f0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
1aa00 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20  int nPos;       
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa20 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
1aa30 69 7a 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20  ize field value 
1aa40 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  */.    int nTerm
1aa50 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  ;.    const u8 *
1aa60 70 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 43  pTerm;..    /* C
1aa70 68 65 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e  heck for key ann
1aa80 69 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ihilation. */.  
1aa90 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 50 6f 73    if( pSeg->nPos
1aaa0 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20  ==0 && (bOldest 
1aab0 7c 7c 20 70 53 65 67 2d 3e 62 44 65 6c 3d 3d 30  || pSeg->bDel==0
1aac0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  ) ) continue;.. 
1aad0 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d     pTerm = fts5M
1aae0 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74  ultiIterTerm(pIt
1aaf0 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20  er, &nTerm);.   
1ab00 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d   if( nTerm!=term
1ab10 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65  .n || memcmp(pTe
1ab20 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72  rm, term.p, nTer
1ab30 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m) ){.      if( 
1ab40 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e  pnRem && writer.
1ab50 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65  nLeafWritten>nRe
1ab60 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  m ){.        bre
1ab70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
1ab80 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
1ab90 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64  new term. Append
1aba0 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f   a term to the o
1abb0 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a  utput segment. *
1abc0 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 71  /.      if( bReq
1abd0 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20  uireDoclistTerm 
1abe0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57  ){.        fts5W
1abf0 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79  riteAppendZeroby
1ac00 74 65 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a  te(p, &writer);.
1ac10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1ac20 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
1ac30 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54  m(p, &writer, nT
1ac40 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
1ac50 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
1ac60 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20  (&p->rc, &term, 
1ac70 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1ac80 20 20 20 20 20 62 52 65 71 75 69 72 65 44 6f 63       bRequireDoc
1ac90 6c 69 73 74 54 65 72 6d 20 3d 20 31 3b 0a 20 20  listTerm = 1;.  
1aca0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65    }..    /* Appe
1acb0 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20  nd the rowid to 
1acc0 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
1acd0 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
1ace0 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 6e 50 6f  TSIZE */.    nPo
1acf0 73 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 2a 32  s = pSeg->nPos*2
1ad00 20 2b 20 70 53 65 67 2d 3e 62 44 65 6c 3b 0a 20   + pSeg->bDel;. 
1ad10 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
1ad20 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74  ndRowid(p, &writ
1ad30 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  er, fts5MultiIte
1ad40 72 52 6f 77 69 64 28 70 49 74 65 72 29 2c 20 6e  rRowid(pIter), n
1ad50 50 6f 73 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  Pos);..    /* Ap
1ad60 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74 69 6f  pend the positio
1ad70 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f 20 74  n-list data to t
1ad80 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
1ad90 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
1ada0 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64  e(p, pSeg, (void
1adb0 2a 29 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d  *)&writer, fts5M
1adc0 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63  ergeChunkCallbac
1add0 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c  k);.  }..  /* Fl
1ade0 75 73 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61  ush the last lea
1adf0 66 20 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20  f page to disk. 
1ae00 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 73  Set the output s
1ae10 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65  egment b-tree he
1ae20 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61  ight.  ** and la
1ae30 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
1ae40 62 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20  ber at the same 
1ae50 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35  time.  */.  fts5
1ae60 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
1ae70 77 72 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 6e  writer, &pSeg->n
1ae80 48 65 69 67 68 74 2c 20 26 70 53 65 67 2d 3e 70  Height, &pSeg->p
1ae90 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28  gnoLast);..  if(
1aea0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1aeb0 66 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20  f(p, pIter) ){. 
1aec0 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f     int i;..    /
1aed0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64  * Remove the red
1aee0 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20  undant segments 
1aef0 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
1af00 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72  table */.    for
1af10 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20  (i=0; i<nInput; 
1af20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
1af30 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e  DataRemoveSegmen
1af40 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  t(p, pLvl->aSeg[
1af50 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  i].iSegid);.    
1af60 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
1af70 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73   the redundant s
1af80 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
1af90 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
1afa0 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
1afb0 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20  eg!=nInput ){.  
1afc0 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20      int nMove = 
1afd0 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49  (pLvl->nSeg - nI
1afe0 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46  nput) * sizeof(F
1aff0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1b000 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  ent);.      memm
1b010 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20  ove(pLvl->aSeg, 
1b020 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70  &pLvl->aSeg[nInp
1b030 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20  ut], nMove);.   
1b040 20 7d 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e   }.    pStruct->
1b050 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70  nSegment -= nInp
1b060 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53  ut;.    pLvl->nS
1b070 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  eg -= nInput;.  
1b080 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d    pLvl->nMerge =
1b090 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67   0;.    if( pSeg
1b0a0 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b  ->pgnoLast==0 ){
1b0b0 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e  .      pLvlOut->
1b0c0 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53  nSeg--;.      pS
1b0d0 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d  truct->nSegment-
1b0e0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  -;.    }.  }else
1b0f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
1b100 65 67 2d 3e 6e 48 65 69 67 68 74 3e 30 20 26 26  eg->nHeight>0 &&
1b110 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e   pSeg->pgnoLast>
1b120 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69  0 );.    fts5Tri
1b130 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74  mSegments(p, pIt
1b140 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e  er);.    pLvl->n
1b150 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a  Merge = nInput;.
1b160 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69    }..  fts5Multi
1b170 49 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65  IterFree(p, pIte
1b180 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  r);.  fts5Buffer
1b190 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 69  Free(&term);.  i
1b1a0 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52 65  f( pnRem ) *pnRe
1b1b0 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61  m -= writer.nLea
1b1c0 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a  fWritten;.}../*.
1b1d0 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50 67 20  ** Do up to nPg 
1b1e0 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d 65 72  pages of automer
1b1f0 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65 20 69  ge work on the i
1b200 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1b210 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65  void fts5IndexMe
1b220 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
1b230 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1b240 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1b250 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1b260 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1b270 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20   **ppStruct,    
1b280 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
1b290 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
1b2a0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
1b2b0 74 20 6e 50 67 20 20 20 20 20 20 20 20 20 20 20  t nPg           
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b2d0 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74   Pages of work t
1b2e0 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  o do */.){.  int
1b2f0 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20 20 46   nRem = nPg;.  F
1b300 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1b310 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1b320 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52 65 6d  t;.  while( nRem
1b330 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  >0 && p->rc==SQL
1b340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
1b350 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
1b360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
1b370 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1b380 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e  levels */.    in
1b390 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b 20  t iBestLvl = 0; 
1b3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
1b3b0 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68 65 20  el offering the 
1b3c0 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67 6d 65  most input segme
1b3d0 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
1b3e0 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
1b3f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b400 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
1b410 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c  ts on best level
1b420 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
1b430 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68 65 20  iBestLvl to the 
1b440 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  level to read in
1b450 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  put segments fro
1b460 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  m. */.    assert
1b470 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
1b480 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  l>0 );.    for(i
1b490 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
1b4a0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
1b4b0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
1b4c0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
1b4d0 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
1b4e0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
1b4f0 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
1b500 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 20  Merge ){.       
1b510 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
1b520 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20  e>nBest ){.     
1b530 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
1b540 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  iLvl;.          
1b550 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d  nBest = pLvl->nM
1b560 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  erge;.        }.
1b570 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b590 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73   pLvl->nSeg>nBes
1b5a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 65  t ){.        nBe
1b5b0 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  st = pLvl->nSeg;
1b5c0 0a 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76  .        iBestLv
1b5d0 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20  l = iLvl;.      
1b5e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1b5f0 49 66 20 6e 42 65 73 74 20 69 73 20 73 74 69 6c  If nBest is stil
1b600 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  l 0, then the in
1b610 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d 70 74  dex must be empt
1b620 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y. */.#ifdef SQL
1b630 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 6f  ITE_DEBUG.    fo
1b640 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d  r(iLvl=0; nBest=
1b650 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75  =0 && iLvl<pStru
1b660 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1b670 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
1b680 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  t( pStruct->aLev
1b690 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30  el[iLvl].nSeg==0
1b6a0 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
1b6b0 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73 74 3c  ..    if( nBest<
1b6c0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74  p->pConfig->nAut
1b6d0 6f 6d 65 72 67 65 20 0a 20 20 20 20 20 20 20 20  omerge .        
1b6e0 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
1b6f0 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65  el[iBestLvl].nMe
1b700 72 67 65 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b  rge==0 .      ){
1b710 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b720 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e 64 65    }.    fts5Inde
1b730 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
1b740 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c 76  pStruct, iBestLv
1b750 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 69  l, &nRem);.    i
1b760 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1b770 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e  _OK && pStruct->
1b780 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d  aLevel[iBestLvl]
1b790 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  .nMerge==0 ){.  
1b7a0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1b7b0 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73  ePromote(p, iBes
1b7c0 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29  tLvl+1, pStruct)
1b7d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1b7e0 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
1b7f0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f  t;.}../*.** A to
1b800 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61  tal of nLeaf lea
1b810 66 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20  f pages of data 
1b820 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c  has just been fl
1b830 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c  ushed to a level
1b840 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54  -0.** segment. T
1b850 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64  his function upd
1b860 61 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 63  ates the write-c
1b870 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67  ounter according
1b880 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65  ly and, if.** ne
1b890 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d  cessary, perform
1b8a0 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  s incremental me
1b8b0 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20  rge work..**.** 
1b8c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1b8d0 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
1b8e0 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
1b8f0 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
1b900 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
1b910 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1b920 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1b930 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1b940 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41 75 74  oid fts5IndexAut
1b950 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  omerge(.  Fts5In
1b960 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1b970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1b980 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1b990 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1b9a0 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
1b9b0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1b9c0 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
1b9d0 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
1b9e0 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20 20   int nLeaf      
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
1ba10 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73 74  tput leaves just
1ba20 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20   written */.){. 
1ba30 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1ba40 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f 6e  TE_OK && p->pCon
1ba50 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e  fig->nAutomerge>
1ba60 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  0 ){.    Fts5Str
1ba70 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
1ba80 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
1ba90 20 69 36 34 20 6e 57 72 69 74 65 3b 20 20 20 20   i64 nWrite;    
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bab0 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
1bac0 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  of write-counter
1bad0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72   */.    int nWor
1bae0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1baf0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1bb00 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74  of work-quanta t
1bb10 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20  o perform */.   
1bb20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20 20   int nRem;      
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bb40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
1bb50 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77   pages left to w
1bb60 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rite */..    /* 
1bb70 55 70 64 61 74 65 20 74 68 65 20 77 72 69 74 65  Update the write
1bb80 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65 20  -counter. While 
1bb90 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57  doing so, set nW
1bba0 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69  ork. */.    nWri
1bbb0 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  te = pStruct->nW
1bbc0 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20  riteCounter;.   
1bbd0 20 6e 57 6f 72 6b 20 3d 20 28 28 6e 57 72 69 74   nWork = ((nWrit
1bbe0 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e  e + nLeaf) / p->
1bbf0 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57  nWorkUnit) - (nW
1bc00 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55  rite / p->nWorkU
1bc10 6e 69 74 29 3b 0a 20 20 20 20 70 53 74 72 75 63  nit);.    pStruc
1bc20 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
1bc30 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e   += nLeaf;.    n
1bc40 52 65 6d 20 3d 20 70 2d 3e 6e 57 6f 72 6b 55 6e  Rem = p->nWorkUn
1bc50 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74  it * nWork * pSt
1bc60 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 0a 20  ruct->nLevel;.. 
1bc70 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1bc80 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e  e(p, ppStruct, n
1bc90 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Rem);.  }.}..sta
1bca0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
1bcb0 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a 20  exCrisismerge(. 
1bcc0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bce0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1bcf0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1bd00 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1bd10 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20  truct        /* 
1bd20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
1bd30 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
1bd40 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ex */.){.  const
1bd50 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20 70   int nCrisis = p
1bd60 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73  ->pConfig->nCris
1bd70 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35 53  isMerge;.  Fts5S
1bd80 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1bd90 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1bda0 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a   int iLvl = 0;..
1bdb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
1bdc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
1bdd0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
1bde0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
1bdf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1be00 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1be10 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69  iLvl].nSeg>=nCri
1be20 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35 49  sis ){.    fts5I
1be30 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
1be40 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c  , &pStruct, iLvl
1be50 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53 74  , 0);.    fts5St
1be60 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
1be70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  , iLvl+1, pStruc
1be80 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a  t);.    iLvl++;.
1be90 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
1bea0 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74  = pStruct;.}..st
1beb0 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
1bec0 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e 64  exReturn(Fts5Ind
1bed0 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ex *p){.  int rc
1bee0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72   = p->rc;.  p->r
1bef0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bf00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74   return rc;.}..t
1bf10 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
1bf20 73 35 46 6c 75 73 68 43 74 78 20 46 74 73 35 46  s5FlushCtx Fts5F
1bf30 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74 20  lushCtx;.struct 
1bf40 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a 20  Fts5FlushCtx {. 
1bf50 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78   Fts5Index *pIdx
1bf60 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  ;.  Fts5SegWrite
1bf70 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f  r writer; .};../
1bf80 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42 75 66  *.** Buffer aBuf
1bf90 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69  [] contains a li
1bfa0 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c 20 61  st of varints, a
1bfb0 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  ll small enough 
1bfc0 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33  to fit.** in a 3
1bfd0 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 52  2-bit integer. R
1bfe0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1bff0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72  f the largest pr
1c000 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a  efix of this .**
1c010 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74 65 73   list nMax bytes
1c020 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69 7a 65   or less in size
1c030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c040 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69  fts5PoslistPrefi
1c050 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75 66  x(const u8 *aBuf
1c060 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69  , int nMax){.  i
1c070 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20 64 75  nt ret;.  u32 du
1c080 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66 74 73  mmy;.  ret = fts
1c090 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 42 75  5GetVarint32(aBu
1c0a0 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 77 68 69  f, dummy);.  whi
1c0b0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e 74  le( 1 ){.    int
1c0c0 20 69 20 3d 20 66 74 73 35 47 65 74 56 61 72 69   i = fts5GetVari
1c0d0 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d 2c  nt32(&aBuf[ret],
1c0e0 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28   dummy);.    if(
1c0f0 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d 61   (ret + i) > nMa
1c100 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72  x ) break;.    r
1c110 65 74 20 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20 72  et += i;.  }.  r
1c120 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 64  eturn ret;.}..#d
1c130 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
1c140 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
1c150 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  Buf, pBlob, nBlo
1c160 62 29 20 7b 20 5c 0a 20 20 61 73 73 65 72 74 28  b) { \.  assert(
1c170 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28   pBuf->nSpace>=(
1c180 70 42 75 66 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29  pBuf->n+nBlob) )
1c190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  ;             \.
1c1a0 20 20 6d 65 6d 63 70 79 28 26 70 42 75 66 2d 3e    memcpy(&pBuf->
1c1b0 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 70 42 6c 6f  p[pBuf->n], pBlo
1c1c0 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20  b, nBlob);      
1c1d0 20 20 20 20 20 20 20 5c 0a 20 20 70 42 75 66 2d         \.  pBuf-
1c1e0 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20  >n += nBlob;    
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  \.}../*.** Flush
1c220 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1c230 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
1c240 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61  table iHash to a
1c250 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a   new level-0 .**
1c260 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b   segment on disk
1c270 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68  . Also update th
1c280 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1c290 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1c2a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1c2b0 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
1c2c0 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
1c2d0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
1c2e0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
1c2f0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1c300 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1c310 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1c320 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1c330 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73  FlushOneHash(Fts
1c340 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
1c350 73 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  s5Hash *pHash = 
1c360 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73 35  p->pHash;.  Fts5
1c370 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1c380 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  ct;.  int iSegid
1c390 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  ;.  int pgnoLast
1c3a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c3b0 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65        /* Last le
1c3c0 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  af page number i
1c3d0 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20  n segment */..  
1c3e0 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65  /* Obtain a refe
1c3f0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64  rence to the ind
1c400 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ex structure and
1c410 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
1c420 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20  segment-id.  ** 
1c430 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65  for the new leve
1c440 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f  l-0 segment.  */
1c450 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
1c460 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
1c470 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74  );.  iSegid = ft
1c480 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
1c490 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  p, pStruct);..  
1c4a0 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20  if( iSegid ){.  
1c4b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a    const int pgsz
1c4c0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
1c4d0 67 73 7a 3b 0a 0a 20 20 20 20 46 74 73 35 53 74  gsz;..    Fts5St
1c4e0 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1c4f0 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73  pSeg;   /* New s
1c500 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53  egment within pS
1c510 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  truct */.    int
1c520 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20   nHeight;       
1c530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65             /* He
1c540 69 67 68 74 20 6f 66 20 6e 65 77 20 73 65 67 6d  ight of new segm
1c550 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  ent b-tree */.  
1c560 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1c570 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
1c580 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69  /* Buffer in whi
1c590 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c  ch to assemble l
1c5a0 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
1c5b0 63 6f 6e 73 74 20 75 38 20 2a 7a 50 72 65 76 20  const u8 *zPrev 
1c5c0 3d 20 30 3b 0a 0a 20 20 20 20 46 74 73 35 53 65  = 0;..    Fts5Se
1c5d0 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  gWriter writer;.
1c5e0 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
1c5f0 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53  t(p, &writer, iS
1c600 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 50  egid);..    /* P
1c610 72 65 2d 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  re-allocate the 
1c620 62 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 61  buffer used to a
1c630 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67  ssemble leaf pag
1c640 65 73 20 74 6f 20 74 68 65 20 74 61 72 67 65 74  es to the target
1c650 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 73 69 7a  .    ** page siz
1c660 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
1c670 74 28 20 70 67 73 7a 3e 30 20 29 3b 0a 20 20 20  t( pgsz>0 );.   
1c680 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e   pBuf = &writer.
1c690 61 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a  aWriter[0].buf;.
1c6a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1c6b0 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ow(&p->rc, pBuf,
1c6c0 20 70 67 73 7a 20 2b 20 32 30 29 3b 0a 0a 20 20   pgsz + 20);..  
1c6d0 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e    /* Begin scann
1c6e0 69 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68  ing through hash
1c6f0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20   table entries. 
1c700 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  This loop runs o
1c710 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20  nce for each.   
1c720 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74   ** term/doclist
1c730 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1c740 64 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73  d within the has
1c750 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
1c760 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1c770 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
1c780 6d 73 65 74 28 70 42 75 66 2d 3e 70 2c 20 30 2c  mset(pBuf->p, 0,
1c790 20 34 29 3b 0a 20 20 20 20 20 20 70 42 75 66 2d   4);.      pBuf-
1c7a0 3e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 70 2d  >n = 4;.      p-
1c7b0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
1c7c0 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48  5HashScanInit(pH
1c7d0 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ash, 0, 0);.    
1c7e0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  }.    while( p->
1c7f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c800 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48   0==sqlite3Fts5H
1c810 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68  ashScanEof(pHash
1c820 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
1c830 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20   char *zTerm;   
1c840 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1c850 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d   containing term
1c860 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   */.      int nT
1c870 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
1c880 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c890 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
1c8a0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1c8b0 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20  8 *pDoclist;    
1c8c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c8d0 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  to doclist for t
1c8e0 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
1c8f0 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20    int nDoclist; 
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c910 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
1c920 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1c930 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20     int nSuffix; 
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c950 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73  * Size of term s
1c960 75 66 66 69 78 20 2a 2f 0a 0a 20 20 20 20 20 20  uffix */..      
1c970 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
1c980 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20  canEntry(pHash, 
1c990 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73  &zTerm, &pDoclis
1c9a0 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  t, &nDoclist);. 
1c9b0 20 20 20 20 20 6e 54 65 72 6d 20 3d 20 73 74 72       nTerm = str
1c9c0 6c 65 6e 28 7a 54 65 72 6d 29 3b 0a 0a 20 20 20  len(zTerm);..   
1c9d0 20 20 20 2f 2a 20 44 65 63 69 64 65 20 69 66 20     /* Decide if 
1c9e0 74 68 65 20 74 65 72 6d 20 77 69 6c 6c 20 66 69  the term will fi
1c9f0 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
1ca00 20 6c 65 61 66 2e 20 49 66 20 69 74 20 77 69 6c   leaf. If it wil
1ca10 6c 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 2a 2a  l not, .      **
1ca20 20 66 6c 75 73 68 20 74 68 65 20 6c 65 61 66 20   flush the leaf 
1ca30 74 6f 20 64 69 73 6b 20 68 65 72 65 2e 20 20 2a  to disk here.  *
1ca40 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 75  /.      if( (pBu
1ca50 66 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32  f->n + nTerm + 2
1ca60 29 20 3e 20 70 67 73 7a 20 29 7b 0a 20 20 20 20  ) > pgsz ){.    
1ca70 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1ca80 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65  shLeaf(p, &write
1ca90 72 29 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66  r);.        pBuf
1caa0 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72 69 74   = &writer.aWrit
1cab0 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20  er[0].buf;.     
1cac0 20 20 20 69 66 28 20 28 6e 54 65 72 6d 20 2b 20     if( (nTerm + 
1cad0 33 32 29 20 3e 20 70 42 75 66 2d 3e 6e 53 70 61  32) > pBuf->nSpa
1cae0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
1caf0 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
1cb00 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 6e 54 65  p->rc, pBuf, nTe
1cb10 72 6d 20 2b 20 33 32 20 2d 20 70 42 75 66 2d 3e  rm + 32 - pBuf->
1cb20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n);.          if
1cb30 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
1cb40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cb50 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69   }..      /* Wri
1cb60 74 65 20 74 68 65 20 74 65 72 6d 20 74 6f 20 74  te the term to t
1cb70 68 65 20 6c 65 61 66 2e 20 41 6e 64 20 69 66 20  he leaf. And if 
1cb80 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
1cb90 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 61 6e 64  on the leaf, and
1cba0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
1cbb0 61 66 20 69 73 20 6e 6f 74 20 70 61 67 65 20 6e  af is not page n
1cbc0 75 6d 62 65 72 20 31 2c 20 70 75 73 68 20 69 74  umber 1, push it
1cbd0 20 75 70 20 69 6e 74 6f 20 74 68 65 20 62 2d 74   up into the b-t
1cbe0 72 65 65 20 68 69 65 72 61 72 63 68 79 20 0a 20  ree hierarchy . 
1cbf0 20 20 20 20 20 2a 2a 20 61 73 20 77 65 6c 6c 2e       ** as well.
1cc00 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 77    */.      if( w
1cc10 72 69 74 65 72 2e 62 46 69 72 73 74 54 65 72 6d  riter.bFirstTerm
1cc20 49 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  InPage==0 ){.   
1cc30 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20 3d 20       int nPre = 
1cc40 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
1cc50 73 73 28 6e 54 65 72 6d 2c 20 7a 50 72 65 76 2c  ss(nTerm, zPrev,
1cc60 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75   nTerm, (const u
1cc70 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
1cc80 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
1cc90 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
1cca0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
1ccb0 2d 3e 6e 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20  ->n], nPre);.   
1ccc0 20 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e       nSuffix = n
1ccd0 54 65 72 6d 20 2d 20 6e 50 72 65 3b 0a 20 20 20  Term - nPre;.   
1cce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ccf0 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42    fts5PutU16(&pB
1cd00 75 66 2d 3e 70 5b 32 5d 2c 20 70 42 75 66 2d 3e  uf->p[2], pBuf->
1cd10 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74  n);.        writ
1cd20 65 72 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  er.bFirstTermInP
1cd30 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
1cd40 20 69 66 28 20 77 72 69 74 65 72 2e 61 57 72 69   if( writer.aWri
1cd50 74 65 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29  ter[0].pgno!=1 )
1cd60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1cd70 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65 66 69  nPre = fts5Prefi
1cd80 78 43 6f 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c  xCompress(nTerm,
1cd90 20 7a 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28   zPrev, nTerm, (
1cda0 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29  const u8*)zTerm)
1cdb0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1cdc0 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 70  WriteBtreeTerm(p
1cdd0 2c 20 26 77 72 69 74 65 72 2c 20 6e 50 72 65 2b  , &writer, nPre+
1cde0 31 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54  1, (const u8*)zT
1cdf0 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  erm);.          
1ce00 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61  pBuf = &writer.a
1ce10 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20  Writer[0].buf;. 
1ce20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ce30 20 6e 50 72 65 3c 6e 54 65 72 6d 20 29 3b 0a 20   nPre<nTerm );. 
1ce40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ce50 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
1ce60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ce70 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1ce80 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
1ce90 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
1cea0 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20  ], nSuffix);.   
1ceb0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
1cec0 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
1ced0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 7a 54  , (const u8*)&zT
1cee0 65 72 6d 5b 6e 54 65 72 6d 2d 6e 53 75 66 66 69  erm[nTerm-nSuffi
1cef0 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 0a 20  x], nSuffix);.. 
1cf00 20 20 20 20 20 2f 2a 20 57 65 20 6a 75 73 74 20       /* We just 
1cf10 77 72 6f 74 65 20 61 20 74 65 72 6d 20 69 6e 74  wrote a term int
1cf20 6f 20 70 61 67 65 20 77 72 69 74 65 72 2e 61 57  o page writer.aW
1cf30 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 2e 20 49  riter[0].pgno. I
1cf40 66 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 64 6f  f a .      ** do
1cf50 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 74  clist-index is t
1cf60 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
1cf70 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2c  or this doclist,
1cf80 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20   it will be.    
1cf90 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20    ** associated 
1cfa0 77 69 74 68 20 74 68 69 73 20 70 61 67 65 2e 20  with this page. 
1cfb0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1cfc0 20 77 72 69 74 65 72 2e 6e 44 6c 69 64 78 3e 30   writer.nDlidx>0
1cfd0 20 26 26 20 77 72 69 74 65 72 2e 61 44 6c 69 64   && writer.aDlid
1cfe0 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b  x[0].buf.n==0 );
1cff0 0a 20 20 20 20 20 20 77 72 69 74 65 72 2e 61 44  .      writer.aD
1d000 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 77  lidx[0].pgno = w
1d010 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d  riter.aWriter[0]
1d020 2e 70 67 6e 6f 3b 0a 0a 20 20 20 20 20 20 69 66  .pgno;..      if
1d030 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e  ( pgsz>=(pBuf->n
1d040 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29   + nDoclist + 1)
1d050 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1d060 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
1d070 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
1d080 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
1d090 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
1d0a0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1d0b0 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69  lob(pBuf, pDocli
1d0c0 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
1d0d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d0e0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
1d0f0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
1d100 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20  iDelta = 0;.    
1d110 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30      int iOff = 0
1d120 3b 0a 0a 20 20 20 20 20 20 20 20 77 72 69 74 65  ;..        write
1d130 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
1d140 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  age = 0;..      
1d150 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
1d160 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74  doclist will not
1d170 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61   fit on this lea
1d180 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  f. The following
1d190 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f   .        ** loo
1d1a0 70 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  p iterates throu
1d1b0 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20  gh the poslists 
1d1c0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
1d1d0 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20   current .      
1d1e0 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a    ** doclist.  *
1d1f0 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
1d200 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d210 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69  K && iOff<nDocli
1d220 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1d230 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
1d240 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20      int nCopy;. 
1d250 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75           int bDu
1d260 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mmy;.          i
1d270 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
1d280 72 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69  rint(&pDoclist[i
1d290 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
1d2a0 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
1d2b0 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50  nCopy = fts5GetP
1d2c0 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63  oslistSize(&pDoc
1d2d0 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  list[iOff], &nPo
1d2e0 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
1d2f0 20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20         nCopy += 
1d300 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nPos;.          
1d310 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
1d320 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  ;.          .   
1d330 20 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65         if( write
1d340 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
1d350 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
1d360 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70     fts5PutU16(&p
1d370 42 75 66 2d 3e 70 5b 30 5d 2c 20 70 42 75 66 2d  Buf->p[0], pBuf-
1d380 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73 74 20  >n);   /* first 
1d390 64 6f 63 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f  docid on page */
1d3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75  .            pBu
1d3b0 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  f->n += sqlite3F
1d3c0 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts5PutVarint(&pB
1d3d0 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
1d3e0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1d3f0 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72       writer.bFir
1d400 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
1d410 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  0;.            f
1d420 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
1d430 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  end(p, &writer, 
1d440 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1d450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d460 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
1d470 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
1d480 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
1d490 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29  Buf->n], iDelta)
1d4a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d4b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d4c0 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e  pBuf->n<=pBuf->n
1d4d0 53 70 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20  Space );..      
1d4e0 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
1d4f0 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73   + nCopy) <= pgs
1d500 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
1d510 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
1d520 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oslist will fit 
1d530 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
1d540 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20  eaf. So copy.   
1d550 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69           ** it i
1d560 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20  n one go. */.   
1d570 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1d580 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1d590 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c 69 73  b(pBuf, &pDoclis
1d5a0 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b  t[iOff], nCopy);
1d5b0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1d5c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1d5d0 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c   The entire posl
1d5e0 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  ist will not fit
1d5f0 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53   on this leaf. S
1d600 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20  o it needs.     
1d610 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
1d620 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74  broken into sect
1d630 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71  ions. The only q
1d640 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69  ualification bei
1d650 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ng.            *
1d660 2a 20 74 68 61 74 20 65 61 63 68 20 76 61 72 69  * that each vari
1d670 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65  nt must be store
1d680 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20  d contiguously. 
1d690 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1d6a0 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69  const u8 *pPosli
1d6b0 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69  st = &pDoclist[i
1d6c0 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Off];.          
1d6d0 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a    int iPos = 0;.
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
1d6f0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1d700 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d710 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20       int nSpace 
1d720 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e  = pgsz - pBuf->n
1d730 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d740 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
1d750 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 43           if( (nC
1d760 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70  opy - iPos)<=nSp
1d770 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ace ){.         
1d780 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79         n = nCopy
1d790 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20   - iPos;.       
1d7a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
1d7c0 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65  = fts5PoslistPre
1d7d0 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50  fix(&pPoslist[iP
1d7e0 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20  os], nSpace);.  
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d800 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1d810 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20  rt( n>0 );.     
1d820 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1d830 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1d840 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73  b(pBuf, &pPoslis
1d850 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20  t[iPos], n);.   
1d860 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20             iPos 
1d870 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  += n;.          
1d880 20 20 20 20 69 66 28 20 70 42 75 66 2d 3e 6e 3e      if( pBuf->n>
1d890 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
1d8a0 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
1d8b0 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26  teFlushLeaf(p, &
1d8c0 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20  writer);.       
1d8d0 20 20 20 20 20 20 20 20 20 70 42 75 66 20 3d 20           pBuf = 
1d8e0 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b  &writer.aWriter[
1d8f0 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20  0].buf;.        
1d900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d910 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d        if( iPos>=
1d920 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20  nCopy ) break;. 
1d930 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1d940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d950 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79     iOff += nCopy
1d960 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d970 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 66 2d    }..      pBuf-
1d980 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20  >p[pBuf->n++] = 
1d990 27 5c 30 27 3b 0a 20 20 20 20 20 20 61 73 73 65  '\0';.      asse
1d9a0 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
1d9b0 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20  f->nSpace );.   
1d9c0 20 20 20 7a 50 72 65 76 20 3d 20 28 63 6f 6e 73     zPrev = (cons
1d9d0 74 20 75 38 2a 29 7a 54 65 72 6d 3b 0a 20 20 20  t u8*)zTerm;.   
1d9e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
1d9f0 73 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68  shScanNext(pHash
1da00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1da10 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
1da20 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74  r(pHash);.    ft
1da30 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
1da40 20 26 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67   &writer, &nHeig
1da50 68 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a  ht, &pgnoLast);.
1da60 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
1da70 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1da80 2e 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20  . It is written 
1da90 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
1daa0 62 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20  base by the.    
1dab0 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65  ** fts5Structure
1dac0 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62  Release() call b
1dad0 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66  elow.  */.    if
1dae0 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
1daf0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  l==0 ){.      ft
1db00 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
1db10 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74  vel(&p->rc, &pSt
1db20 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ruct);.    }.   
1db30 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
1db40 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
1db50 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c  , pStruct, 0, 1,
1db60 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
1db70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1db80 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70  .      pSeg = &p
1db90 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
1dba0 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d  ].aSeg[ pStruct-
1dbb0 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b  >aLevel[0].nSeg+
1dbc0 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  + ];.      pSeg-
1dbd0 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1dbe0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 6e 48  ;.      pSeg->nH
1dbf0 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b  eight = nHeight;
1dc00 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
1dc10 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
1dc20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74    pSeg->pgnoLast
1dc30 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
1dc40 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1dc50 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ment++;.    }.  
1dc60 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
1dc70 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74  romote(p, 0, pSt
1dc80 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 0a 20 20 66  ruct);.  }...  f
1dc90 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67  ts5IndexAutomerg
1dca0 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70  e(p, &pStruct, p
1dcb0 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35  gnoLast);.  fts5
1dcc0 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65  IndexCrisismerge
1dcd0 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20  (p, &pStruct);. 
1dce0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1dcf0 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b  ite(p, pStruct);
1dd00 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
1dd10 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
1dd20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
1dd30 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
1dd40 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1dd50 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f  y hash tables to
1dd60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1dd70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1dd80 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73  s5IndexFlush(Fts
1dd90 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a  5Index *p){.  /*
1dda0 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d   Unless it is em
1ddb0 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68  pty, flush the h
1ddc0 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
1ddd0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50  k */.  if( p->nP
1dde0 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20  endingData ){.  
1ddf0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
1de00 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  sh );.    p->nPe
1de10 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
1de20 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48     fts5FlushOneH
1de30 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ash(p);.  }.}...
1de40 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1de50 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73  ndexOptimize(Fts
1de60 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
1de70 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1de80 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
1de90 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
1dea0 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b  .  int nSeg = 0;
1deb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1dec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1ded0 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
1dee0 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  (p);.  pStruct =
1def0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1df00 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53  ad(p);..  if( pS
1df10 74 72 75 63 74 20 29 7b 0a 20 20 20 20 61 73 73  truct ){.    ass
1df20 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53  ert( pStruct->nS
1df30 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75  egment==fts5Stru
1df40 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
1df50 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20  ts(pStruct) );. 
1df60 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63     nSeg = pStruc
1df70 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20  t->nSegment;.   
1df80 20 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20   if( nSeg>1 ){. 
1df90 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
1dfa0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1dfb0 63 74 75 72 65 29 3b 0a 20 20 20 20 20 20 6e 42  cture);.      nB
1dfc0 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d  yte += (pStruct-
1dfd0 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a  >nLevel+1) * siz
1dfe0 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1dff0 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 70  eLevel);.      p
1e000 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63  New = (Fts5Struc
1e010 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73  ture*)sqlite3Fts
1e020 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1e030 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1e040 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77  }.  }.  if( pNew
1e050 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
1e060 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1e070 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ;.    int nByte 
1e080 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28  = nSeg * sizeof(
1e090 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1e0a0 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ment);.    pNew-
1e0b0 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63  >nLevel = pStruc
1e0c0 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20  t->nLevel+1;.   
1e0d0 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75   pNew->nWriteCou
1e0e0 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d 3e  nter = pStruct->
1e0f0 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
1e100 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d     pLvl = &pNew-
1e110 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d  >aLevel[pStruct-
1e120 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70 4c  >nLevel];.    pL
1e130 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  vl->aSeg = (Fts5
1e140 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
1e150 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
1e160 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20  locZero(&p->rc, 
1e170 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
1e180 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20 20  pLvl->aSeg ){.  
1e190 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
1e1a0 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  eg;.      int iS
1e1b0 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20  egOut = 0;.     
1e1c0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1e1d0 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1e1e0 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1e1f0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
1e200 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
1e210 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
1e220 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
1e230 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69      pLvl->aSeg[i
1e240 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63  SegOut] = pStruc
1e250 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1e260 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
1e270 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b        iSegOut++;
1e280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e290 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
1e2a0 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e  Segment = pLvl->
1e2b0 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20  nSeg = nSeg;.   
1e2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1e2d0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1e2e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30  ;.      pNew = 0
1e2f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1e300 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 69  f( pNew ){.    i
1e310 6e 74 20 69 4c 76 6c 20 3d 20 70 4e 65 77 2d 3e  nt iLvl = pNew->
1e320 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20 20 20 77 68  nLevel-1;.    wh
1e330 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1e340 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61  TE_OK && pNew->a
1e350 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1e360 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
1e370 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f  nRem = FTS5_OPT_
1e380 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20  WORK_UNIT;.     
1e390 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
1e3a0 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69  evel(p, &pNew, i
1e3b0 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
1e3c0 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75   }..    fts5Stru
1e3d0 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e  ctureWrite(p, pN
1e3e0 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72  ew);.    fts5Str
1e3f0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e  uctureRelease(pN
1e400 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ew);.  }..  fts5
1e410 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
1e420 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  (pStruct);.  ret
1e430 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
1e440 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e 74 20  urn(p); .}..int 
1e450 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
1e460 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65 78 20  Merge(Fts5Index 
1e470 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b  *p, int nMerge){
1e480 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1e490 20 2a 70 53 74 72 75 63 74 3b 0a 0a 20 20 70 53   *pStruct;..  pS
1e4a0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
1e4b0 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
1e4c0 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20 70  if( pStruct && p
1e4d0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29  Struct->nLevel )
1e4e0 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d  {.    fts5IndexM
1e4f0 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
1e500 2c 20 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 66  , nMerge);.    f
1e510 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
1e520 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  e(p, pStruct);. 
1e530 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74 75   }.  fts5Structu
1e540 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
1e550 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66 74  t);..  return ft
1e560 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
1e570 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1e580 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c   fts5PoslistCall
1e590 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
1e5a0 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70  x *p, .  void *p
1e5b0 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  Ctx, .  const u8
1e5c0 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
1e5d0 68 75 6e 6b 0a 29 7b 0a 20 20 66 74 73 35 42 75  hunk.){.  fts5Bu
1e5e0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1e5f0 70 2d 3e 72 63 2c 20 28 46 74 73 35 42 75 66 66  p->rc, (Fts5Buff
1e600 65 72 2a 29 70 43 74 78 2c 20 6e 43 68 75 6e 6b  er*)pCtx, nChunk
1e610 2c 20 70 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a  , pChunk);.}../*
1e620 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
1e630 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
1e640 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65  nts to a valid e
1e650 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20  ntry (not EOF). 
1e660 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
1e670 20 61 70 70 65 6e 64 73 20 74 68 65 20 70 6f 73   appends the pos
1e680 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20  ition list data 
1e690 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1e6a0 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66  entry to.** buff
1e6b0 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f 65 73  er pBuf. It does
1e6c0 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f 70 79   not make a copy
1e6d0 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
1e6e0 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69  -list size.** fi
1e6f0 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
1e700 6f 69 64 20 66 74 73 35 53 65 67 69 74 65 72 50  oid fts5SegiterP
1e710 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e  oslist(.  Fts5In
1e720 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65  dex *p,.  Fts5Se
1e730 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20 20 46  gIter *pSeg,.  F
1e740 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
1e750 29 7b 0a 20 20 66 74 73 35 43 68 75 6e 6b 49 74  ){.  fts5ChunkIt
1e760 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28  erate(p, pSeg, (
1e770 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74 73 35  void*)pBuf, fts5
1e780 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 29  PoslistCallback)
1e790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  ;.}../*.** Itera
1e7a0 74 6f 72 20 70 4d 75 6c 74 69 20 63 75 72 72 65  tor pMulti curre
1e7b0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
1e7c0 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f   valid entry (no
1e7d0 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20  t EOF). This.** 
1e7e0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
1e7f0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
1e800 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 6f 66 20  osition-list of 
1e810 74 68 65 20 65 6e 74 72 79 20 70 4d 75 6c 74 69  the entry pMulti
1e820 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70   .** currently p
1e830 6f 69 6e 74 73 20 74 6f 20 74 6f 20 62 75 66 66  oints to to buff
1e840 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49  er pBuf..**.** I
1e850 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1e860 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1e870 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72   is left in p->r
1e880 63 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  c. It is assumed
1e890 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 68 61 73  .** no error has
1e8a0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1e8b0 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
1e8c0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1e8d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1e8e0 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c  ts5MultiIterPosl
1e8f0 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
1e900 20 2a 70 2c 0a 20 20 46 74 73 35 4d 75 6c 74 69   *p,.  Fts5Multi
1e910 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c  SegIter *pMulti,
1e920 0a 20 20 69 6e 74 20 62 53 7a 2c 20 20 20 20 20  .  int bSz,     
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 20 73     /* Append a s
1e950 69 7a 65 20 66 69 65 6c 64 20 62 65 66 6f 72 65  ize field before
1e960 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 46   the data */.  F
1e970 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
1e980 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
1e990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e9a0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1e9b0 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53  eg = &pMulti->aS
1e9c0 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72  eg[ pMulti->aFir
1e9d0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
1e9e0 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
1e9f0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
1ea00 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a 0a 20  pMulti)==0 );.. 
1ea10 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20     if( bSz ){.  
1ea20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
1ea30 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20  ISTSIZE */.     
1ea40 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ea50 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1ea60 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  pBuf, pSeg->nPos
1ea70 2a 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  *2);.    }.    f
1ea80 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
1ea90 74 28 70 2c 20 70 53 65 67 2c 20 70 42 75 66 29  t(p, pSeg, pBuf)
1eaa0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1eab0 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74  void fts5Doclist
1eac0 49 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63  IterNext(Fts5Doc
1ead0 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 29  listIter *pIter)
1eae0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  {.  if( pIter->i
1eaf0 3c 70 49 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20  <pIter->n ){.   
1eb00 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
1eb10 20 69 66 28 20 70 49 74 65 72 2d 3e 69 20 29 7b   if( pIter->i ){
1eb20 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74  .      i64 iDelt
1eb30 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  a;.      pIter->
1eb40 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
1eb50 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74  nt(&pIter->a[pIt
1eb60 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 69  er->i], (u64*)&i
1eb70 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49  Delta);.      pI
1eb80 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
1eb90 44 65 6c 74 61 3b 0a 20 20 20 20 7d 65 6c 73 65  Delta;.    }else
1eba0 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
1ebb0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
1ebc0 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  t(&pIter->a[pIte
1ebd0 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70 49  r->i], (u64*)&pI
1ebe0 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
1ebf0 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
1ec00 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
1ec10 73 74 53 69 7a 65 28 0a 20 20 20 20 20 20 20 20  stSize(.        
1ec20 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d  &pIter->a[pIter-
1ec30 3e 69 5d 2c 20 26 70 49 74 65 72 2d 3e 6e 50 6f  >i], &pIter->nPo
1ec40 73 6c 69 73 74 2c 20 26 62 44 75 6d 6d 79 0a 20  slist, &bDummy. 
1ec50 20 20 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d     );.    pIter-
1ec60 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26 70 49 74  >aPoslist = &pIt
1ec70 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 3b  er->a[pIter->i];
1ec80 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d  .    pIter->i +=
1ec90 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
1eca0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1ecb0 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
1ecc0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   0;.  }.}..stati
1ecd0 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
1ece0 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  stIterInit(.  Ft
1ecf0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
1ed00 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  .  Fts5DoclistIt
1ed10 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d  er *pIter.){.  m
1ed20 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
1ed30 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
1ed40 0a 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 70 42  .  pIter->a = pB
1ed50 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e  uf->p;.  pIter->
1ed60 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 66  n = pBuf->n;.  f
1ed70 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
1ed80 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  xt(pIter);.}../*
1ed90 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63  .** Append a doc
1eda0 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70  list to buffer p
1edb0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Buf..*/.static v
1edc0 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70  oid fts5MergeApp
1edd0 65 6e 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20  endDocid(.  int 
1ede0 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1ee00 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
1ee10 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
1ee20 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
1ee30 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1ee40 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1ee50 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77    i64 *piLastRow
1ee60 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
1ee70 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65    /* IN/OUT: Pre
1ee80 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74  vious rowid writ
1ee90 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ten (if any) */.
1eea0 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20    i64 iRowid    
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eec0 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70    /* Rowid to ap
1eed0 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  pend */.){.  if(
1eee0 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pBuf->n==0 ){. 
1eef0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1ef00 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70  endVarint(pRc, p
1ef10 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Buf, iRowid);.  
1ef20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42  }else{.    fts5B
1ef30 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1ef40 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f  t(pRc, pBuf, iRo
1ef50 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77  wid - *piLastRow
1ef60 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61  id);.  }.  *piLa
1ef70 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
1ef80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  ;.}../*.** Buffe
1ef90 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e  rs p1 and p2 con
1efa0 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54  tain doclists. T
1efb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72  his function mer
1efc0 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ges the content.
1efd0 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f  ** of the two do
1efe0 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20  clists together 
1eff0 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20  and sets buffer 
1f000 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  p1 to the result
1f010 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
1f020 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1f030 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1f040 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1f050 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20   left in p->rc. 
1f060 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a  If an error has.
1f070 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
1f080 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
1f090 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1f0a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1f0b0 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
1f0c0 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ts(.  Fts5Index 
1f0d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1f0e0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1f0f0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1f100 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31    Fts5Buffer *p1
1f110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f120 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20    /* First list 
1f130 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74  to merge */.  Ft
1f140 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20  s5Buffer *p2    
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f160 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20   Second list to 
1f170 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  merge */.){.  if
1f180 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  ( p2->n ){.    i
1f190 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20  64 iLastRowid = 
1f1a0 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69  0;.    Fts5Docli
1f1b0 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46  stIter i1;.    F
1f1c0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69  ts5DoclistIter i
1f1d0 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  2;.    Fts5Buffe
1f1e0 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73 35 42  r out;.    Fts5B
1f1f0 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d  uffer tmp;.    m
1f200 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73  emset(&out, 0, s
1f210 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20  izeof(out));.   
1f220 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c   memset(&tmp, 0,
1f230 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a   sizeof(tmp));..
1f240 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
1f250 74 65 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29  terInit(p1, &i1)
1f260 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ;.    fts5Doclis
1f270 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69  tIterInit(p2, &i
1f280 32 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  2);.    while( p
1f290 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1f2a0 26 26 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 21  && (i1.aPoslist!
1f2b0 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73  =0 || i2.aPoslis
1f2c0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69  t!=0) ){.      i
1f2d0 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i2.aPoslist==
1f2e0 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73  0 || (i1.aPoslis
1f2f0 74 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69  t && i1.iRowid<i
1f300 32 2e 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  2.iRowid) ){.   
1f310 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74       /* Copy ent
1f320 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20  ry from i1 */.  
1f330 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
1f340 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72  ppendDocid(&p->r
1f350 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52  c, &out, &iLastR
1f360 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29  owid, i1.iRowid)
1f370 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ;.        /* WRI
1f380 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
1f390 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f3a0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1f3b0 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31  &p->rc, &out, i1
1f3c0 2e 6e 50 6f 73 6c 69 73 74 20 2a 20 32 29 3b 0a  .nPoslist * 2);.
1f3d0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f3e0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1f3f0 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50  >rc, &out, i1.nP
1f400 6f 73 6c 69 73 74 2c 20 69 31 2e 61 50 6f 73 6c  oslist, i1.aPosl
1f410 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ist);.        ft
1f420 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1f430 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i1);.      }.
1f440 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69        else if( i
1f450 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c  1.aPoslist==0 ||
1f460 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69   i2.iRowid!=i1.i
1f470 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
1f480 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
1f490 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20  rom i2 */.      
1f4a0 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
1f4b0 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 26  dDocid(&p->rc, &
1f4c0 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64  out, &iLastRowid
1f4d0 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
1f4e0 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
1f4f0 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
1f500 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f510 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1f520 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f  rc, &out, i2.nPo
1f530 73 6c 69 73 74 20 2a 20 32 29 3b 0a 20 20 20 20  slist * 2);.    
1f540 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f550 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1f560 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69   &out, i2.nPosli
1f570 73 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 29  st, i2.aPoslist)
1f580 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
1f590 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
1f5a0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
1f5b0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
1f5c0 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1f5d0 72 20 72 31 3b 0a 20 20 20 20 20 20 20 20 46 74  r r1;.        Ft
1f5e0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
1f5f0 72 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  r2;.        Fts5
1f600 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
1f610 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 6d  iter;..        m
1f620 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1f630 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29  , sizeof(writer)
1f640 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d  );..        /* M
1f650 65 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73  erge the two pos
1f660 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20  ition lists. */ 
1f670 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
1f680 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70  geAppendDocid(&p
1f690 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61  ->rc, &out, &iLa
1f6a0 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
1f6b0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
1f6c0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70  5BufferZero(&tmp
1f6d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f6e0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
1f6f0 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e 61  derInit(-1, i1.a
1f700 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
1f710 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20 20  list, &r1);.    
1f720 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
1f730 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
1f740 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74  (-1, i2.aPoslist
1f750 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i2.nPoslist, &
1f760 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  r2);.        whi
1f770 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
1f780 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f 66  E_OK && (r1.bEof
1f790 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d 3d  ==0 || r2.bEof==
1f7a0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
1f7b0 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  i64 iNew;.      
1f7c0 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66 20      if( r2.bEof 
1f7d0 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 26  || (r1.bEof==0 &
1f7e0 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50 6f  & r1.iPos<r2.iPo
1f7f0 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
1f800 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f 73    iNew = r1.iPos
1f810 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1f820 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
1f830 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b  ReaderNext(&r1);
1f840 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f850 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e  {.            iN
1f860 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20 20  ew = r2.iPos;.  
1f870 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f880 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
1f890 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20 20  erNext(&r2);.   
1f8a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 2e           if( r1.
1f8b0 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29 20  iPos==r2.iPos ) 
1f8c0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1f8d0 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31  stReaderNext(&r1
1f8e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1f8f0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1f900 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1f910 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28  istWriterAppend(
1f920 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20 69  &tmp, &writer, i
1f930 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  New);.        }.
1f940 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54  .        /* WRIT
1f950 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
1f960 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f970 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1f980 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70  p->rc, &out, tmp
1f990 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20  .n * 2);.       
1f9a0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1f9b0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f  dBlob(&p->rc, &o
1f9c0 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70  ut, tmp.n, tmp.p
1f9d0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1f9e0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
1f9f0 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  i1);.        fts
1fa00 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
1fa10 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (&i2);.      }. 
1fa20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
1fa30 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1fa40 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70  p1, out.n, out.p
1fa50 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
1fa60 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20  rFree(&tmp);.   
1fa70 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1fa80 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  &out);.  }.}..st
1fa90 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 75  atic void fts5Bu
1faa0 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75 66  fferSwap(Fts5Buf
1fab0 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66  fer *p1, Fts5Buf
1fac0 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35  fer *p2){.  Fts5
1fad0 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31  Buffer tmp = *p1
1fae0 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20  ;.  *p1 = *p2;. 
1faf0 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73   *p2 = tmp;.}..s
1fb00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
1fb10 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28 0a  etupPrefixIter(.
1fb20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65    /* Index to re
1fb50 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
1fb60 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20   bDesc,         
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fb80 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20  True for "ORDER 
1fb90 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a  BY rowid DESC" *
1fba0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
1fbb0 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
1fbc0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
1fbd0 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20  ntaining prefix 
1fbe0 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e  to match */.  in
1fbf0 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20  t nToken,       
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fc10 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
1fc20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20  pToken in bytes 
1fc30 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
1fc40 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
1fc50 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
1fc60 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
1fc70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
1fc80 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46  re *pStruct;.  F
1fc90 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b  ts5Buffer *aBuf;
1fca0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
1fcb0 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66 20  f = 32;..  aBuf 
1fcc0 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29 66  = (Fts5Buffer*)f
1fcd0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
1fce0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1fcf0 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72  r)*nBuf);.  pStr
1fd00 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1fd10 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69  ureRead(p);..  i
1fd20 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72 75  f( aBuf && pStru
1fd30 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ct ){.    const 
1fd40 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
1fd50 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
1fd60 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1fd70 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
1fd80 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 4d 75 6c  = 0;.    Fts5Mul
1fd90 74 69 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  tiSegIter *p1 = 
1fda0 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74  0;     /* Iterat
1fdb0 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65  or used to gathe
1fdc0 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65  r data from inde
1fdd0 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74  x */.    Fts5Dat
1fde0 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74  a *pData;.    Ft
1fdf0 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74  s5Buffer doclist
1fe00 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ;..    memset(&d
1fe10 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f  oclist, 0, sizeo
1fe20 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20  f(doclist));.   
1fe30 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
1fe40 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
1fe50 2c 20 31 2c 20 66 6c 61 67 73 2c 20 70 54 6f 6b  , 1, flags, pTok
1fe60 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20  en, nToken, -1, 
1fe70 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20 20  0, &p1);.       
1fe80 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1fe90 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20  f(p, p1)==0;.   
1fea0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1feb0 65 72 4e 65 78 74 28 70 2c 20 70 31 2c 20 30 2c  erNext(p, p1, 0,
1fec0 20 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   0).    ){.     
1fed0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
1fee0 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
1fef0 28 70 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (p1);.      int 
1ff00 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e  nTerm;.      con
1ff10 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66  st u8 *pTerm = f
1ff20 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
1ff30 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20  (p1, &nTerm);.  
1ff40 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
1ff50 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
1ff60 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54  , MIN(nToken, nT
1ff70 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20  erm))<=0 );.    
1ff80 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b    if( nTerm<nTok
1ff90 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f  en || memcmp(pTo
1ffa0 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b  ken, pTerm, nTok
1ffb0 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  en) ) break;..  
1ffc0 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e      if( doclist.
1ffd0 6e 3e 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69  n>0 && iRowid<=i
1ffe0 4c 61 73 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  LastRowid ){.   
1fff0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d       for(i=0; p-
20000 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
20010 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b  & doclist.n; i++
20020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
20030 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20  ert( i<nBuf );. 
20040 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75           if( aBu
20050 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  f[i].n==0 ){.   
20060 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
20070 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74  ferSwap(&doclist
20080 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
20090 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
200a0 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74  ferZero(&doclist
200b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
200c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
200d0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
200e0 69 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73 74  ists(p, &doclist
200f0 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
20100 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
20110 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d  ferZero(&aBuf[i]
20120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
20130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20140 0a 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72 67  ..      fts5Merg
20150 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d  eAppendDocid(&p-
20160 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26  >rc, &doclist, &
20170 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f 77  iLastRowid, iRow
20180 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  id);.      fts5M
20190 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
201a0 70 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69  p, p1, 1, &docli
201b0 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  st);.    }..    
201c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b  for(i=0; i<nBuf;
201d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
201e0 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
201f0 73 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26  s(p, &doclist, &
20200 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
20210 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
20220 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aBuf[i]);.    }.
20230 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
20240 72 46 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20  rFree(p, p1);.. 
20250 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 49     pData = fts5I
20260 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
20270 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 64  of(Fts5Data) + d
20280 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69  oclist.n);.    i
20290 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
202a0 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38    pData->p = (u8
202b0 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20  *)&pData[1];.   
202c0 20 20 20 70 44 61 74 61 2d 3e 6e 20 3d 20 64 6f     pData->n = do
202d0 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d  clist.n;.      m
202e0 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20  emcpy(pData->p, 
202f0 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69  doclist.p, docli
20300 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  st.n);.      fts
20310 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70  5MultiIterNew2(p
20320 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20  , pData, bDesc, 
20330 26 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b  &pIter->pMulti);
20340 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
20350 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69  ufferFree(&docli
20360 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  st);.  }..  fts5
20370 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
20380 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c  (pStruct);.  sql
20390 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b  ite3_free(aBuf);
203a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  .}.../*.** Indic
203b0 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62  ate that all sub
203c0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
203d0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
203e0 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e  xWrite() pertain
203f0 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d  .** to the docum
20400 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69  ent with rowid i
20410 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Rowid..*/.int sq
20420 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65  lite3Fts5IndexBe
20430 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e 64  ginWrite(Fts5Ind
20440 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
20450 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  d){.  assert( p-
20460 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
20470 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
20480 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
20490 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
204a0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
204b0 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
204c0 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >pHash==0 ){.   
204d0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
204e0 46 74 73 35 48 61 73 68 4e 65 77 28 26 70 2d 3e  Fts5HashNew(&p->
204f0 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64  pHash, &p->nPend
20500 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  ingData);.  }.. 
20510 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61   /* Flush the ha
20520 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
20530 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
20540 20 20 69 66 28 20 69 52 6f 77 69 64 3c 3d 70 2d    if( iRowid<=p-
20550 3e 69 57 72 69 74 65 52 6f 77 69 64 20 7c 7c 20  >iWriteRowid || 
20560 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  (p->nPendingData
20570 20 3e 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e   > p->nMaxPendin
20580 67 44 61 74 61 29 20 29 7b 0a 20 20 20 20 66 74  gData) ){.    ft
20590 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b  s5IndexFlush(p);
205a0 0a 20 20 7d 0a 20 20 70 2d 3e 69 57 72 69 74 65  .  }.  p->iWrite
205b0 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
205c0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
205d0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
205e0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74  /*.** Commit dat
205f0 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  a to disk..*/.in
20600 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
20610 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78  exSync(Fts5Index
20620 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74   *p, int bCommit
20630 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
20640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
20650 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
20660 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d  h(p);.  if( bCom
20670 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52  mit ) fts5CloseR
20680 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75  eader(p);.  retu
20690 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
206a0 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
206b0 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61  Discard any data
206c0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
206d0 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
206e0 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69  bles. Do not wri
206f0 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20  te it.** to the 
20700 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
20710 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74  onally, assume t
20720 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
20730 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a   of the %_data.*
20740 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65  * table may have
20750 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b   changed on disk
20760 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f  . So any in-memo
20770 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64  ry caches of %_d
20780 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ata .** records 
20790 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61  must be invalida
207a0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
207b0 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c  te3Fts5IndexRoll
207c0 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a  back(Fts5Index *
207d0 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52  p){.  fts5CloseR
207e0 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35  eader(p);.  fts5
207f0 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61  IndexDiscardData
20800 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
20810 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20820 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
20830 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20840 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  The %_data table
20850 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
20860 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73 20 66  mpty when this f
20870 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
20880 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  d. This.** funct
20890 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74  ion populates it
208a0 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61   with the initia
208b0 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  l structure obje
208c0 63 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64  cts for each ind
208d0 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  ex,.** and the i
208e0 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f  nitial version o
208f0 66 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  f the "averages"
20900 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d   record (a zero-
20910 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69  byte blob)..*/.i
20920 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
20930 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e  dexReinit(Fts5In
20940 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53  dex *p){.  Fts5S
20950 74 72 75 63 74 75 72 65 20 73 3b 0a 0a 20 20 61  tructure s;..  a
20960 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
20970 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e  LITE_OK );.  p->
20980 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
20990 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
209a0 28 70 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22  (p, (const u8*)"
209b0 22 2c 20 30 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  ", 0);..  memset
209c0 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
209d0 74 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a  ts5Structure));.
209e0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
209f0 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 0a 20 20  rite(p, &s);..  
20a00 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
20a10 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
20a20 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46  .** Open a new F
20a30 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
20a40 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20   If the bCreate 
20a50 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
20a60 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20  , create.** and 
20a70 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75  initialize the u
20a80 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61  nderlying %_data
20a90 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
20aa0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
20ab0 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
20ac0 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
20ad0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
20ae0 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  E_OK..** Otherwi
20af0 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  se, set *pp to N
20b00 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ULL and return a
20b10 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
20b20 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
20b30 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e  te3Fts5IndexOpen
20b40 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  (.  Fts5Config *
20b50 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20  pConfig, .  int 
20b60 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35  bCreate, .  Fts5
20b70 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68  Index **pp,.  ch
20b80 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
20b90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20ba0 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  OK;.  Fts5Index 
20bb0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
20bc0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
20bd0 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20  ect */..  *pp = 
20be0 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29  p = (Fts5Index*)
20bf0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
20c00 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f  cZero(&rc, sizeo
20c10 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20  f(Fts5Index));. 
20c20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20c30 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f  OK ){.    p->pCo
20c40 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a  nfig = pConfig;.
20c50 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74      p->nWorkUnit
20c60 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49   = FTS5_WORK_UNI
20c70 54 3b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65  T;.    p->nMaxPe
20c80 6e 64 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34  ndingData = 1024
20c90 2a 31 30 32 34 3b 0a 20 20 20 20 70 2d 3e 7a 44  *1024;.    p->zD
20ca0 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ataTbl = sqlite3
20cb0 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
20cc0 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e   "%s_data", pCon
20cd0 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  fig->zName);.   
20ce0 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c   if( p->zDataTbl
20cf0 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20   && bCreate ){. 
20d00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20d10 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
20d20 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  (.          pCon
20d30 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
20d40 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
20d50 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
20d60 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
20d70 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72    );.      if( r
20d80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20d90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20da0 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69  ite3Fts5IndexRei
20db0 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nit(p);.      }.
20dc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
20dd0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20de0 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
20df0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
20e00 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
20e10 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
20e20 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  p);.    *pp = 0;
20e30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
20e50 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64   a handle opened
20e60 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
20e70 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
20e80 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a  s5IndexOpen()..*
20e90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
20ea0 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35  5IndexClose(Fts5
20eb0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74  Index *p){.  int
20ec0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20ed0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
20ee0 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64  assert( p->pRead
20ef0 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  er==0 );.    sql
20f00 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
20f10 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73  >pWriter);.    s
20f20 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
20f30 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20  p->pDeleter);.  
20f40 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
20f50 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29 3b  hFree(p->pHash);
20f60 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
20f70 42 75 66 66 65 72 46 72 65 65 28 26 70 2d 3e 73  BufferFree(&p->s
20f80 63 72 61 74 63 68 29 3b 0a 20 20 20 20 73 71 6c  cratch);.    sql
20f90 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61  ite3_free(p->zDa
20fa0 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69  taTbl);.    sqli
20fb0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
20fc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20fd0 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
20fe0 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  p points to a bu
20ff0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
21000 75 74 66 2d 38 20 74 65 78 74 20 74 68 61 74 20  utf-8 text that 
21010 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a  is n bytes in .*
21020 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74  * size. Return t
21030 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
21040 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72 20  es in the nChar 
21050 63 68 61 72 61 63 74 65 72 20 70 72 65 66 69 78  character prefix
21060 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66 65   of the.** buffe
21070 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72 65  r, or 0 if there
21080 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e   are less than n
21090 43 68 61 72 20 63 68 61 72 61 63 74 65 72 73 20  Char characters 
210a0 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73 74 61  in total..*/.sta
210b0 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
210c0 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
210d0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c  n(const char *p,
210e0 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
210f0 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74 20 6e 20  nChar){.  int n 
21100 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
21110 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72  for(i=0; i<nChar
21120 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
21130 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72  n>=nByte ) retur
21140 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70  n 0;      /* Inp
21150 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ut contains fewe
21160 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61  r than nChar cha
21170 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75  rs */.    if( (u
21180 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e  nsigned char)p[n
21190 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ++]>=0xc0 ){.   
211a0 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20     while( (p[n] 
211b0 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  & 0xc0)==0x80 ) 
211c0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
211d0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
211e0 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55 54 46  .** pIn is a UTF
211f0 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  -8 encoded strin
21200 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69 6e 20  g, nIn bytes in 
21210 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65  size. Return the
21220 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e   number of.** un
21230 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73  icode characters
21240 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a   in the string..
21250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
21260 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63  s5IndexCharlen(c
21270 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20  onst char *pIn, 
21280 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20  int nIn){.  int 
21290 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20  nChar = 0;      
212a0 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d        .  int i =
212b0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e   0;.  while( i<n
212c0 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75  In ){.    if( (u
212d0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e  nsigned char)pIn
212e0 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20  [i++]>=0xc0 ){. 
212f0 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49       while( i<nI
21300 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30  n && (pIn[i] & 0
21310 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b  xc0)==0x80 ) i++
21320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61  ;.    }.    nCha
21330 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
21340 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nChar;.}../*.*
21350 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f  * Insert or remo
21360 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72  ve data to or fr
21370 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61  om the index. Ea
21380 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65  ch time a docume
21390 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20  nt is .** added 
213a0 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
213b0 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  om the index, th
213c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
213d0 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  alled one or mor
213e0 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a  e.** times..**.*
213f0 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c  * For an insert,
21400 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c   it must be call
21410 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
21420 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65   token in the ne
21430 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49  w document..** I
21440 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
21450 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20  is a delete, it 
21460 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28  must be called (
21470 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66  at least) once f
21480 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75  or each.** uniqu
21490 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64  e token in the d
214a0 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  ocument with an 
214b0 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20  iCol value less 
214c0 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69  than zero. The i
214d0 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  Pos.** argument 
214e0 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61  is ignored for a
214f0 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20   delete..*/.int 
21500 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
21510 57 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64  Write(.  Fts5Ind
21520 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
21530 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
21540 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  x to write to */
21550 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b     /* Column tok
21580 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d  en appears in (-
21590 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f  ve -> delete) */
215a0 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20  .  int iPos,    
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
215d0 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63  f token within c
215e0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
215f0 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
21600 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f  nt nToken  /* To
21610 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65  ken to add or re
21620 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20  move to or from 
21630 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e  index */.){.  in
21640 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21660 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
21670 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73   through indexes
21680 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
21690 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
216a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
216b0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f  code */.  Fts5Co
216c0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
216d0 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61  p->pConfig;..  a
216e0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
216f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a  LITE_OK );..  /*
21700 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74   Add the entry t
21710 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  o the main terms
21720 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20   index. */.  rc 
21730 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
21740 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d  hWrite(.      p-
21750 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74  >pHash, p->iWrit
21760 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
21770 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  os, FTS5_MAIN_PR
21780 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  EFIX, pToken, nT
21790 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72  oken.  );..  for
217a0 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
217b0 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d  >nPrefix && rc==
217c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
217d0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
217e0 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
217f0 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65  nToBytelen(pToke
21800 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66  n, nToken, pConf
21810 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 29 3b  ig->aPrefix[i]);
21820 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
21830 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21840 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
21850 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20  e(p->pHash, .   
21860 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65         p->iWrite
21870 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
21880 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  s, FTS5_MAIN_PRE
21890 46 49 58 2b 69 2b 31 2c 20 70 54 6f 6b 65 6e 2c  FIX+i+1, pToken,
218a0 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a   nByte.      );.
218b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
218c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
218d0 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72   Open a new iter
218e0 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  ator to iterate 
218f0 74 68 6f 75 67 68 20 61 6c 6c 20 64 6f 63 69 64  though all docid
21900 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  s that match the
21910 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74   .** specified t
21920 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
21930 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  efix..*/.int sql
21940 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
21950 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ry(.  Fts5Index 
21960 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21970 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
21980 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  ex to query */. 
21990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
219a0 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  ken, int nToken,
219b0 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72   /* Token (or pr
219c0 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66  efix) to query f
219d0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  or */.  int flag
219e0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
219f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
21a00 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  of FTS5INDEX_QUE
21a10 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  RY_X flags */.  
21a20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a  Fts5IndexIter **
21a30 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
21a40 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
21a50 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  ator object */.)
21a60 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
21a70 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
21a80 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e 64 65  nfig;.  Fts5Inde
21a90 78 49 74 65 72 20 2a 70 52 65 74 3b 0a 20 20 69  xIter *pRet;.  i
21aa0 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 46  nt iIdx = 0;.  F
21ab0 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
21ac0 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a  {0, 0, 0};..  /*
21ad0 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 53 43   If the QUERY_SC
21ae0 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  AN flag is set, 
21af0 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20  all other flags 
21b00 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a  must be clear. *
21b10 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
21b20 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
21b30 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 0a 20 20  UERY_SCAN)==0.  
21b40 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 20 26       || (flags &
21b50 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
21b60 5f 53 43 41 4e 29 3d 3d 46 54 53 35 49 4e 44 45  _SCAN)==FTS5INDE
21b70 58 5f 51 55 45 52 59 5f 53 43 41 4e 0a 20 20 29  X_QUERY_SCAN.  )
21b80 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
21b90 46 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  Fts5BufferGrow(&
21ba0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f  p->rc, &buf, nTo
21bb0 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20  ken+1)==0 ){.   
21bc0 20 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31   memcpy(&buf.p[1
21bd0 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  ], pToken, nToke
21be0 6e 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  n);.  }..#ifdef 
21bf0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
21c00 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
21c10 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
21c20 4e 4f 49 44 58 20 29 7b 0a 20 20 20 20 61 73 73  NOIDX ){.    ass
21c30 65 72 74 28 20 66 6c 61 67 73 20 26 20 46 54 53  ert( flags & FTS
21c40 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
21c50 46 49 58 20 29 3b 0a 20 20 20 20 69 49 64 78 20  FIX );.    iIdx 
21c60 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  = 1+pConfig->nPr
21c70 65 66 69 78 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  efix;.  }else.#e
21c80 6e 64 69 66 0a 20 20 69 66 28 20 66 6c 61 67 73  ndif.  if( flags
21c90 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
21ca0 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  RY_PREFIX ){.   
21cb0 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73   int nChar = fts
21cc0 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54  5IndexCharlen(pT
21cd0 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
21ce0 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
21cf0 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
21d00 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
21d10 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
21d20 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d  g->aPrefix[iIdx-
21d30 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65 61  1]==nChar ) brea
21d40 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
21d50 70 52 65 74 20 3d 20 28 46 74 73 35 49 6e 64 65  pRet = (Fts5Inde
21d60 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 46 74  xIter*)sqlite3Ft
21d70 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
21d80 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  >rc, sizeof(Fts5
21d90 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 20 20 69  IndexIter));.  i
21da0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70  f( pRet ){.    p
21db0 52 65 74 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b  Ret->pIndex = p;
21dc0 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c 3d 70  .    if( iIdx<=p
21dd0 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
21de0 29 7b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  ){.      buf.p[0
21df0 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] = FTS5_MAIN_PR
21e00 45 46 49 58 20 2b 20 69 49 64 78 3b 0a 20 20 20  EFIX + iIdx;.   
21e10 20 20 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74     pRet->pStruct
21e20 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
21e30 52 65 61 64 28 70 29 3b 0a 20 20 20 20 20 20 69  Read(p);.      i
21e40 66 28 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74  f( pRet->pStruct
21e50 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
21e60 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20  MultiIterNew(.  
21e70 20 20 20 20 20 20 20 20 20 20 70 2c 20 70 52 65            p, pRe
21e80 74 2d 3e 70 53 74 72 75 63 74 2c 20 31 2c 20 66  t->pStruct, 1, f
21e90 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20 6e 54 6f  lags, buf.p, nTo
21ea0 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70  ken+1, -1, 0, &p
21eb0 52 65 74 2d 3e 70 4d 75 6c 74 69 0a 20 20 20 20  Ret->pMulti.    
21ec0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
21ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21ee0 69 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61  int bDesc = (fla
21ef0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
21f00 55 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20  UERY_DESC)!=0;. 
21f10 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20       buf.p[0] = 
21f20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
21f30 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75  ;.      fts5Setu
21f40 70 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62  pPrefixIter(p, b
21f50 44 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f  Desc, buf.p, nTo
21f60 6b 65 6e 2b 31 2c 20 70 52 65 74 29 3b 0a 20 20  ken+1, pRet);.  
21f70 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
21f80 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->rc ){.    sqli
21f90 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
21fa0 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52 65 74  (pRet);.    pRet
21fb0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 49   = 0;.  }.  *ppI
21fc0 74 65 72 20 3d 20 70 52 65 74 3b 0a 20 20 73 71  ter = pRet;.  sq
21fd0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
21fe0 72 65 65 28 26 62 75 66 29 3b 0a 20 20 72 65 74  ree(&buf);.  ret
21ff0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
22000 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
22010 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
22020 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
22030 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
22040 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45  argument is at E
22050 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OF..*/.int sqlit
22060 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 46 74  e3Fts5IterEof(Ft
22070 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
22080 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
22090 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
220a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
220b0 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74   return fts5Mult
220c0 69 49 74 65 72 45 6f 66 28 70 49 74 65 72 2d 3e  iIterEof(pIter->
220d0 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
220e0 4d 75 6c 74 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Multi);.}../*.**
220f0 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
22100 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
22110 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
22120 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 46 74  3Fts5IterNext(Ft
22130 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
22140 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
22150 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
22160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
22170 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
22180 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  xt(pIter->pIndex
22190 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c  , pIter->pMulti,
221a0 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
221b0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
221c0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
221d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
221e0 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
221f0 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20  ing term/rowid. 
22200 55 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  Used by the fts5
22210 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f  vocab module..*/
22220 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22230 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73  IterNextScan(Fts
22240 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
22250 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r){.  Fts5Index 
22260 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64  *p = pIter->pInd
22270 65 78 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53  ex;.  Fts5MultiS
22280 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 20 3d  egIter *pMulti =
22290 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 3b 0a   pIter->pMulti;.
222a0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
222b0 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
222c0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
222d0 65 72 74 28 20 70 4d 75 6c 74 69 20 29 3b 0a 0a  ert( pMulti );..
222e0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
222f0 65 78 74 28 70 2c 20 70 4d 75 6c 74 69 2c 20 30  ext(p, pMulti, 0
22300 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  , 0);.  if( p->r
22310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22320 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
22330 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d  *pSeg = &pMulti-
22340 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61  >aSeg[ pMulti->a
22350 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
22360 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ];.    if( pSeg-
22370 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e  >pLeaf && pSeg->
22380 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f  term.p[0]!=FTS5_
22390 4d 41 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20  MAIN_PREFIX ){. 
223a0 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
223b0 65 61 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66  ease(pSeg->pLeaf
223c0 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  );.      pSeg->p
223d0 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Leaf = 0;.    }.
223e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74    }..  return ft
223f0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
22400 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
22410 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
22420 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
22430 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75   rowid that occu
22440 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69  rs at or after i
22450 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65  Match. The.** de
22460 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20  finition of "at 
22470 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64  or after" depend
22480 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69  s on whether thi
22490 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61  s iterator itera
224a0 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  tes.** in ascend
224b0 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e  ing or descendin
224c0 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a  g rowid order..*
224d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
224e0 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74  5IterNextFrom(Ft
224f0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
22500 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b  er, i64 iMatch){
22510 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
22520 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e  NextFrom(pIter->
22530 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
22540 4d 75 6c 74 69 2c 20 69 4d 61 74 63 68 29 3b 0a  Multi, iMatch);.
22550 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
22560 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
22570 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
22580 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
22590 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69  rent rowid..*/.i
225a0 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  64 sqlite3Fts5It
225b0 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65  erRowid(Fts5Inde
225c0 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
225d0 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74   return fts5Mult
225e0 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
225f0 2d 3e 70 4d 75 6c 74 69 29 3b 0a 7d 0a 0a 2f 2a  ->pMulti);.}../*
22600 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
22610 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a  urrent term..*/.
22620 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
22630 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28  te3Fts5IterTerm(
22640 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
22650 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a  Iter, int *pn){.
22660 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
22670 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
22680 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74  t char*)fts5Mult
22690 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2d  iIterTerm(pIter-
226a0 3e 70 4d 75 6c 74 69 2c 20 26 6e 29 3b 0a 20 20  >pMulti, &n);.  
226b0 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74  *pn = n-1;.  ret
226c0 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 0a 2f  urn &z[1];.}.../
226d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
226e0 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
226f0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63  r containing a c
22700 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
22710 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20  ion list for.** 
22720 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
22730 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  y. Output variab
22740 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f  le *pn is set to
22750 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
22760 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62   buffer .** in b
22770 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75  ytes before retu
22780 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rning..**.** The
22790 20 72 65 74 75 72 6e 65 64 20 70 6f 73 69 74 69   returned positi
227a0 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74  on list does not
227b0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 22 6e 75   include the "nu
227c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 22 20 76  mber of bytes" v
227d0 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c 64 20 74  arint.** field t
227e0 68 61 74 20 73 74 61 72 74 73 20 74 68 65 20 70  hat starts the p
227f0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20  osition list on 
22800 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
22810 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
22820 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
22830 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
22840 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 20  const u8 **pp,  
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
22870 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  to position-list
22880 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a   data */.  int *
22890 70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pn,             
228a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
228b0 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74  T: Size of posit
228c0 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79 74 65  ion-list in byte
228d0 73 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 52 6f  s */.  i64 *piRo
228e0 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
228f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43         /* OUT: C
22900 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
22910 29 7b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  ){.  Fts5MultiSe
22920 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 20 3d 20  gIter *pMulti = 
22930 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 3b 0a 20  pIter->pMulti;. 
22940 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
22950 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53  eg = &pMulti->aS
22960 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72  eg[ pMulti->aFir
22970 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
22980 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
22990 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c  >pIndex->rc==SQL
229a0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 69 52  ITE_OK );.  *piR
229b0 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f  owid = pSeg->iRo
229c0 77 69 64 3b 0a 20 20 2a 70 6e 20 3d 20 70 53 65  wid;.  *pn = pSe
229d0 67 2d 3e 6e 50 6f 73 3b 0a 20 20 69 66 28 20 70  g->nPos;.  if( p
229e0 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
229f0 2b 70 53 65 67 2d 3e 6e 50 6f 73 20 3c 3d 20 70  +pSeg->nPos <= p
22a00 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b  Seg->pLeaf->n ){
22a10 0a 20 20 20 20 2a 70 70 20 3d 20 26 70 53 65 67  .    *pp = &pSeg
22a20 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
22a30 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
22a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
22a50 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
22a60 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
22a70 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
22a80 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
22a90 78 2c 20 70 53 65 67 2c 20 26 70 49 74 65 72 2d  x, pSeg, &pIter-
22aa0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 2a  >poslist);.    *
22ab0 70 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  pp = pIter->posl
22ac0 69 73 74 2e 70 3b 0a 20 20 7d 0a 20 20 72 65 74  ist.p;.  }.  ret
22ad0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
22ae0 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
22af0 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  x);.}../*.** Thi
22b00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
22b10 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
22b20 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28  Fts5IterPoslist(
22b30 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
22b40 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 20  t.** copies the 
22b50 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e  position list in
22b60 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73 75  to the buffer su
22b70 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65  pplied as the se
22b80 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
22b90 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
22ba0 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74  3Fts5IterPoslist
22bb0 42 75 66 66 65 72 28 46 74 73 35 49 6e 64 65 78  Buffer(Fts5Index
22bc0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
22bd0 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
22be0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d    Fts5Index *p =
22bf0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a   pIter->pIndex;.
22c00 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
22c10 65 72 20 2a 70 4d 75 6c 74 69 20 3d 20 70 49 74  er *pMulti = pIt
22c20 65 72 2d 3e 70 4d 75 6c 74 69 3b 0a 0a 20 20 61  er->pMulti;..  a
22c30 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
22c40 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
22c50 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66  5BufferZero(pBuf
22c60 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  );.  fts5MultiIt
22c70 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 4d 75  erPoslist(p, pMu
22c80 6c 74 69 2c 20 30 2c 20 70 42 75 66 29 3b 0a 20  lti, 0, pBuf);. 
22c90 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
22ca0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
22cb0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74  *.** Close an it
22cc0 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79  erator opened by
22cd0 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
22ce0 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
22cf0 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a  ndexQuery()..*/.
22d00 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
22d10 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e  IterClose(Fts5In
22d20 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
22d30 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
22d40 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
22d50 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 49 6e  rFree(pIter->pIn
22d60 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c  dex, pIter->pMul
22d70 74 69 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72  ti);.    fts5Str
22d80 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 49  uctureRelease(pI
22d90 74 65 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20  ter->pStruct);. 
22da0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
22db0 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  e(&pIter->poslis
22dc0 74 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f 73  t);.    fts5Clos
22dd0 65 52 65 61 64 65 72 28 70 49 74 65 72 2d 3e 70  eReader(pIter->p
22de0 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
22df0 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
22e00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
22e10 61 64 20 74 68 65 20 22 61 76 65 72 61 67 65 73  ad the "averages
22e20 22 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  " record into th
22e30 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65  e buffer supplie
22e40 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
22e50 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  .** argument. Re
22e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
22e70 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
22e80 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
22e90 20 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65   code.** if an e
22ea0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
22eb0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
22ec0 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28  ndexGetAverages(
22ed0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
22ee0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b  s5Buffer *pBuf){
22ef0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
22f00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
22f10 20 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42   fts5DataReadOrB
22f20 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46  uffer(p, pBuf, F
22f30 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
22f40 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ID);.  return ft
22f50 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
22f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  ;.}../*.** Repla
22f70 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22  ce the current "
22f80 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
22f90 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
22fa0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
22fb0 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73   .** supplied as
22fc0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
22fd0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
22fe0 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
22ff0 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64  Averages(Fts5Ind
23000 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20  ex *p, const u8 
23010 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
23020 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  a){.  assert( p-
23030 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
23040 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74  ;.  fts5DataWrit
23050 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47  e(p, FTS5_AVERAG
23060 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c  ES_ROWID, pData,
23070 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72   nData);.  retur
23080 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
23090 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
230a0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
230b0 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73  number of blocks
230c0 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73   this module has
230d0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
230e0 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73  _data.** table s
230f0 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61  ince it was crea
23100 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
23110 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64  te3Fts5IndexRead
23120 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  s(Fts5Index *p){
23130 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65  .  return p->nRe
23140 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ad;.}../*.** Set
23150 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b   the 32-bit cook
23160 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ie value stored 
23170 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
23180 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a  all structure .*
23190 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  * records to the
231a0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
231b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
231c0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ment..**.** Retu
231d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
231e0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
231f0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
23200 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
23210 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
23220 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
23230 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35  exSetCookie(Fts5
23240 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e  Index *p, int iN
23250 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ew){.  int rc;  
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23280 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
23290 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
232a0 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
232b0 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72  ;    /* Configur
232c0 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ation object */.
232d0 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b    u8 aCookie[4];
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232f0 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79         /* Binary
23300 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
23310 6f 66 20 69 4e 65 77 20 2a 2f 0a 0a 20 20 61 73  of iNew */..  as
23320 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
23330 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71 6c  ITE_OK );..  sql
23340 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61 43  ite3Fts5Put32(aC
23350 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 20 20  ookie, iNew);.  
23360 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
23370 6c 6f 62 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  lob = 0;.  rc = 
23380 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
23390 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70  n(pConfig->db, p
233a0 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
233b0 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20  zDataTbl, .     
233c0 20 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53   "block", FTS5_S
233d0 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20  TRUCTURE_ROWID, 
233e0 31 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20  1, &pBlob.  );. 
233f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23400 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
23410 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c  3_blob_write(pBl
23420 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20  ob, aCookie, 4, 
23430 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
23440 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
23450 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72  pBlob);.  }..  r
23460 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74  eturn rc;.}..int
23470 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
23480 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35  xLoadConfig(Fts5
23490 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
234a0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
234b0 75 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  uct;.  pStruct =
234c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
234d0 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72  ad(p);.  fts5Str
234e0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
234f0 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  truct);.  return
23500 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
23510 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  (p);.}.../******
23520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23560 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
23570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
235a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
235b0 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69  * Below this poi
235c0 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d  nt is the implem
235d0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
235e0 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
235f0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  .** functionalit
23600 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  y..*/../*.** Ret
23610 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65  urn a simple che
23620 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65  cksum value base
23630 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  d on the argumen
23640 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36  ts..*/.static u6
23650 34 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  4 fts5IndexEntry
23660 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f  Cksum(.  i64 iRo
23670 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c  wid, .  int iCol
23680 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a  , .  int iPos, .
23690 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f    int iIdx,.  co
236a0 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c  nst char *pTerm,
236b0 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a  .  int nTerm.){.
236c0 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72    int i;.  u64 r
236d0 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72  et = iRowid;.  r
236e0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
236f0 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20   iCol;.  ret += 
23700 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b  (ret<<3) + iPos;
23710 0a 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29  .  if( iIdx>=0 )
23720 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
23730 20 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52   + (FTS5_MAIN_PR
23740 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20  EFIX + iIdx);.  
23750 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
23760 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72  ; i++) ret += (r
23770 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69  et<<3) + pTerm[i
23780 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ];.  return ret;
23790 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
237a0 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69  fts5BtreeIterIni
237b0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
237c0 70 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74  p, .  Fts5Struct
237d0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
237e0 2c 20 0a 20 20 46 74 73 35 42 74 72 65 65 49 74  , .  Fts5BtreeIt
237f0 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69  er *pIter.){.  i
23800 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
23810 69 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  i;.  nByte = siz
23820 65 6f 66 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  eof(pIter->aLvl[
23830 30 5d 29 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65  0]) * (pSeg->nHe
23840 69 67 68 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65  ight-1);.  memse
23850 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
23860 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 69  of(*pIter));.  i
23870 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
23880 70 49 74 65 72 2d 3e 61 4c 76 6c 20 3d 20 28 46  pIter->aLvl = (F
23890 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
238a0 6c 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  l*)fts5IdxMalloc
238b0 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  (p, nByte);.  }.
238c0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
238d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49  ITE_OK ){.    pI
238e0 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65 67  ter->nLvl = pSeg
238f0 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 0a 20 20 20  ->nHeight-1;.   
23900 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a 20   pIter->p = p;. 
23910 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d     pIter->pSeg =
23920 20 70 53 65 67 3b 0a 20 20 7d 0a 20 20 66 6f 72   pSeg;.  }.  for
23930 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
23940 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65  ITE_OK && i<pIte
23950 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20  r->nLvl; i++){. 
23960 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
23970 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
23980 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
23990 20 69 2b 31 2c 20 31 29 3b 0a 20 20 20 20 46 74   i+1, 1);.    Ft
239a0 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
239b0 20 20 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69     pIter->aLvl[i
239c0 5d 2e 70 44 61 74 61 20 3d 20 70 44 61 74 61 20  ].pData = pData 
239d0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
239e0 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69  , iRowid);.    i
239f0 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
23a00 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e    fts5NodeIterIn
23a10 69 74 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61  it(pData->p, pDa
23a20 74 61 2d 3e 6e 2c 20 26 70 49 74 65 72 2d 3e 61  ta->n, &pIter->a
23a30 4c 76 6c 5b 69 5d 2e 73 29 3b 0a 20 20 20 20 7d  Lvl[i].s);.    }
23a40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
23a50 72 2d 3e 6e 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d  r->nLvl==0 || p-
23a60 3e 72 63 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >rc ){.    pIter
23a70 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  ->bEof = 1;.    
23a80 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70  pIter->iLeaf = p
23a90 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20  Seg->pgnoLast;. 
23aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
23ab0 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65  r->nEmpty = pIte
23ac0 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d  r->aLvl[0].s.nEm
23ad0 70 74 79 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  pty;.    pIter->
23ae0 69 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 61  iLeaf = pIter->a
23af0 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68 69 6c 64 3b  Lvl[0].s.iChild;
23b00 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69  .    pIter->bDli
23b10 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c  dx = pIter->aLvl
23b20 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20  [0].s.bDlidx;.  
23b30 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
23b40 20 66 74 73 35 42 74 72 65 65 49 74 65 72 4e 65   fts5BtreeIterNe
23b50 78 74 28 46 74 73 35 42 74 72 65 65 49 74 65 72  xt(Fts5BtreeIter
23b60 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
23b70 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72  Index *p = pIter
23b80 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ->p;.  int i;.. 
23b90 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
23ba0 62 45 6f 66 3d 3d 30 20 26 26 20 70 49 74 65 72  bEof==0 && pIter
23bb0 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 61 44 61 74  ->aLvl[0].s.aDat
23bc0 61 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  a );.  for(i=0; 
23bd0 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 26 26  i<pIter->nLvl &&
23be0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23bf0 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  K; i++){.    Fts
23c00 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20  5BtreeIterLevel 
23c10 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
23c20 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73  aLvl[i];.    fts
23c30 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70  5NodeIterNext(&p
23c40 2d 3e 72 63 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b  ->rc, &pLvl->s);
23c50 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 73  .    if( pLvl->s
23c60 2e 61 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  .aData ){.      
23c70 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
23c80 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
23c90 72 6d 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d  rm, pLvl->s.term
23ca0 2e 6e 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d  .n, pLvl->s.term
23cb0 2e 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .p);.      break
23cc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23cd0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46     fts5NodeIterF
23ce0 72 65 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20  ree(&pLvl->s);. 
23cf0 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
23d00 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
23d10 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
23d20 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Data = 0;.    }.
23d30 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d 70 49 74    }.  if( i==pIt
23d40 65 72 2d 3e 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72  er->nLvl || p->r
23d50 63 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  c ){.    pIter->
23d60 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  bEof = 1;.  }els
23d70 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  e{.    int iSegi
23d80 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  d = pIter->pSeg-
23d90 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 66 6f 72  >iSegid;.    for
23da0 28 69 2d 2d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  (i--; i>=0; i--)
23db0 7b 0a 20 20 20 20 20 20 46 74 73 35 42 74 72 65  {.      Fts5Btre
23dc0 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c  eIterLevel *pLvl
23dd0 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   = &pIter->aLvl[
23de0 69 5d 3b 0a 20 20 20 20 20 20 69 36 34 20 69 52  i];.      i64 iR
23df0 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
23e00 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
23e10 2c 20 69 2b 31 2c 20 70 4c 76 6c 5b 31 5d 2e 73  , i+1, pLvl[1].s
23e20 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  .iChild);.      
23e30 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
23e40 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
23e50 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
23e60 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a   pLvl->pData ){.
23e70 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65          fts5Node
23e80 49 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d 3e 70  IterInit(pLvl->p
23e90 44 61 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e 70  Data->p, pLvl->p
23ea0 44 61 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d 3e  Data->n, &pLvl->
23eb0 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
23ec0 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  }.  }..  pIter->
23ed0 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e  nEmpty = pIter->
23ee0 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79  aLvl[0].s.nEmpty
23ef0 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64  ;.  pIter->bDlid
23f00 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  x = pIter->aLvl[
23f10 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 70  0].s.bDlidx;.  p
23f20 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49  Iter->iLeaf = pI
23f30 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69  ter->aLvl[0].s.i
23f40 43 68 69 6c 64 3b 0a 7d 0a 0a 73 74 61 74 69 63  Child;.}..static
23f50 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49   void fts5BtreeI
23f60 74 65 72 46 72 65 65 28 46 74 73 35 42 74 72 65  terFree(Fts5Btre
23f70 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  eIter *pIter){. 
23f80 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
23f90 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c  0; i<pIter->nLvl
23fa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
23fb0 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a  BtreeIterLevel *
23fc0 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
23fd0 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35  Lvl[i];.    fts5
23fe0 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c  NodeIterFree(&pL
23ff0 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20  vl->s);.    if( 
24000 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20  pLvl->pData ){. 
24010 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
24020 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
24030 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
24040 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Data = 0;.    }.
24050 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
24060 65 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b  ee(pIter->aLvl);
24070 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
24080 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b  e(&pIter->term);
24090 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
240a0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
240b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70  is function is p
240c0 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61  urely an interna
240d0 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20  l test. It does 
240e0 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74  not contribute t
240f0 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69  o .** FTS functi
24100 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e  onality, or even
24110 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
24120 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79  heck, in any way
24130 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c  ..**.** Instead,
24140 20 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74   it tests that t
24150 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70  he same set of p
24160 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e  gno/rowid combin
24170 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76  ations are .** v
24180 69 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73  isited regardles
24190 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
241a0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
241b0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
241c0 61 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67 69  ameters.** iSegi
241d0 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61  d/iLeaf is itera
241e0 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20  ted in forwards 
241f0 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  or reverse order
24200 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24210 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
24220 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64  verse(.  Fts5Ind
24230 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53  ex *p, .  int iS
24240 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  egid,           
24250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
24260 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20  ment id to load 
24270 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  from */.  int iL
24280 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
24290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61            /* Loa
242a0 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  d doclist-index 
242b0 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
242c0 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  .){.  Fts5DlidxI
242d0 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b  ter *pDlidx = 0;
242e0 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20  .  u64 cksum1 = 
242f0 31 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32  13;.  u64 cksum2
24300 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44   = 13;..  for(pD
24310 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74  lidx=fts5DlidxIt
24320 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65  erInit(p, 0, iSe
24330 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20  gid, iLeaf);.   
24340 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
24350 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
24360 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  0;.      fts5Dli
24370 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44  dxIterNext(p, pD
24380 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69  lidx).  ){.    i
24390 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
243a0 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
243b0 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20  Dlidx);.    int 
243c0 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  pgno = fts5Dlidx
243d0 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
243e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
243f0 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  no>iLeaf );.    
24400 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64  cksum1 += iRowid
24410 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33   + ((i64)pgno<<3
24420 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c  2);.  }.  fts5Dl
24430 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
24440 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20  dx);.  pDlidx = 
24450 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78  0;..  for(pDlidx
24460 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  =fts5DlidxIterIn
24470 69 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64 2c  it(p, 1, iSegid,
24480 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66   iLeaf);.      f
24490 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
244a0 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
244b0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
244c0 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78  erPrev(p, pDlidx
244d0 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ).  ){.    i64 i
244e0 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64  Rowid = fts5Dlid
244f0 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
24500 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f  x);.    int pgno
24510 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
24520 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
24530 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c    assert( fts5Dl
24540 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
24550 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20  dx)>iLeaf );.   
24560 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69   cksum2 += iRowi
24570 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c  d + ((i64)pgno<<
24580 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44  32);.  }.  fts5D
24590 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
245a0 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d  idx);.  pDlidx =
245b0 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
245c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
245d0 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20  ksum1!=cksum2 ) 
245e0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
245f0 52 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RUPT;.}..static 
24600 69 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b 73  int fts5QueryCks
24610 75 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  um(.  Fts5Index 
24620 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
24630 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69 6e        /* Fts5 in
24640 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
24650 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73  int iIdx,.  cons
24660 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20  t char *z,      
24670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24680 6e 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65 72  ndex key to quer
24690 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  y for */.  int n
246a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
246b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
246c0 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 20  ze of index key 
246d0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
246e0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24700 20 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35 49   Flags for Fts5I
24710 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20 75  ndexQuery */.  u
24720 36 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20 20  64 *pCksum      
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24740 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73  * IN/OUT: Checks
24750 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  um value */.){. 
24760 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43   u64 cksum = *pC
24770 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65  ksum;.  Fts5Inde
24780 78 49 74 65 72 20 2a 70 49 64 78 49 74 65 72 20  xIter *pIdxIter 
24790 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
247a0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
247b0 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66  Query(p, z, n, f
247c0 6c 61 67 73 2c 20 26 70 49 64 78 49 74 65 72 29  lags, &pIdxIter)
247d0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  ;..  while( rc==
247e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
247f0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
24800 6f 66 28 70 49 64 78 49 74 65 72 29 20 29 7b 0a  of(pIdxIter) ){.
24810 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20      i64 dummy;. 
24820 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f     const u8 *pPo
24830 73 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  s;.    int nPos;
24840 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d  .    i64 rowid =
24850 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
24860 52 6f 77 69 64 28 70 49 64 78 49 74 65 72 29 3b  Rowid(pIdxIter);
24870 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24880 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74  3Fts5IterPoslist
24890 28 70 49 64 78 49 74 65 72 2c 20 26 70 50 6f 73  (pIdxIter, &pPos
248a0 2c 20 26 6e 50 6f 73 2c 20 26 64 75 6d 6d 79 29  , &nPos, &dummy)
248b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
248c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
248d0 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
248e0 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20  er sReader;.    
248f0 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73    for(sqlite3Fts
24900 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
24910 69 74 28 2d 31 2c 20 70 50 6f 73 2c 20 6e 50 6f  it(-1, pPos, nPo
24920 73 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20  s, &sReader);.  
24930 20 20 20 20 20 20 20 20 73 52 65 61 64 65 72 2e          sReader.
24940 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20  bEof==0;.       
24950 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
24960 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
24970 26 73 52 65 61 64 65 72 29 0a 20 20 20 20 20 20  &sReader).      
24980 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
24990 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43  Col = FTS5_POS2C
249a0 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50  OLUMN(sReader.iP
249b0 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  os);.        int
249c0 20 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53   iOff = FTS5_POS
249d0 32 4f 46 46 53 45 54 28 73 52 65 61 64 65 72 2e  2OFFSET(sReader.
249e0 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63  iPos);.        c
249f0 6b 73 75 6d 20 5e 3d 20 66 74 73 35 49 6e 64 65  ksum ^= fts5Inde
24a00 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69  xEntryCksum(rowi
24a10 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69  d, iCol, iOff, i
24a20 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  Idx, z, n);.    
24a30 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
24a40 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
24a50 78 74 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20  xt(pIdxIter);.  
24a60 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
24a70 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70  3Fts5IterClose(p
24a80 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43  IdxIter);..  *pC
24a90 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20  ksum = cksum;.  
24aa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
24ab0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24ac0 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c  on is also purel
24ad0 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65  y an internal te
24ae0 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  st. It does not 
24af0 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a  contribute to .*
24b00 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c  * FTS functional
24b10 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65  ity, or even the
24b20 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
24b30 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f  , in any way..*/
24b40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
24b50 35 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73  5TestTerm(.  Fts
24b60 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
24b70 73 35 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c  s5Buffer *pPrev,
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b90 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a   Previous term *
24ba0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
24bb0 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  z, int n,       
24bc0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
24bd0 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74  new term to test
24be0 20 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74   */.  u64 expect
24bf0 65 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75  ed,.  u64 *pCksu
24c00 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  m.){.  int rc = 
24c10 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72  p->rc;.  if( pPr
24c20 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ev->n==0 ){.    
24c30 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72  fts5BufferSet(&r
24c40 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f  c, pPrev, n, (co
24c50 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65  nst u8*)z);.  }e
24c60 6c 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  lse.  if( rc==SQ
24c70 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65  LITE_OK && (pPre
24c80 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d  v->n!=n || memcm
24c90 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e  p(pPrev->p, z, n
24ca0 29 29 20 29 7b 0a 20 20 20 20 75 33 32 20 63 6b  )) ){.    u32 ck
24cb0 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a  sum3 = *pCksum;.
24cc0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
24cd0 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63  zTerm = (const c
24ce0 68 61 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31  har*)&pPrev->p[1
24cf0 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73  ];  /* term sans
24d00 20 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a   prefix-byte */.
24d10 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20      int nTerm = 
24d20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20  pPrev->n-1;     
24d30 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
24d40 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73  f zTerm in bytes
24d50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
24d60 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20   = (pPrev->p[0] 
24d70 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  - FTS5_MAIN_PREF
24d80 49 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  IX);.    int fla
24d90 67 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20  gs = (iIdx==0 ? 
24da0 30 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55  0 : FTS5INDEX_QU
24db0 45 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20  ERY_PREFIX);.   
24dc0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 36 34   int rc;.    u64
24dd0 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36   ck1 = 0;.    u6
24de0 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20  4 ck2 = 0;..    
24df0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
24e00 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
24e10 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44  ed for ASC and D
24e20 45 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a  ESC queries are.
24e30 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e      ** the same.
24e40 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68   If not, call th
24e50 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  is corruption.  
24e60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  */.    rc = fts5
24e70 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
24e80 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
24e90 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a  , flags, &ck1);.
24ea0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24eb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
24ec0 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
24ed0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
24ee0 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  C;.      rc = ft
24ef0 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
24f00 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
24f10 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20  rm, f, &ck2);.  
24f20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
24f30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
24f40 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
24f50 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
24f60 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
24f70 70 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68  prefix query, ch
24f80 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73  eck that the res
24f90 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66  ults returned if
24fa0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
24fb0 69 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65  index is disable
24fc0 64 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  d are the same. 
24fd0 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20  In both ASC and 
24fe0 44 45 53 43 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  DESC order. */. 
24ff0 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26     if( iIdx>0 &&
25000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25010 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20  {.      int f = 
25020 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
25030 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
25040 3b 0a 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b  ;.      ck2 = 0;
25050 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35  .      rc = fts5
25060 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
25070 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
25080 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
25090 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
250a0 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
250b0 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
250c0 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  UPT;.    }.    i
250d0 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d  f( iIdx>0 && rc=
250e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
250f0 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
25100 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
25110 59 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53  Y_TEST_NOIDX|FTS
25120 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
25130 43 3b 0a 20 20 20 20 20 20 63 6b 32 20 3d 20 30  C;.      ck2 = 0
25140 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
25150 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
25160 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
25170 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
25180 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25190 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
251a0 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
251b0 52 55 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RUPT;.    }..   
251c0 20 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a   cksum3 ^= ck1;.
251d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
251e0 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c  t(&rc, pPrev, n,
251f0 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a   (const u8*)z);.
25200 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25210 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33  ITE_OK && cksum3
25220 21 3d 65 78 70 65 63 74 65 64 20 29 7b 0a 20 20  !=expected ){.  
25230 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f      rc = FTS5_CO
25240 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  RRUPT;.    }.   
25250 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d   *pCksum = cksum
25260 33 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d  3;.  }.  p->rc =
25270 20 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23   rc;.}. .#else.#
25280 20 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74   define fts5Test
25290 44 6c 69 64 78 52 65 76 65 72 73 65 28 78 2c 79  DlidxReverse(x,y
252a0 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 66 74 73  ,z).# define fts
252b0 35 54 65 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c  5TestTerm(u,v,w,
252c0 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 73  x,y,z).#endif..s
252d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
252e0 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
252f0 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73  ckSegment(.  Fts
25300 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25320 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
25330 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
25340 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
25350 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg      /* Segm
25360 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74  ent to check int
25370 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63  ernal consistenc
25380 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 42 74  y */.){.  Fts5Bt
25390 72 65 65 49 74 65 72 20 69 74 65 72 3b 20 20 20  reeIter iter;   
253a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
253b0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
253c0 6f 75 67 68 20 62 2d 74 72 65 65 20 68 69 65 72  ough b-tree hier
253d0 61 72 63 68 79 20 2a 2f 0a 0a 20 20 69 66 28 20  archy */..  if( 
253e0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d  pSeg->pgnoFirst=
253f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
25400 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
25410 67 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  gh the b-tree hi
25420 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 66  erarchy.  */.  f
25430 6f 72 28 66 74 73 35 42 74 72 65 65 49 74 65 72  or(fts5BtreeIter
25440 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26 69  Init(p, pSeg, &i
25450 74 65 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72  ter);.      p->r
25460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25470 69 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20  iter.bEof==0;.  
25480 20 20 20 20 66 74 73 35 42 74 72 65 65 49 74 65      fts5BtreeIte
25490 72 4e 65 78 74 28 26 69 74 65 72 29 0a 20 20 29  rNext(&iter).  )
254a0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20  {.    i64 iRow; 
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
254d0 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20   this leaf */.  
254e0 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
254f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
25500 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73  /* Data for this
25510 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74   leaf */.    int
25520 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
25530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
25540 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65  fset of first te
25550 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  rm on leaf */.  
25560 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
25570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25580 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
25590 74 65 20 74 68 72 6f 75 67 68 20 65 6d 70 74 79  te through empty
255a0 20 6c 65 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20   leaves */..    
255b0 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20 69  /* If the leaf i
255c0 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61  n question has a
255d0 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d  lready been trim
255e0 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67  med from the seg
255f0 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67  ment, .    ** ig
25600 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65 65  nore this b-tree
25610 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73   entry. Otherwis
25620 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20  e, load it into 
25630 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69  memory. */.    i
25640 66 28 20 69 74 65 72 2e 69 4c 65 61 66 3c 70 53  f( iter.iLeaf<pS
25650 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20  eg->pgnoFirst ) 
25660 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52  continue;.    iR
25670 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ow = FTS5_SEGMEN
25680 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
25690 65 67 69 64 2c 20 30 2c 20 69 74 65 72 2e 69 4c  egid, 0, iter.iL
256a0 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20  eaf);.    pLeaf 
256b0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
256c0 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  , iRow);.    if(
256d0 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
256e0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  k;..    /* Check
256f0 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63   that the leaf c
25700 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
25710 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74   one term, and t
25720 68 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a  hat it is equal.
25730 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72      ** to or lar
25740 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c  ger than the spl
25750 69 74 2d 6b 65 79 20 69 6e 20 69 74 65 72 2e 74  it-key in iter.t
25760 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b  erm.  Also check
25770 20 74 68 61 74 20 69 66 20 74 68 65 72 65 0a 20   that if there. 
25780 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20     ** is also a 
25790 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69  rowid pointer wi
257a0 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61  thin the leaf pa
257b0 67 65 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f  ge header, it po
257c0 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a  ints to a.    **
257d0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
257e0 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20   the term.  */. 
257f0 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65     iOff = fts5Ge
25800 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
25810 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66  ]);.    if( iOff
25820 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
25830 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
25840 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
25850 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
25860 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65  f;.      int nTe
25870 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
25880 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
25890 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20  term on leaf in 
258a0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  bytes */.      i
258b0 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
258c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
258d0 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d  mparison of term
258e0 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a   and split-key *
258f0 2f 0a 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f  /..      iRowidO
25900 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
25910 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
25920 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
25930 66 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20  ff>=iOff ){.    
25940 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
25950 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
25960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
25970 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
25980 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
25990 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a  [iOff], nTerm);.
259a0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65          res = me
259b0 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69  mcmp(&pLeaf->p[i
259c0 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72 6d 2e  Off], iter.term.
259d0 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 69 74  p, MIN(nTerm, it
259e0 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20 20 20  er.term.n));.   
259f0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
25a00 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
25a10 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20  iter.term.n;.   
25a20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
25a30 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
25a40 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
25a50 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
25a60 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
25a70 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
25a80 20 62 72 65 61 6b 3b 0a 0a 0a 20 20 20 20 2f 2a   break;...    /*
25a90 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
25aa0 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20  the iter.nEmpty 
25ab0 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67  leaves following
25ac0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
25ad0 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69  f.    ** (a) exi
25ae0 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  st and (b) conta
25af0 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a  in no terms. */.
25b00 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 70 2d 3e      for(i=1; p->
25b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25b20 20 69 3c 3d 69 74 65 72 2e 6e 45 6d 70 74 79 3b   i<=iter.nEmpty;
25b30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4c 65   i++){.      pLe
25b40 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
25b50 64 28 70 2c 20 69 52 6f 77 2b 69 29 3b 0a 20 20  d(p, iRow+i);.  
25b60 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 26 26      if( pLeaf &&
25b70 20 30 21 3d 66 74 73 35 47 65 74 55 31 36 28 26   0!=fts5GetU16(&
25b80 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 20 29 7b 0a  pLeaf->p[2]) ){.
25b90 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
25ba0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
25bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
25bc0 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
25bd0 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  f);.    }..    /
25be0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
25bf0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63  doclist-index, c
25c00 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f  heck that it loo
25c10 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ks right. */.   
25c20 20 69 66 28 20 69 74 65 72 2e 62 44 6c 69 64 78   if( iter.bDlidx
25c30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c   ){.      Fts5Dl
25c40 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
25c50 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65  = 0;  /* For ite
25c60 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64  rating through d
25c70 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a  oclist index */.
25c80 20 20 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c        int iPrevL
25c90 65 61 66 20 3d 20 69 74 65 72 2e 69 4c 65 61 66  eaf = iter.iLeaf
25ca0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
25cb0 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69  id = pSeg->iSegi
25cc0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67  d;.      int iPg
25cd0 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79  ;.      i64 iKey
25ce0 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c  ;..      for(pDl
25cf0 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
25d00 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67  rInit(p, 0, iSeg
25d10 69 64 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b  id, iter.iLeaf);
25d20 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
25d30 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
25d40 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
25d50 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
25d60 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78  erNext(p, pDlidx
25d70 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20  ).      ){..    
25d80 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79      /* Check any
25d90 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65   rowid-less page
25da0 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66  s that occur bef
25db0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
25dc0 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20  leaf. */.       
25dd0 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65   for(iPg=iPrevLe
25de0 61 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c  af+1; iPg<fts5Dl
25df0 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
25e00 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  dx); iPg++){.   
25e10 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
25e20 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
25e30 28 69 53 65 67 69 64 2c 20 30 2c 20 69 50 67 29  (iSegid, 0, iPg)
25e40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61  ;.          pLea
25e50 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
25e60 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20  (p, iKey);.     
25e70 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
25e80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
25e90 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  ( fts5GetU16(&pL
25ea0 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20  eaf->p[0])!=0 ) 
25eb0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
25ec0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
25ed0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
25ee0 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
25ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
25f00 20 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61          iPrevLea
25f10 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  f = fts5DlidxIte
25f20 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a  rPgno(pDlidx);..
25f30 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
25f40 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70   that the leaf p
25f50 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  age indicated by
25f60 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
25f70 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20  ally does.      
25f80 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65    ** contain the
25f90 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64   rowid suggested
25fa0 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f   by the same. */
25fb0 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
25fc0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
25fd0 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20 69 50  ID(iSegid, 0, iP
25fe0 72 65 76 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  revLeaf);.      
25ff0 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
26000 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b  taRead(p, iKey);
26010 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
26020 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
26030 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
26040 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
26050 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
26060 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a  (&pLeaf->p[0]);.
26070 20 20 20 20 20 20 20 20 20 20 66 74 73 35 47 65            fts5Ge
26080 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
26090 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75  p[iRowidOff], (u
260a0 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20  64*)&iRowid);.  
260b0 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
260c0 69 64 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65  id!=fts5DlidxIte
260d0 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
260e0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
260f0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
26100 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
26110 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
26120 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
26130 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
26140 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65  eaf+1; iPg<=(ite
26150 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e  r.iLeaf + iter.n
26160 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a  Empty); iPg++){.
26170 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
26180 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
26190 44 28 69 53 65 67 69 64 2c 20 30 2c 20 69 50 67  D(iSegid, 0, iPg
261a0 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66  );.        pLeaf
261b0 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
261c0 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20  p, iKey);.      
261d0 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
261e0 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
261f0 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
26200 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63  p[0])!=0 ) p->rc
26210 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
26220 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
26230 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
26240 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26250 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35     }..      fts5
26260 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44  DlidxIterFree(pD
26270 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73  lidx);.      fts
26280 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73  5TestDlidxRevers
26290 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69 74 65  e(p, iSegid, ite
262a0 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  r.iLeaf);.    }.
262b0 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69    }..  /* Page i
262c0 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e  ter.iLeaf must n
262d0 6f 77 20 62 65 20 74 68 65 20 72 69 67 68 74 6d  ow be the rightm
262e0 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69 6e  ost leaf-page in
262f0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a   the segment */.
26300 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
26310 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69  ITE_OK && iter.i
26320 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f  Leaf!=pSeg->pgno
26330 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72  Last ){.    p->r
26340 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
26350 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 74 72  ;.  }..  fts5Btr
26360 65 65 49 74 65 72 46 72 65 65 28 26 69 74 65 72  eeIterFree(&iter
26370 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  );.}.../*.** Run
26380 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
26390 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
263a0 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 61  the FTS index (a
263b0 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ) is internally 
263c0 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61  .** consistent a
263d0 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20  nd (b) contains 
263e0 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69 63  entries for whic
263f0 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65  h the XOR of the
26400 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73   checksums.** as
26410 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 66   calculated by f
26420 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
26430 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a  um() is cksum..*
26440 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
26450 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
26460 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  y of the interna
26470 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f  l checks fail, o
26480 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63  r if the.** chec
26490 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ksum does not ma
264a0 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  tch. Return SQLI
264b0 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65  TE_OK if all che
264c0 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74  cks pass without
264d0 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f  .** error, or so
264e0 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
264f0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
26500 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67  other error (e.g
26510 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73  . OOM).** occurs
26520 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26530 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
26540 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
26550 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29  x *p, u64 cksum)
26560 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  {.  u64 cksum2 =
26570 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26580 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
26590 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
265a0 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
265b0 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
265c0 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  list = {0,0,0}; 
265d0 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
265e0 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69   to hold a posli
265f0 73 74 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74  st */.  Fts5Mult
26600 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 3b  iSegIter *pIter;
26610 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
26620 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
26630 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20  gh entire index 
26640 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
26650 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
26660 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
26670 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20 20 2f 2a  ructure */..  /*
26680 20 55 73 65 64 20 62 79 20 65 78 74 72 61 20 69   Used by extra i
26690 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20 6f 6e  nternal tests on
266a0 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42 55 47  ly run if NDEBUG
266b0 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
266c0 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 33 20  */.  u64 cksum3 
266d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
266e0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
266f0 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e   based on conten
26700 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f  ts of indexes */
26710 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
26720 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  rm = {0,0,0};   
26730 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
26740 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72  d to hold most r
26750 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  ecent term */.  
26760 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46  .  /* Load the F
26770 54 53 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  TS index structu
26780 72 65 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20  re */.  pStruct 
26790 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
267a0 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68  ead(p);..  /* Ch
267b0 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74  eck that the int
267c0 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65  ernal nodes of e
267d0 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63  ach segment matc
267e0 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a  h the leaves */.
267f0 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
26800 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69  .    int iLvl, i
26810 53 65 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76  Seg;.    for(iLv
26820 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
26830 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
26840 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  +){.      for(iS
26850 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
26860 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
26870 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
26880 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75          Fts5Stru
26890 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
268a0 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
268b0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
268c0 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iSeg];.        
268d0 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
268e0 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70  tyCheckSegment(p
268f0 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d  , pSeg);.      }
26900 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26910 20 54 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d   The cksum argum
26920 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
26930 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
26940 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c   checksum calcul
26950 61 74 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20  ated.  ** based 
26960 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20  on all expected 
26970 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46  entries in the F
26980 54 53 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64  TS index (includ
26990 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64 65 78  ing prefix index
269a0 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20  .  ** entries). 
269b0 54 68 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b  This block check
269c0 73 20 74 68 61 74 20 61 20 63 68 65 63 6b 73 75  s that a checksu
269d0 6d 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  m calculated bas
269e0 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61  ed on the.  ** a
269f0 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f  ctual contents o
26a00 66 20 46 54 53 20 69 6e 64 65 78 20 69 73 20 69  f FTS index is i
26a10 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20  dentical..  **. 
26a20 20 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73   ** Two versions
26a30 20 6f 66 20 74 68 65 20 73 61 6d 65 20 63 68 65   of the same che
26a40 63 6b 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c  cksum are calcul
26a50 61 74 65 64 2e 20 54 68 65 20 66 69 72 73 74 20  ated. The first 
26a60 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69  (stack.  ** vari
26a70 61 62 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73  able cksum2) bas
26a80 65 64 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78  ed on entries ex
26a90 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
26aa0 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
26ab0 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e  .  ** while doin
26ac0 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  g a linear scan 
26ad0 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  of each individu
26ae0 61 6c 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e  al index in turn
26af0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20  . .  **.  ** As 
26b00 65 61 63 68 20 74 65 72 6d 20 76 69 73 69 74 65  each term visite
26b10 64 20 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20  d by the linear 
26b20 73 63 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74  scans, a separat
26b30 65 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a  e query for the.
26b40 20 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69    ** same term i
26b50 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73  s performed. cks
26b60 75 6d 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65  um3 is calculate
26b70 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65  d based on the e
26b80 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72  ntries.  ** extr
26b90 61 63 74 65 64 20 62 79 20 74 68 65 73 65 20 71  acted by these q
26ba0 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  ueries..  */.  f
26bb0 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72  or(fts5MultiIter
26bc0 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
26bd0 30 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  0, 0, 0, 0, -1, 
26be0 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  0, &pIter);.    
26bf0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
26c00 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
26c10 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
26c20 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
26c30 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
26c40 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c60 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e   Size of term in
26c70 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 36   bytes */.    i6
26c80 34 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20  4 iPos = 0;     
26c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
26ca0 69 74 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20  ition read from 
26cb0 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  poslist */.    i
26cc0 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20  nt iOff = 0;    
26cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
26ce0 66 73 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c  fset within posl
26cf0 69 73 74 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  ist */.    i64 i
26d00 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74  Rowid = fts5Mult
26d10 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
26d20 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  );.    char *z =
26d30 20 28 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74   (char*)fts5Mult
26d40 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c  iIterTerm(pIter,
26d50 20 26 6e 29 3b 0a 0a 20 20 20 20 70 6f 73 6c 69   &n);..    posli
26d60 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 66 74  st.n = 0;.    ft
26d70 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69  s5MultiIterPosli
26d80 73 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  st(p, pIter, 0, 
26d90 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 77  &poslist);.    w
26da0 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33  hile( 0==sqlite3
26db0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
26dc0 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73  4(poslist.p, pos
26dd0 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26  list.n, &iOff, &
26de0 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 69  iPos) ){.      i
26df0 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50  nt iCol = FTS5_P
26e00 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b  OS2COLUMN(iPos);
26e10 0a 20 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f  .      int iTokO
26e20 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46  ff = FTS5_POS2OF
26e30 46 53 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20  FSET(iPos);.    
26e40 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66 74 73 35    cksum2 ^= fts5
26e50 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
26e60 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54  iRowid, iCol, iT
26e70 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29  okOff, -1, z, n)
26e80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
26e90 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 65 77  If this is a new
26ea0 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f 72   term, query for
26eb0 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73 75   it. Update cksu
26ec0 6d 33 20 77 69 74 68 20 74 68 65 20 72 65 73 75  m3 with the resu
26ed0 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  lts. */.    fts5
26ee0 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72  TestTerm(p, &ter
26ef0 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c  m, z, n, cksum2,
26f00 20 26 63 6b 73 75 6d 33 29 3b 0a 20 20 7d 0a 20   &cksum3);.  }. 
26f10 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c   fts5TestTerm(p,
26f20 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63 6b   &term, 0, 0, ck
26f30 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a  sum2, &cksum3);.
26f40 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
26f50 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Free(p, pIter);.
26f60 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
26f70 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21  ITE_OK && cksum!
26f80 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
26f90 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
26fa0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
26fb0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
26fc0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
26fd0 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 66 74 73  ee(&term);.  fts
26fe0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 6f 73  5BufferFree(&pos
26ff0 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  list);.  return 
27000 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
27010 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61  p);.}.../*.** Ca
27020 6c 63 75 6c 61 74 65 20 61 6e 64 20 72 65 74 75  lculate and retu
27030 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 74 68  rn a checksum th
27040 61 74 20 69 73 20 74 68 65 20 58 4f 52 20 6f 66  at is the XOR of
27050 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
27060 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  .** checksum of 
27070 61 6c 6c 20 65 6e 74 72 69 65 73 20 74 68 61 74  all entries that
27080 20 77 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61   would be genera
27090 74 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e  ted by the token
270a0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
270b0 20 74 68 65 20 66 69 6e 61 6c 20 35 20 61 72 67   the final 5 arg
270c0 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73  uments..*/.u64 s
270d0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
270e0 6b 73 75 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66  ksum(.  Fts5Conf
270f0 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20  ig *pConfig,    
27100 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
27110 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20  guration object 
27120 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  */.  i64 iRowid,
27130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27140 20 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74       /* Document
27150 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e   term appears in
27160 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
27170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27180 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
27190 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
271a0 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271c0 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
271d0 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e   term appears in
271e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
271f0 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
27200 72 6d 20 20 20 20 2f 2a 20 54 65 72 6d 20 61 74  rm    /* Term at
27210 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36   iPos */.){.  u6
27220 34 20 72 65 74 20 3d 20 30 3b 20 20 20 20 20 20  4 ret = 0;      
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27240 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
27250 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20  .  int iIdx;    
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27270 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74     /* For iterat
27280 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ing through inde
27290 78 65 73 20 2a 2f 0a 0a 20 20 72 65 74 20 3d 20  xes */..  ret = 
272a0 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  fts5IndexEntryCk
272b0 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c  sum(iRowid, iCol
272c0 2c 20 69 50 6f 73 2c 20 30 2c 20 70 54 65 72 6d  , iPos, 0, pTerm
272d0 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 66 6f 72  , nTerm);..  for
272e0 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 70 43  (iIdx=0; iIdx<pC
272f0 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
27300 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  iIdx++){.    int
27310 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e 64   nByte = fts5Ind
27320 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c  exCharlenToBytel
27330 65 6e 28 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  en(pTerm, nTerm,
27340 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69   pConfig->aPrefi
27350 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66  x[iIdx]);.    if
27360 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
27370 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64 65   ret ^= fts5Inde
27380 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77  xEntryCksum(iRow
27390 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
273a0 69 49 64 78 2b 31 2c 20 70 54 65 72 6d 2c 20 6e  iIdx+1, pTerm, n
273b0 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Byte);.    }.  }
273c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ..  return ret;.
273d0 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
273e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
273f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
27420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27460 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f  ********.** Belo
27470 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  w this point is 
27480 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
27490 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64  on of the fts5_d
274a0 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a  ecode() scalar.*
274b0 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e  * function only.
274c0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  .*/../*.** Decod
274d0 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61  e a segment-data
274e0 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20   rowid from the 
274f0 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68  %_data table. Th
27500 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
27510 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f  * the opposite o
27520 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47  f macro FTS5_SEG
27530 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f  MENT_ROWID()..*/
27540 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
27550 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20  5DecodeRowid(.  
27560 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20  i64 iRowid,     
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27580 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f  /* Rowid from %_
27590 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
275a0 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20  int *piSegid,   
275b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275c0 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20  /* OUT: Segment 
275d0 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44  id */.  int *pbD
275e0 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  lidx,           
275f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
27600 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20  Dlidx flag */.  
27610 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20  int *piHeight,  
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27630 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a  /* OUT: Height *
27640 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20  /.  int *piPgno 
27650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27660 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65      /* OUT: Page
27670 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
27680 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28  *piPgno = (int)(
27690 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
276a0 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50  1 << FTS5_DATA_P
276b0 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  AGE_B) - 1));.  
276c0 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
276d0 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20  DATA_PAGE_B;..  
276e0 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74  *piHeight = (int
276f0 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
27700 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
27710 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29  _HEIGHT_B) - 1))
27720 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
27730 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
27740 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d  B;..  *pbDlidx =
27750 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
27760 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69  0x0001);.  iRowi
27770 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
27780 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67  DLI_B;..  *piSeg
27790 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  id = (int)(iRowi
277a0 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
277b0 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20  FTS5_DATA_ID_B) 
277c0 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  - 1));.}..static
277d0 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52   void fts5DebugR
277e0 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46  owid(int *pRc, F
277f0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
27800 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e   i64 iKey){.  in
27810 74 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  t iSegid, iHeigh
27820 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78  t, iPgno, bDlidx
27830 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
27840 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20   compenents */. 
27850 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
27860 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20  (iKey, &iSegid, 
27870 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68  &bDlidx, &iHeigh
27880 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69  t, &iPgno);..  i
27890 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a  f( iSegid==0 ){.
278a0 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54      if( iKey==FT
278b0 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
278c0 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
278d0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
278e0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
278f0 75 66 2c 20 22 28 61 76 65 72 61 67 65 73 29 20  uf, "(averages) 
27900 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
27910 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
27920 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
27930 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28  tf(pRc, pBuf, "(
27940 73 74 72 75 63 74 75 72 65 29 22 29 3b 0a 20 20  structure)");.  
27950 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a    }.  }.  else{.
27960 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
27970 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
27980 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28 25  f(pRc, pBuf, "(%
27990 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70  ssegid=%d h=%d p
279a0 67 6e 6f 3d 25 64 29 22 2c 0a 20 20 20 20 20 20  gno=%d)",.      
279b0 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64    bDlidx ? "dlid
279c0 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64  x " : "", iSegid
279d0 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f  , iHeight, iPgno
279e0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  .    );.  }.}..s
279f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
27a00 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a 20  ebugStructure(. 
27a10 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
27a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a30 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f   /* IN/OUT: erro
27a40 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
27a50 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20  Buffer *pBuf,.  
27a60 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
27a70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  .){.  int iLvl, 
27a80 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
27a90 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65        /* Iterate
27aa0 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c   through levels,
27ab0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20   segments */..  
27ac0 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
27ad0 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  <p->nLevel; iLvl
27ae0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  ++){.    Fts5Str
27af0 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
27b00 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69  l = &p->aLevel[i
27b10 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  Lvl];.    sqlite
27b20 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
27b30 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
27b40 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c  f, .        " {l
27b50 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 22  vl=%d nMerge=%d"
27b60 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d  , iLvl, pLvl->nM
27b70 65 72 67 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  erge.    );.    
27b80 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
27b90 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65  <pLvl->nSeg; iSe
27ba0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  g++){.      Fts5
27bb0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
27bc0 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
27bd0 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
27be0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
27bf0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
27c00 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20  pRc, pBuf, .    
27c10 20 20 20 20 20 20 22 20 7b 69 64 3d 25 64 20 68        " {id=%d h
27c20 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25  =%d leaves=%d..%
27c30 64 7d 22 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  d}", pSeg->iSegi
27c40 64 2c 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  d, pSeg->nHeight
27c50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  , .          pSe
27c60 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70 53  g->pgnoFirst, pS
27c70 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20  eg->pgnoLast.   
27c80 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
27c90 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
27ca0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
27cb0 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20  c, pBuf, "}");. 
27cc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
27cd0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
27ce0 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
27cf0 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a  bugging aid..**.
27d00 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c  ** Arguments pBl
27d10 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e  ob/nBlob contain
27d20 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46 74   a serialized Ft
27d30 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
27d40 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ct. This.** func
27d50 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68  tion appends a h
27d60 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65  uman-readable re
27d70 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
27d80 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a  the same object.
27d90 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ** to the buffer
27da0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
27db0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
27dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27dd0 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
27de0 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ure(.  int *pRc,
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
27e10 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : error code */.
27e20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
27e30 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  uf,.  const u8 *
27e40 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62  pBlob, int nBlob
27e50 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e70 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27e80 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53 74  code */.  Fts5St
27e90 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b 20  ructure *p = 0; 
27ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63            /* Dec
27eb0 6f 64 65 64 20 73 74 72 75 63 74 75 72 65 20 6f  oded structure o
27ec0 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d  bject */..  rc =
27ed0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
27ee0 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f  code(pBlob, nBlo
27ef0 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66 28  b, 0, &p);.  if(
27f00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27f10 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  {.    *pRc = rc;
27f20 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
27f30 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72  ..  fts5DebugStr
27f40 75 63 74 75 72 65 28 70 52 63 2c 20 70 42 75 66  ucture(pRc, pBuf
27f50 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  , p);.  fts5Stru
27f60 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 29 3b  ctureRelease(p);
27f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  .}../*.** Buffer
27f80 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65   (a/n) is assume
27f90 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c  d to contain a l
27fa0 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65  ist of serialize
27fb0 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a  d varints. Read.
27fc0 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20 61  ** each varint a
27fd0 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20 73 74  nd append its st
27fe0 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
27ff0 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42  ion to buffer pB
28000 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66  uf. Return.** af
28010 74 65 72 20 65 69 74 68 65 72 20 74 68 65 20 69  ter either the i
28020 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20 65  nput buffer is e
28030 78 68 61 75 73 74 65 64 20 6f 72 20 61 20 30 20  xhausted or a 0 
28040 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a  value is read..*
28050 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
28060 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
28070 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
28080 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
28090 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74   buffer..*/.stat
280a0 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64  ic int fts5Decod
280b0 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52  ePoslist(int *pR
280c0 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
280d0 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  Buf, const u8 *a
280e0 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
280f0 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  iOff = 0;.  whil
28100 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
28110 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69   int iVal;.    i
28120 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
28130 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
28140 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   iVal);.    sqli
28150 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
28160 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
28170 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c  Buf, " %d", iVal
28180 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
28190 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
281a0 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66  he start of buff
281b0 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e  er (a/n) contain
281c0 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
281d0 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f   doclist. The do
281e0 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20  clist.** may or 
281f0 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77  may not finish w
28200 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
28210 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
28220 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a  appends a text.*
28230 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  * representation
28240 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20   of the part of 
28250 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74  the doclist that
28260 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62   is present to b
28270 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a  uffer.** pBuf. .
28280 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
28290 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
282a0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
282b0 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
282c0 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
282d0 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
282e0 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70  deDoclist(int *p
282f0 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
28300 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
28310 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34  a, int n){.  i64
28320 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74 20 69   iDocid;.  int i
28330 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 4f 66 66  Off = 0;..  iOff
28340 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   = sqlite3Fts5Ge
28350 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
28360 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29  , (u64*)&iDocid)
28370 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  ;.  sqlite3Fts5B
28380 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
28390 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 72  f(pRc, pBuf, " r
283a0 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63  owid=%lld", iDoc
283b0 69 64 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f  id);.  while( iO
283c0 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
283d0 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44  nPos;.    int bD
283e0 75 6d 6d 79 3b 0a 20 20 20 20 69 4f 66 66 20 2b  ummy;.    iOff +
283f0 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
28400 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26  Size(&a[iOff], &
28410 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  nPos, &bDummy);.
28420 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
28430 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52  DecodePoslist(pR
28440 63 2c 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66  c, pBuf, &a[iOff
28450 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e  ], MIN(n-iOff, n
28460 50 6f 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69  Pos));.    if( i
28470 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69  Off<n ){.      i
28480 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
28490 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
284a0 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
284b0 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
284c0 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66  Delta);.      if
284d0 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65  ( iDelta==0 ) re
284e0 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20 20  turn iOff;.     
284f0 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74   iDocid += iDelt
28500 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
28510 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
28520 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
28530 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c  , " rowid=%lld",
28540 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a   iDocid);.    }.
28550 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f    }..  return iO
28560 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ff;.}../*.** The
28570 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28580 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
28590 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
285a0 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a  fts5_decode()..*
285b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
285c0 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
285d0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
285e0 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
285f0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
28600 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
28610 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
28640 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
28650 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
28660 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
28670 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
28680 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
28690 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72    /* Rowid for r
286c0 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f  ecord being deco
286d0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ded */.  int iSe
286e0 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e  gid,iHeight,iPgn
286f0 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69  o,bDlidx;/* Rowi
28700 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a  d components */.
28710 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f    const u8 *aBlo
28720 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  b; int n;       
28730 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64    /* Record to d
28740 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61  ecode */.  u8 *a
28750 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66   = 0;.  Fts5Buff
28760 65 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  er s;           
28770 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64          /* Build
28780 20 75 70 20 74 65 78 74 20 74 6f 20 72 65 74 75   up text to retu
28790 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  rn here */.  int
287a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
287c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
287d0 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b   int nSpace = 0;
287e0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ..  assert( nArg
287f0 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==2 );.  memset(
28800 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  &s, 0, sizeof(Ft
28810 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52  s5Buffer));.  iR
28820 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
28830 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c  alue_int64(apVal
28840 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  [0]);.  n = sqli
28850 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
28860 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c  apVal[1]);.  aBl
28870 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
28880 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d  ue_blob(apVal[1]
28890 29 3b 0a 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e  );..  nSpace = n
288a0 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52   + FTS5_DATA_ZER
288b0 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d  O_PADDING;.  a =
288c0 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73   (u8*)sqlite3Fts
288d0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
288e0 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
288f0 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f  a==0 ) goto deco
28900 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79  de_out;.  memcpy
28910 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 20  (a, aBlob, n);. 
28920 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
28930 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64  (iRowid, &iSegid
28940 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69  , &bDlidx, &iHei
28950 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
28960 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28   fts5DebugRowid(
28970 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29  &rc, &s, iRowid)
28980 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78 20 29  ;.  if( bDlidx )
28990 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 64  {.    Fts5Data d
289a0 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c  lidx;.    Fts5Dl
289b0 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20  idxLvl lvl;..   
289c0 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20   dlidx.p = a;.  
289d0 20 20 64 6c 69 64 78 2e 6e 20 3d 20 6e 3b 0a 0a    dlidx.n = n;..
289e0 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c      memset(&lvl,
289f0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
28a00 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c  lidxLvl));.    l
28a10 76 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69 64  vl.pData = &dlid
28a20 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66  x;.    lvl.iLeaf
28a30 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20  Pgno = iPgno;.. 
28a40 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78     for(fts5Dlidx
28a50 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c  LvlNext(&lvl); l
28a60 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35  vl.bEof==0; fts5
28a70 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76  DlidxLvlNext(&lv
28a80 6c 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l)){.      sqlit
28a90 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
28aa0 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73  ndPrintf(&rc, &s
28ab0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 25  , .          " %
28ac0 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c  d(%lld)", lvl.iL
28ad0 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f  eafPgno, lvl.iRo
28ae0 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  wid.      );.   
28af0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69   }.  }else if( i
28b00 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
28b10 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35  if( iRowid==FTS5
28b20 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
28b30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f  ){.      /* todo
28b40 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
28b50 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53       fts5DecodeS
28b60 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73  tructure(&rc, &s
28b70 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , a, n);.    }. 
28b80 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 46 74 73   }else{..    Fts
28b90 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20  5Buffer term;.  
28ba0 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
28bb0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
28bc0 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  ffer));..    if(
28bd0 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20   iHeight==0 ){. 
28be0 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66       int iTermOf
28bf0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  f = 0;.      int
28c00 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a   iRowidOff = 0;.
28c10 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
28c20 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20        int nKeep 
28c30 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
28c40 6e 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=4 ){.        
28c50 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
28c60 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20  GetU16(&a[0]);. 
28c70 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20         iTermOff 
28c80 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
28c90 32 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  2]);.      }else
28ca0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28cb0 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
28cc0 72 63 2c 20 26 73 2c 20 38 2c 20 28 63 6f 6e 73  rc, &s, 8, (cons
28cd0 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29  t u8*)"corrupt")
28ce0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  ;.        goto d
28cf0 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 20  ecode_out;.     
28d00 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52   }..      if( iR
28d10 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20  owidOff ){.     
28d20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64     iOff = iRowid
28d30 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
28d40 20 69 66 28 20 69 54 65 72 6d 4f 66 66 20 29 7b   if( iTermOff ){
28d50 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20  .        iOff = 
28d60 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20  iTermOff;.      
28d70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
28d80 4f 66 66 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Off = n;.      }
28d90 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
28da0 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73  ePoslist(&rc, &s
28db0 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29  , &a[4], iOff-4)
28dc0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
28dd0 20 69 52 6f 77 69 64 4f 66 66 3d 3d 30 20 7c 7c   iRowidOff==0 ||
28de0 20 69 4f 66 66 3d 3d 69 52 6f 77 69 64 4f 66 66   iOff==iRowidOff
28df0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52   );.      if( iR
28e00 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20  owidOff ){.     
28e10 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
28e20 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
28e30 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
28e40 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d  n-iOff);.      }
28e50 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
28e60 69 54 65 72 6d 4f 66 66 3d 3d 30 20 7c 7c 20 69  iTermOff==0 || i
28e70 4f 66 66 3d 3d 69 54 65 72 6d 4f 66 66 20 29 3b  Off==iTermOff );
28e80 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f  .      while( iO
28e90 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
28ea0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  int nByte;.     
28eb0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
28ec0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
28ed0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
28ee0 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65       term.n= nKe
28ef0 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ep;.        fts5
28f00 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
28f10 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79  (&rc, &term, nBy
28f20 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  te, &a[iOff]);. 
28f30 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
28f40 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20 73  Byte;..        s
28f50 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
28f60 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20  AppendPrintf(.  
28f70 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
28f80 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
28f90 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
28fa0 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
28fb0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
28fc0 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
28fd0 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
28fe0 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69  s, &a[iOff], n-i
28ff0 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
29000 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
29010 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
29020 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
29030 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
29040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29050 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  }.      fts5Buff
29060 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
29070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29080 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b  Fts5NodeIter ss;
29090 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73 35 4e  .      for(fts5N
290a0 6f 64 65 49 74 65 72 49 6e 69 74 28 61 2c 20 6e  odeIterInit(a, n
290b0 2c 20 26 73 73 29 3b 20 73 73 2e 61 44 61 74 61  , &ss); ss.aData
290c0 3b 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65  ; fts5NodeIterNe
290d0 78 74 28 26 72 63 2c 20 26 73 73 29 29 7b 0a 20  xt(&rc, &ss)){. 
290e0 20 20 20 20 20 20 20 69 66 28 20 73 73 2e 74 65         if( ss.te
290f0 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rm.n==0 ){.     
29100 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
29110 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
29120 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 6c 65  tf(&rc, &s, " le
29130 66 74 3d 25 64 22 2c 20 73 73 2e 69 43 68 69 6c  ft=%d", ss.iChil
29140 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
29150 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
29160 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
29170 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 26  pendPrintf(&rc,&
29180 73 2c 20 22 20 5c 22 25 2e 2a 73 5c 22 22 2c 20  s, " \"%.*s\"", 
29190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
291a0 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72  s.term.n, ss.ter
291b0 6d 2e 70 0a 20 20 20 20 20 20 20 20 20 20 29 3b  m.p.          );
291c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
291d0 20 20 20 69 66 28 20 73 73 2e 6e 45 6d 70 74 79     if( ss.nEmpty
291e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
291f0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
29200 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
29210 20 26 73 2c 20 22 20 65 6d 70 74 79 3d 25 64 25   &s, " empty=%d%
29220 73 22 2c 20 73 73 2e 6e 45 6d 70 74 79 2c 0a 20  s", ss.nEmpty,. 
29230 20 20 20 20 20 20 20 20 20 20 20 20 20 73 73 2e               ss.
29240 62 44 6c 69 64 78 20 3f 20 22 2a 22 20 3a 20 22  bDlidx ? "*" : "
29250 22 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ".          );. 
29260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29270 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49  .      fts5NodeI
29280 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20 20  terFree(&ss);.  
29290 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f    }.  }.  . deco
292a0 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  de_out:.  sqlite
292b0 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28  3_free(a);.  if(
292c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
292d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
292e0 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
292f0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70  (const char*)s.p
29300 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52  , s.n, SQLITE_TR
29310 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
29320 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
29330 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
29340 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a  (pCtx, rc);.  }.
29350 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
29360 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (&s);.}../*.** T
29370 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
29380 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  n of user-define
29390 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
293a0 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a  n fts5_rowid()..
293b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
293c0 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e  ts5RowidFunction
293d0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
293e0 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
293f0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
29400 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
29410 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29430 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
29440 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
29450 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
29460 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
29470 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
29480 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
29490 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
294a0 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d  rg;.  if( nArg==
294b0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
294c0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
294d0 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20  tx, "should be: 
294e0 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65  fts5_rowid(subje
294f0 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b  ct, ....)", -1);
29500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41  .  }else{.    zA
29510 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rg = (const char
29520 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
29530 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
29540 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
29550 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
29560 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20   "segment") ){. 
29570 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b       i64 iRowid;
29580 0a 20 20 20 20 20 20 69 6e 74 20 73 65 67 69 64  .      int segid
29590 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 3b 0a  , height, pgno;.
295a0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d        if( nArg!=
295b0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  4 ){.        sql
295c0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
295d0 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
295e0 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a       "should be:
295f0 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73 65 67   fts5_rowid('seg
29600 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c 20 68 65  ment', segid, he
29610 69 67 68 74 2c 20 70 67 6e 6f 29 29 22 2c 20 2d  ight, pgno))", -
29620 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  1.        );.   
29630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29640 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65    segid = sqlite
29650 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
29660 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 68  l[1]);.        h
29670 65 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 5f  eight = sqlite3_
29680 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
29690 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e  2]);.        pgn
296a0 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  o = sqlite3_valu
296b0 65 5f 69 6e 74 28 61 70 56 61 6c 5b 33 5d 29 3b  e_int(apVal[3]);
296c0 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20  .        iRowid 
296d0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
296e0 4f 57 49 44 28 73 65 67 69 64 2c 20 68 65 69 67  OWID(segid, heig
296f0 68 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ht, pgno);.     
29700 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
29710 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52  t_int64(pCtx, iR
29720 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  owid);.      }. 
29730 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20     }else {.     
29740 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
29750 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20  error(pCtx, .   
29760 20 20 20 20 20 22 66 69 72 73 74 20 61 72 67 20       "first arg 
29770 74 6f 20 66 74 73 35 5f 72 6f 77 69 64 28 29 20  to fts5_rowid() 
29780 6d 75 73 74 20 62 65 20 27 73 65 67 6d 65 6e 74  must be 'segment
29790 27 20 22 0a 20 20 20 20 20 20 20 20 22 6f 72 20  ' ".        "or 
297a0 27 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78 27  'start-of-index'
297b0 22 0a 20 20 20 20 20 20 20 20 2c 20 2d 31 0a 20  ".        , -1. 
297c0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
297d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
297e0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
297f0 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67  t of registering
29800 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65   the FTS5 module
29810 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a   with database.*
29820 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
29830 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65   It registers se
29840 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e  veral user-defin
29850 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
29860 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69  ons useful.** wi
29870 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49  th FTS5..**.** I
29880 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
29890 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
298a0 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
298b0 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74   occurs, some ot
298c0 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72  her.** SQLite er
298d0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
298e0 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  rned instead..*/
298f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
29900 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65  IndexInit(sqlite
29910 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
29920 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
29930 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20  e_function(.    
29940 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f    db, "fts5_deco
29950 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  de", 2, SQLITE_U
29960 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f  TF8, 0, fts5Deco
29970 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  deFunction, 0, 0
29980 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
29990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
299a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
299b0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
299c0 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35         db, "fts5
299d0 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c  _rowid", -1, SQL
299e0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
299f0 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20  5RowidFunction, 
29a00 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
29a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29a20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
29a30 5f 45 4e 41 42 4c 45 5f 46 54 53 35 20 2a 2f 0a  _ENABLE_FTS5 */.