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

Artifact 6a4fed2d64d7dbb0416c4278b23201f77daf94ea:


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 41 20 6c 69 73 74 20 6f 66 20 76 61 72     A list of var
1bb0: 69 6e 74 73 2e 20 49 66 20 74 68 65 20 66 69 72  ints. If the fir
1bc0: 73 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  st termless page
1bd0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1be0: 73 74 20 6f 6e 65 0a 2a 2a 20 20 20 64 6f 63 69  st one.**   doci
1bf0: 64 2c 20 74 68 65 20 6c 69 73 74 20 62 65 67 69  d, the list begi
1c00: 6e 73 20 77 69 74 68 20 74 68 61 74 20 64 6f 63  ns with that doc
1c10: 69 64 20 61 73 20 61 20 76 61 72 69 6e 74 20 66  id as a varint f
1c20: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 0a 2a  ollowed by the.*
1c30: 2a 20 20 20 76 61 6c 75 65 20 31 20 28 30 78 30  *   value 1 (0x0
1c40: 31 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 66  1). Or, if the f
1c50: 69 72 73 74 20 74 65 72 6d 6c 65 73 73 20 70 61  irst termless pa
1c60: 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  ge contains no d
1c70: 6f 63 69 64 73 2c 0a 2a 2a 20 20 20 61 20 76 61  ocids,.**   a va
1c80: 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rint containing 
1c90: 74 68 65 20 6c 61 73 74 20 64 6f 63 69 64 20 73  the last docid s
1ca0: 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 74 65 72  tored on the ter
1cb0: 6d 20 70 61 67 65 20 66 6f 6c 6c 6f 77 65 64 0a  m page followed.
1cc0: 2a 2a 20 20 20 62 79 20 61 20 30 20 28 30 78 30  **   by a 0 (0x0
1cd0: 30 29 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  0) value..**.** 
1ce0: 20 20 46 6f 72 20 65 61 63 68 20 73 75 62 73 65    For each subse
1cf0: 71 75 65 6e 74 20 70 61 67 65 20 69 6e 20 74 68  quent page in th
1d00: 65 20 64 6f 63 6c 69 73 74 2c 20 65 69 74 68 65  e doclist, eithe
1d10: 72 20 61 20 30 78 30 30 20 62 79 74 65 20 69 66  r a 0x00 byte if
1d20: 20 74 68 65 0a 2a 2a 20 20 20 70 61 67 65 20 63   the.**   page c
1d30: 6f 6e 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73  ontains no terms
1d40: 2c 20 6f 72 20 61 20 64 65 6c 74 61 2d 65 6e 63  , or a delta-enc
1d50: 6f 64 65 64 20 64 6f 63 69 64 20 28 61 6c 77 61  oded docid (alwa
1d60: 79 73 20 2b 76 65 29 20 0a 2a 2a 20 20 20 72 65  ys +ve) .**   re
1d70: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 66  presenting the f
1d80: 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20 74 68  irst docid on th
1d90: 65 20 70 61 67 65 20 6f 74 68 65 72 77 69 73 65  e page otherwise
1da0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69  ..*/../*.** Rowi
1db0: 64 73 20 66 6f 72 20 74 68 65 20 61 76 65 72 61  ds for the avera
1dc0: 67 65 73 20 61 6e 64 20 73 74 72 75 63 74 75 72  ges and structur
1dd0: 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
1de0: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
1df0: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 41  /.#define FTS5_A
1e00: 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 20 20  VERAGES_ROWID   
1e10: 20 20 31 20 20 20 20 2f 2a 20 52 6f 77 69 64 20    1    /* Rowid 
1e20: 75 73 65 64 20 66 6f 72 20 74 68 65 20 61 76 65  used for the ave
1e30: 72 61 67 65 73 20 72 65 63 6f 72 64 20 2a 2f 0a  rages record */.
1e40: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54 52  #define FTS5_STR
1e50: 55 43 54 55 52 45 5f 52 4f 57 49 44 20 20 20 31  UCTURE_ROWID   1
1e60: 30 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 75  0    /* The stru
1e70: 63 74 75 72 65 20 72 65 63 6f 72 64 20 2a 2f 0a  cture record */.
1e80: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 64 65  ./*.** Macros de
1e90: 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 72 6f  termining the ro
1ea0: 77 69 64 73 20 75 73 65 64 20 62 79 20 73 65 67  wids used by seg
1eb0: 6d 65 6e 74 20 6e 6f 64 65 73 2e 20 41 6c 6c 20  ment nodes. All 
1ec0: 6e 6f 64 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a 20  nodes in all.** 
1ed0: 73 65 67 6d 65 6e 74 73 20 66 6f 72 20 61 6c 6c  segments for all
1ee0: 20 69 6e 64 65 78 65 73 20 28 74 68 65 20 72 65   indexes (the re
1ef0: 67 75 6c 61 72 20 46 54 53 20 69 6e 64 65 78 20  gular FTS index 
1f00: 61 6e 64 20 61 6e 79 20 70 72 65 66 69 78 20 69  and any prefix i
1f10: 6e 64 65 78 65 73 29 0a 2a 2a 20 61 72 65 20 73  ndexes).** are s
1f20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f 64  tored in the %_d
1f30: 61 74 61 20 74 61 62 6c 65 20 77 69 74 68 20 6c  ata table with l
1f40: 61 72 67 65 20 70 6f 73 69 74 69 76 65 20 72 6f  arge positive ro
1f50: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wids..**.** The 
1f60: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 6d 61 79  %_data table may
1f70: 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20 28   contain up to (
1f80: 31 3c 3c 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  1<<FTS5_SEGMENT_
1f90: 49 4e 44 45 58 5f 42 49 54 53 29 20 0a 2a 2a 20  INDEX_BITS) .** 
1fa0: 69 6e 64 65 78 65 73 20 2d 20 6f 6e 65 20 72 65  indexes - one re
1fb0: 67 75 6c 61 72 20 74 65 72 6d 20 69 6e 64 65 78  gular term index
1fc0: 20 61 6e 64 20 7a 65 72 6f 20 6f 72 20 6d 6f 72   and zero or mor
1fd0: 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  e prefix indexes
1fe0: 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 73 65 67  ..**.** Each seg
1ff0: 6d 65 6e 74 20 69 6e 20 61 6e 20 69 6e 64 65 78  ment in an index
2000: 20 68 61 73 20 61 20 75 6e 69 71 75 65 20 69 64   has a unique id
2010: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
2020: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 6e  ro..**.** Each n
2030: 6f 64 65 20 69 6e 20 61 20 73 65 67 6d 65 6e 74  ode in a segment
2040: 20 62 2d 74 72 65 65 20 69 73 20 61 73 73 69 67   b-tree is assig
2050: 6e 65 64 20 61 20 22 70 61 67 65 20 6e 75 6d 62  ned a "page numb
2060: 65 72 22 20 74 68 61 74 20 69 73 20 75 6e 69 71  er" that is uniq
2070: 75 65 0a 2a 2a 20 77 69 74 68 69 6e 20 6e 6f 64  ue.** within nod
2080: 65 73 20 6f 66 20 69 74 73 20 68 65 69 67 68 74  es of its height
2090: 20 77 69 74 68 69 6e 20 74 68 65 20 73 65 67 6d   within the segm
20a0: 65 6e 74 20 28 6c 65 61 66 20 6e 6f 64 65 73 20  ent (leaf nodes 
20b0: 68 61 76 65 20 61 20 68 65 69 67 68 74 20 0a 2a  have a height .*
20c0: 2a 20 6f 66 20 30 2c 20 70 61 72 65 6e 74 73 20  * of 0, parents 
20d0: 31 2c 20 65 74 63 2e 29 2e 20 50 61 67 65 20 6e  1, etc.). Page n
20e0: 75 6d 62 65 72 73 20 61 72 65 20 61 6c 6c 6f 63  umbers are alloc
20f0: 61 74 65 64 20 73 65 71 75 65 6e 74 69 61 6c 6c  ated sequentiall
2100: 79 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 20 6e  y so that.** a n
2110: 6f 64 65 73 20 70 61 67 65 20 6e 75 6d 62 65 72  odes page number
2120: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6d   is always one m
2130: 6f 72 65 20 74 68 61 6e 20 69 74 73 20 6c 65 66  ore than its lef
2140: 74 20 73 69 62 6c 69 6e 67 2e 0a 2a 2a 0a 2a 2a  t sibling..**.**
2150: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61   The rowid for a
2160: 20 6e 6f 64 65 20 69 73 20 74 68 65 6e 20 66 6f   node is then fo
2170: 75 6e 64 20 75 73 69 6e 67 20 74 68 65 20 46 54  und using the FT
2180: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2190: 28 29 20 6d 61 63 72 6f 0a 2a 2a 20 62 65 6c 6f  () macro.** belo
21a0: 77 2e 20 54 68 65 20 46 54 53 35 5f 53 45 47 4d  w. The FTS5_SEGM
21b0: 45 4e 54 5f 2a 5f 42 49 54 53 20 6d 61 63 72 6f  ENT_*_BITS macro
21c0: 73 20 64 65 66 69 6e 65 20 74 68 65 20 6e 75 6d  s define the num
21d0: 62 65 72 20 6f 66 20 62 69 74 73 20 75 73 65 64  ber of bits used
21e0: 0a 2a 2a 20 74 6f 20 65 6e 63 6f 64 65 20 74 68  .** to encode th
21f0: 65 20 74 68 72 65 65 20 46 54 53 35 5f 53 45 47  e three FTS5_SEG
2200: 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 61 72 67  MENT_ROWID() arg
2210: 75 6d 65 6e 74 73 2e 20 54 68 69 73 20 6d 6f 64  uments. This mod
2220: 75 6c 65 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53  ule returns.** S
2230: 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 66  QLITE_FULL and f
2240: 61 69 6c 73 20 74 68 65 20 63 75 72 72 65 6e 74  ails the current
2250: 20 6f 70 65 72 61 74 69 6f 6e 20 69 66 20 74 68   operation if th
2260: 65 79 20 65 76 65 72 20 70 72 6f 76 65 20 74 6f  ey ever prove to
2270: 6f 20 73 6d 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  o small..*/.#def
2280: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 49 44  ine FTS5_DATA_ID
2290: 5f 42 20 20 20 20 20 31 36 20 20 20 20 20 2f 2a  _B     16     /*
22a0: 20 4d 61 78 20 73 65 67 20 69 64 20 6e 75 6d 62   Max seg id numb
22b0: 65 72 20 36 35 35 33 35 20 2a 2f 0a 23 64 65 66  er 65535 */.#def
22c0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
22d0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
22e0: 20 4d 61 78 20 62 2d 74 72 65 65 20 68 65 69 67   Max b-tree heig
22f0: 68 74 20 6f 66 20 33 32 20 2a 2f 0a 23 64 65 66  ht of 32 */.#def
2300: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 50 41  ine FTS5_DATA_PA
2310: 47 45 5f 42 20 20 20 33 31 20 20 20 20 20 2f 2a  GE_B   31     /*
2320: 20 4d 61 78 20 70 61 67 65 20 6e 75 6d 62 65 72   Max page number
2330: 20 6f 66 20 32 31 34 37 34 38 33 36 34 38 20 2a   of 2147483648 *
2340: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  /..#define FTS5_
2350: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65  SEGMENT_ROWID(se
2360: 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e  gid, height, pgn
2370: 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20 20  o) (            
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2390: 28 28 69 36 34 29 28 73 65 67 69 64 29 20 20 3c  ((i64)(segid)  <
23a0: 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 50 41 47  < (FTS5_DATA_PAG
23b0: 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  E_B + FTS5_DATA_
23c0: 48 45 49 47 48 54 5f 42 29 29 20 2b 20 20 20 20  HEIGHT_B)) +    
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23e0: 20 28 28 69 36 34 29 28 68 65 69 67 68 74 29 20   ((i64)(height) 
23f0: 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 50 41  << (FTS5_DATA_PA
2400: 47 45 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20  GE_B)) +        
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2430: 0a 20 28 28 69 36 34 29 28 70 67 6e 6f 29 29 20  . ((i64)(pgno)) 
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68  \.)../*.** The h
2490: 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e 74  eight of segment
24a0: 20 62 2d 74 72 65 65 73 20 69 73 20 61 63 74 75   b-trees is actu
24b0: 61 6c 6c 79 20 6c 69 6d 69 74 65 64 20 74 6f 20  ally limited to 
24c0: 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a  one less than .*
24d0: 2a 20 28 31 3c 3c 48 45 49 47 48 54 5f 42 49 54  * (1<<HEIGHT_BIT
24e0: 53 29 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  S). This is beca
24f0: 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 61 64  use the rowid ad
2500: 64 72 65 73 73 20 73 70 61 63 65 20 66 6f 72 20  dress space for 
2510: 6e 6f 64 65 73 0a 2a 2a 20 77 69 74 68 20 73 75  nodes.** with su
2520: 63 68 20 61 20 68 65 69 67 68 74 20 69 73 20 75  ch a height is u
2530: 73 65 64 20 62 79 20 64 6f 63 6c 69 73 74 20 69  sed by doclist i
2540: 6e 64 65 78 65 73 2e 0a 2a 2f 0a 23 64 65 66 69  ndexes..*/.#defi
2550: 6e 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ne FTS5_SEGMENT_
2560: 4d 41 58 5f 48 45 49 47 48 54 20 28 28 31 20 3c  MAX_HEIGHT ((1 <
2570: 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  < FTS5_DATA_HEIG
2580: 48 54 5f 42 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a 20  HT_B)-1)../*.** 
2590: 4d 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73  Maximum segments
25a0: 20 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20   permitted in a 
25b0: 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f  single index .*/
25c0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41  .#define FTS5_MA
25d0: 58 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a  X_SEGMENT 2000..
25e0: 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  /*.** The rowid 
25f0: 66 6f 72 20 74 68 65 20 64 6f 63 6c 69 73 74 20  for the doclist 
2600: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
2610: 20 77 69 74 68 20 6c 65 61 66 20 70 61 67 65 20   with leaf page 
2620: 70 67 6e 6f 20 6f 66 20 73 65 67 6d 65 6e 74 0a  pgno of segment.
2630: 2a 2a 20 73 65 67 69 64 20 69 6e 20 69 6e 64 65  ** segid in inde
2640: 78 20 69 64 78 2e 0a 2a 2f 0a 23 64 65 66 69 6e  x idx..*/.#defin
2650: 65 20 46 54 53 35 5f 44 4f 43 4c 49 53 54 5f 49  e FTS5_DOCLIST_I
2660: 44 58 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20  DX_ROWID(segid, 
2670: 70 67 6e 6f 29 20 5c 0a 20 20 20 20 20 20 20 20  pgno) \.        
2680: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
2690: 49 44 28 73 65 67 69 64 2c 20 46 54 53 35 5f 53  ID(segid, FTS5_S
26a0: 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48  EGMENT_MAX_HEIGH
26b0: 54 2c 20 70 67 6e 6f 29 0a 0a 23 69 66 64 65 66  T, pgno)..#ifdef
26c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
26d0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 72  t sqlite3Fts5Cor
26e0: 72 75 70 74 28 29 20 7b 20 72 65 74 75 72 6e 20  rupt() { return 
26f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
2700: 54 41 42 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  TAB; }.#endif...
2710: 2f 2a 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65 20  /*.** Each time 
2720: 61 20 62 6c 6f 62 20 69 73 20 72 65 61 64 20 66  a blob is read f
2730: 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
2740: 61 62 6c 65 2c 20 69 74 20 69 73 20 70 61 64 64  able, it is padd
2750: 65 64 20 77 69 74 68 20 74 68 69 73 0a 2a 2a 20  ed with this.** 
2760: 6d 61 6e 79 20 7a 65 72 6f 20 62 79 74 65 73 2e  many zero bytes.
2770: 20 54 68 69 73 20 6d 61 6b 65 73 20 69 74 20 65   This makes it e
2780: 61 73 69 65 72 20 74 6f 20 64 65 63 6f 64 65 20  asier to decode 
2790: 74 68 65 20 76 61 72 69 6f 75 73 20 72 65 63 6f  the various reco
27a0: 72 64 20 66 6f 72 6d 61 74 73 0a 2a 2a 20 77 69  rd formats.** wi
27b0: 74 68 6f 75 74 20 6f 76 65 72 72 65 61 64 69 6e  thout overreadin
27c0: 67 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 73  g if the records
27d0: 20 61 72 65 20 63 6f 72 72 75 70 74 2e 0a 2a 2f   are corrupt..*/
27e0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41  .#define FTS5_DA
27f0: 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20  TA_ZERO_PADDING 
2800: 38 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  8..typedef struc
2810: 74 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20  t Fts5BtreeIter 
2820: 46 74 73 35 42 74 72 65 65 49 74 65 72 3b 0a 74  Fts5BtreeIter;.t
2830: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2840: 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
2850: 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65   Fts5BtreeIterLe
2860: 76 65 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72  vel;.typedef str
2870: 75 63 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65  uct Fts5ChunkIte
2880: 72 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 3b  r Fts5ChunkIter;
2890: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
28a0: 46 74 73 35 44 61 74 61 20 46 74 73 35 44 61 74  Fts5Data Fts5Dat
28b0: 61 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  a;.typedef struc
28c0: 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t Fts5DlidxIter 
28d0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 3b 0a 74  Fts5DlidxIter;.t
28e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
28f0: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 46  s5MultiSegIter F
2900: 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 3b  ts5MultiSegIter;
2910: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2920: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 46 74 73  Fts5NodeIter Fts
2930: 35 4e 6f 64 65 49 74 65 72 3b 0a 74 79 70 65 64  5NodeIter;.typed
2940: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50 61  ef struct Fts5Pa
2950: 67 65 57 72 69 74 65 72 20 46 74 73 35 50 61 67  geWriter Fts5Pag
2960: 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66  eWriter;.typedef
2970: 20 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 49   struct Fts5PosI
2980: 74 65 72 20 46 74 73 35 50 6f 73 49 74 65 72 3b  ter Fts5PosIter;
2990: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
29a0: 46 74 73 35 53 65 67 49 74 65 72 20 46 74 73 35  Fts5SegIter Fts5
29b0: 53 65 67 49 74 65 72 3b 0a 74 79 70 65 64 65 66  SegIter;.typedef
29c0: 20 73 74 72 75 63 74 20 46 74 73 35 44 6f 63 6c   struct Fts5Docl
29d0: 69 73 74 49 74 65 72 20 46 74 73 35 44 6f 63 6c  istIter Fts5Docl
29e0: 69 73 74 49 74 65 72 3b 0a 74 79 70 65 64 65 66  istIter;.typedef
29f0: 20 73 74 72 75 63 74 20 46 74 73 35 53 65 67 57   struct Fts5SegW
2a00: 72 69 74 65 72 20 46 74 73 35 53 65 67 57 72 69  riter Fts5SegWri
2a10: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2a20: 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72  uct Fts5Structur
2a30: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 3b  e Fts5Structure;
2a40: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2a50: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
2a60: 65 6c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  el Fts5Structure
2a70: 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66 20 73  Level;.typedef s
2a80: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2a90: 75 72 65 53 65 67 6d 65 6e 74 20 46 74 73 35 53  ureSegment Fts5S
2aa0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 3b  tructureSegment;
2ab0: 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 61 74  ..struct Fts5Dat
2ac0: 61 20 7b 0a 20 20 75 38 20 2a 70 3b 20 20 20 20  a {.  u8 *p;    
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2af0: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
2b00: 69 6e 69 6e 67 20 72 65 63 6f 72 64 20 2a 2f 0a  ining record */.
2b10: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
2b40: 6f 72 64 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ord in bytes */.
2b50: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 2f 2a 20 52 65 66 20 63 6f 75 6e 74 20 2a    /* Ref count *
2b80: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2b90: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2ba0: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2bb0: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2bc0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2bd0: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2be0: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2bf0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2c00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2c10: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2c20: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2c30: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
2c40: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
2c70: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
2c80: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2c90: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2ca0: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2cb0: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2cc0: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2cd0: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2ce0: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2cf0: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2d00: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2d10: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2d20: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d40: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
2d50: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
2d60: 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69  .  int nMaxPendi
2d70: 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  ngData;         
2d80: 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e     /* Max pendin
2d90: 67 20 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c  g data before fl
2da0: 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ush to disk */. 
2db0: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74   int nPendingDat
2dc0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2dd0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2de0: 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74  s of pending dat
2df0: 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74  a */.  i64 iWrit
2e00: 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  eRowid;         
2e10: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2e20: 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20  for current doc 
2e30: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
2e40: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 73 63  .  Fts5Buffer sc
2e50: 72 61 74 63 68 3b 0a 0a 20 20 2f 2a 20 45 72 72  ratch;..  /* Err
2e60: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
2e70: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e90: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2ea0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2eb0: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2ec0: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2ed0: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2ee0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2ef0: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2f00: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2f10: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2f20: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2f30: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2f40: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2f50: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2f60: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2f70: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2f80: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2f90: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2fa0: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2fb0: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2fc0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2ff0: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
3000: 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74  */.};..struct Ft
3010: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a  s5DoclistIter {.
3020: 20 20 69 6e 74 20 62 44 65 73 63 3b 20 20 20 20    int bDesc;    
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 44 45    /* True for DE
3050: 53 43 20 6f 72 64 65 72 2c 20 66 61 6c 73 65 20  SC order, false 
3060: 66 6f 72 20 41 53 43 20 2a 2f 0a 20 20 75 38 20  for ASC */.  u8 
3070: 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  *a;.  int n;.  i
3080: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  nt i;..  /* Outp
3090: 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20 61 50  ut variables. aP
30a0: 6f 73 6c 69 73 74 3d 3d 30 20 61 74 20 45 4f 46  oslist==0 at EOF
30b0: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64   */.  i64 iRowid
30c0: 3b 0a 20 20 75 38 20 2a 61 50 6f 73 6c 69 73 74  ;.  u8 *aPoslist
30d0: 3b 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74  ;.  int nPoslist
30e0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.};../*.** Each
30f0: 20 69 74 65 72 61 74 6f 72 20 75 73 65 64 20 62   iterator used b
3100: 79 20 65 78 74 65 72 6e 61 6c 20 6d 6f 64 75 6c  y external modul
3110: 65 73 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  es is an instanc
3120: 65 20 6f 66 20 74 68 69 73 20 74 79 70 65 2e 0a  e of this type..
3130: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e  */.struct Fts5In
3140: 64 65 78 49 74 65 72 20 7b 0a 20 20 46 74 73 35  dexIter {.  Fts5
3150: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
3160: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
3170: 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 4d  pStruct;.  Fts5M
3180: 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75  ultiSegIter *pMu
3190: 6c 74 69 3b 0a 20 20 46 74 73 35 44 6f 63 6c 69  lti;.  Fts5Docli
31a0: 73 74 49 74 65 72 20 2a 70 44 6f 63 6c 69 73 74  stIter *pDoclist
31b0: 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70  ;.  Fts5Buffer p
31c0: 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oslist;         
31d0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
31e0: 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e 74  ntaining current
31f0: 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a   poslist */.};..
3200: 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  /*.** The conten
3210: 74 73 20 6f 66 20 74 68 65 20 22 73 74 72 75 63  ts of the "struc
3220: 74 75 72 65 22 20 72 65 63 6f 72 64 20 66 6f 72  ture" record for
3230: 20 65 61 63 68 20 69 6e 64 65 78 20 61 72 65 20   each index are 
3240: 72 65 70 72 65 73 65 6e 74 65 64 0a 2a 2a 20 75  represented.** u
3250: 73 69 6e 67 20 61 6e 20 46 74 73 35 53 74 72 75  sing an Fts5Stru
3260: 63 74 75 72 65 20 72 65 63 6f 72 64 20 69 6e 20  cture record in 
3270: 6d 65 6d 6f 72 79 2e 20 57 68 69 63 68 20 75 73  memory. Which us
3280: 65 73 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  es instances of 
3290: 74 68 65 20 0a 2a 2a 20 6f 74 68 65 72 20 46 74  the .** other Ft
32a0: 73 35 53 74 72 75 63 74 75 72 65 58 58 58 20 74  s5StructureXXX t
32b0: 79 70 65 73 20 61 73 20 63 6f 6d 70 6f 6e 65 6e  ypes as componen
32c0: 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  ts..*/.struct Ft
32d0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
32e0: 6e 74 20 7b 0a 20 20 69 6e 74 20 69 53 65 67 69  nt {.  int iSegi
32f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3300: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
3310: 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  t id */.  int nH
3320: 65 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  eight;          
3330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69            /* Hei
3340: 67 68 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62  ght of segment b
3350: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 70  -tree */.  int p
3360: 67 6e 6f 46 69 72 73 74 3b 20 20 20 20 20 20 20  gnoFirst;       
3370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3380: 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  rst leaf page nu
3390: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
33a0: 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73  */.  int pgnoLas
33b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
33c0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61       /* Last lea
33d0: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  f page number in
33e0: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 73   segment */.};.s
33f0: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
3400: 75 72 65 4c 65 76 65 6c 20 7b 0a 20 20 69 6e 74  ureLevel {.  int
3410: 20 6e 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20   nMerge;        
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3430: 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
3440: 74 73 20 69 6e 20 69 6e 63 72 2d 6d 65 72 67 65  ts in incr-merge
3450: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20   */.  int nSeg; 
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
3480: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
3490: 73 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  s on level */.  
34a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
34b0: 6d 65 6e 74 20 2a 61 53 65 67 3b 20 20 20 20 20  ment *aSeg;     
34c0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
34d0: 65 6e 74 73 2e 20 61 53 65 67 5b 30 5d 20 69 73  ents. aSeg[0] is
34e0: 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d 3b 0a 73   oldest. */.};.s
34f0: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
3500: 75 72 65 20 7b 0a 20 20 75 36 34 20 6e 57 72 69  ure {.  u64 nWri
3510: 74 65 43 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  teCounter;      
3520: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3530: 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
3540: 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f 0a 20 20  to level 0 */.  
3550: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20 20 20  int nSegment;   
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 54 6f 74 61 6c 20 73 65 67 6d 65 6e 74  /* Total segment
3580: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
3590: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  ure */.  int nLe
35a0: 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
35b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
35c0: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 69 6e 20  er of levels in 
35d0: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
35e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
35f0: 65 6c 20 61 4c 65 76 65 6c 5b 30 5d 3b 20 20 20  el aLevel[0];   
3600: 2f 2a 20 41 72 72 61 79 20 6f 66 20 6e 4c 65 76  /* Array of nLev
3610: 65 6c 20 6c 65 76 65 6c 20 6f 62 6a 65 63 74 73  el level objects
3620: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
3630: 20 6f 62 6a 65 63 74 20 6f 66 20 74 79 70 65 20   object of type 
3640: 46 74 73 35 53 65 67 57 72 69 74 65 72 20 69 73  Fts5SegWriter is
3650: 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 74   used to write t
3660: 6f 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  o segments..*/.s
3670: 74 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72  truct Fts5PageWr
3680: 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 70 67 6e  iter {.  int pgn
3690: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
36a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
36b0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
36c0: 20 70 61 67 65 20 2a 2f 0a 20 20 46 74 73 35 42   page */.  Fts5B
36d0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
36f0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3700: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 46  page data */.  F
3710: 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3730: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3740: 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72  ing previous ter
3750: 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a  m on page */.};.
3760: 73 74 72 75 63 74 20 46 74 73 35 53 65 67 57 72  struct Fts5SegWr
3770: 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 69 53 65  iter {.  int iSe
3780: 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  gid;            
3790: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 69           /* Segi
37a0: 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  d to write to */
37b0: 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 72 3b 20  .  int nWriter; 
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
37e0: 65 6e 74 72 69 65 73 20 69 6e 20 61 57 72 69 74  entries in aWrit
37f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65  er */.  Fts5Page
3800: 57 72 69 74 65 72 20 2a 61 57 72 69 74 65 72 3b  Writer *aWriter;
3810: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
3820: 20 6f 66 20 50 61 67 65 57 72 69 74 65 72 20 6f   of PageWriter o
3830: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 36 34 20  bjects */.  i64 
3840: 69 50 72 65 76 52 6f 77 69 64 3b 20 20 20 20 20  iPrevRowid;     
3850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3860: 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 77 72  revious docid wr
3870: 69 74 74 65 6e 20 74 6f 20 63 75 72 72 65 6e 74  itten to current
3880: 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38 20 62 46   leaf */.  u8 bF
3890: 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
38a0: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  st;        /* Tr
38b0: 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69 64  ue if next rowid
38c0: 20 69 73 20 66 69 72 73 74 20 69 6e 20 64 6f 63   is first in doc
38d0: 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62 46 69  list */.  u8 bFi
38e0: 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3b 20  rstRowidInPage; 
38f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3900: 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69 64 20  e if next rowid 
3910: 69 73 20 66 69 72 73 74 20 69 6e 20 70 61 67 65  is first in page
3920: 20 2a 2f 0a 20 20 75 38 20 62 46 69 72 73 74 54   */.  u8 bFirstT
3930: 65 72 6d 49 6e 50 61 67 65 3b 20 20 20 20 20 20  ermInPage;      
3940: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3950: 20 6e 65 78 74 20 74 65 72 6d 20 77 69 6c 6c 20   next term will 
3960: 62 65 20 66 69 72 73 74 20 69 6e 20 6c 65 61 66  be first in leaf
3970: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 57   */.  int nLeafW
3980: 72 69 74 74 65 6e 3b 20 20 20 20 20 20 20 20 20  ritten;         
3990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
39a0: 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 77 72  of leaf pages wr
39b0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  itten */.  int n
39c0: 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20 20  Empty;          
39d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
39e0: 6d 62 65 72 20 6f 66 20 63 6f 6e 74 69 67 75 6f  mber of contiguo
39f0: 75 73 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64  us term-less nod
3a00: 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  es */.  Fts5Buff
3a10: 65 72 20 63 64 6c 69 64 78 3b 20 20 20 20 20 20  er cdlidx;      
3a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
3a30: 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ist index */.  i
3a40: 36 34 20 69 44 6c 69 64 78 50 72 65 76 3b 20 20  64 iDlidxPrev;  
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a60: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64  * Previous rowid
3a70: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 64 6c 69   appended to dli
3a80: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 44 6c 69  dx */.  int bDli
3a90: 64 78 50 72 65 76 56 61 6c 69 64 3b 20 20 20 20  dxPrevValid;    
3aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3ab0: 69 66 20 69 44 6c 69 64 78 50 72 65 76 20 69 73  if iDlidxPrev is
3ac0: 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   valid */.};../*
3ad0: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
3ae0: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
3af0: 20 74 68 65 20 6d 65 72 67 65 64 20 72 65 73 75   the merged resu
3b00: 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f  lts of one or mo
3b10: 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20  re segments,.** 
3b20: 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65  visiting each te
3b30: 72 6d 2f 64 6f 63 69 64 20 70 61 69 72 20 69 6e  rm/docid pair in
3b40: 20 74 68 65 20 6d 65 72 67 65 64 20 64 61 74 61   the merged data
3b50: 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20  ..**.** nSeg is 
3b60: 61 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20 6f  always a power o
3b70: 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68  f two greater th
3b80: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
3b90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3ba0: 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74 68  segments that th
3bb0: 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65 72  is object is mer
3bc0: 67 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e 20  ging data from. 
3bd0: 42 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d 20  Both the aSeg[] 
3be0: 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20  and.** aFirst[] 
3bf0: 61 72 72 61 79 73 20 61 72 65 20 73 69 7a 65 64  arrays are sized
3c00: 20 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65 73   at nSeg entries
3c10: 2e 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72 72  . The aSeg[] arr
3c20: 61 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a 20  ay is padded.** 
3c30: 77 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65  with zeroed obje
3c40: 63 74 73 20 2d 20 74 68 65 73 65 20 61 72 65 20  cts - these are 
3c50: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74 68  handled as if th
3c60: 65 79 20 77 65 72 65 20 69 74 65 72 61 74 6f 72  ey were iterator
3c70: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65  s opened.** on e
3c80: 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  mpty segments..*
3c90: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
3ca0: 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73 65   of comparing se
3cb0: 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61  gments aSeg[N] a
3cc0: 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68  nd aSeg[N+1], wh
3cd0: 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65  ere N is an.** e
3ce0: 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20 73  ven number, is s
3cf0: 74 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74 5b  tored in aFirst[
3d00: 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65  (nSeg+N)/2]. The
3d10: 20 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68 65   "result" of the
3d20: 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20   .** comparison 
3d30: 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20  in this context 
3d40: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
3d50: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61  the iterator tha
3d60: 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
3d70: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61  oints to the sma
3d80: 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64 20  ller term/rowid 
3d90: 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65  combination. Ite
3da0: 72 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61 72  rators at EOF ar
3db0: 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  e.** considered 
3dc0: 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68  to be greater th
3dd0: 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74 65  an all other ite
3de0: 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46  rators..**.** aF
3df0: 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73  irst[1] contains
3e00: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61 53   the index in aS
3e10: 65 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65 72  eg[] of the iter
3e20: 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ator that points
3e30: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c   to.** the small
3e40: 65 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e  est key overall.
3e50: 20 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75 6e   aFirst[0] is un
3e60: 75 73 65 64 2e 20 0a 2a 2f 0a 0a 74 79 70 65 64  used. .*/..typed
3e70: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43 52  ef struct Fts5CR
3e80: 65 73 75 6c 74 20 46 74 73 35 43 52 65 73 75 6c  esult Fts5CResul
3e90: 74 3b 0a 73 74 72 75 63 74 20 46 74 73 35 43 52  t;.struct Fts5CR
3ea0: 65 73 75 6c 74 20 7b 0a 20 20 75 31 36 20 69 46  esult {.  u16 iF
3eb0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
3ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 65            /* aSe
3ed0: 67 5b 5d 20 69 6e 64 65 78 20 6f 66 20 66 69 72  g[] index of fir
3ee0: 73 74 65 73 74 20 69 74 65 72 61 74 6f 72 20 2a  stest iterator *
3ef0: 2f 0a 20 20 75 38 20 62 54 65 72 6d 45 71 3b 20  /.  u8 bTermEq; 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3f20: 68 65 20 74 65 72 6d 73 20 61 72 65 20 65 71 75  he terms are equ
3f30: 61 6c 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  al */.};..struct
3f40: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
3f50: 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20  r {.  int nSeg; 
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
3f80: 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f   aSeg[] array */
3f90: 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fb0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74     /* True to it
3fc0: 65 72 61 74 65 20 69 6e 20 72 65 76 65 72 73 65  erate in reverse
3fd0: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20   order */.  int 
3fe0: 62 53 6b 69 70 45 6d 70 74 79 3b 20 20 20 20 20  bSkipEmpty;     
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4000: 72 75 65 20 74 6f 20 73 6b 69 70 20 64 65 6c 65  rue to skip dele
4010: 74 65 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20  ted entries */. 
4020: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 61 53   Fts5SegIter *aS
4030: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
4040: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67   /* Array of seg
4050: 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a  ment iterators *
4060: 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  /.  Fts5CResult 
4070: 2a 61 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *aFirst;        
4080: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d      /* Current m
4090: 65 72 67 65 20 73 74 61 74 65 20 28 73 65 65 20  erge state (see 
40a0: 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  above) */.};../*
40b0: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
40c0: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
40d0: 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
40e0: 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63 68  t, visiting each
40f0: 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a 20 70   term/docid.** p
4100: 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d 65  air in the segme
4110: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a  nt..**.** pSeg:.
4120: 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e 74  **   The segment
4130: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
4140: 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ugh..**.** iLeaf
4150: 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65  Pgno:.**   Curre
4160: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4170: 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d 65  ber within segme
4180: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f  nt..**.** iLeafO
4190: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65  ffset:.**   Byte
41a0: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74   offset within t
41b0: 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
41c0: 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72 73  that is the firs
41d0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
41e0: 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  *   position lis
41f0: 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74 65  t data (one byte
4200: 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73 69   passed the posi
4210: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
4220: 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77 69  ield)..**   rowi
4230: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  d field of the c
4240: 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73  urrent entry. Us
4250: 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68  ually this is th
4260: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e size field of 
4270: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
4280: 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65  n list data. The
4290: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
42a0: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
42b0: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
42c0: 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61   .**   is the la
42d0: 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20  st thing on the 
42e0: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
42f0: 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66   pLeaf:.**   Buf
4300: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
4310: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
4320: 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55   data. Set to NU
4330: 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  LL at EOF..**.**
4340: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20   iTermLeafPgno, 
4350: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a  iTermLeafOffset:
4360: 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20  .**   Leaf page 
4370: 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e  number containin
4380: 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  g the last term 
4390: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65  read from the se
43a0: 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20  gment. And.**   
43b0: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
43c0: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
43d0: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a   the term data..
43e0: 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20  **.** flags:.** 
43f0: 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53    Mask of FTS5_S
4400: 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65  EGITER_XXX value
4410: 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61  s. Interpreted a
4420: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
4430: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
4440: 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20  ONETERM:.**     
4450: 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  If set, set the 
4460: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
4470: 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74  t to EOF after t
4480: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
4490: 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  st .**     has b
44a0: 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44  een exhausted. D
44b0: 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f  o not proceed to
44c0: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69   the next term i
44d0: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
44e0: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
44f0: 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20  TER_REVERSE:.** 
4500: 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73      This flag is
4510: 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69   only ever set i
4520: 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  f FTS5_SEGITER_O
4530: 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73  NETERM is also s
4540: 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74  et. If.**     it
4550: 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65   is set, iterate
4560: 20 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73 20   through docids 
4570: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
4580: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
4590: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
45a0: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
45b0: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
45c0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
45d0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
45e0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
45f0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
4600: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4610: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
4620: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
4630: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
4640: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
4650: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
4660: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
4670: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
4680: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
4690: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
46a0: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
46b0: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
46c0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
46d0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
46e0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
46f0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   page..*/.struct
4700: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
4710: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
4720: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
4730: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
4740: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
4750: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
4780: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
4790: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
47a0: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
47b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
47c0: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
47d0: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
47e0: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
47f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4800: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4810: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
4820: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
4830: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
4840: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
4850: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
4860: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4870: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4880: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
4890: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
48a0: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
48b0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
48c0: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
48d0: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
48e0: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
48f0: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
4900: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
4910: 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  t;..  /* The fol
4920: 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20  lowing are only 
4930: 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35  used if the FTS5
4940: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
4950: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f   flag is set. */
4960: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
4970: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4980: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e     /* Current en
4990: 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66  try in aRowidOff
49a0: 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  set[] */.  int n
49b0: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
49c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
49d0: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
49e0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
49f0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  rray */.  int *a
4a00: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
4a20: 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20  ay of offset to 
4a30: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a  rowid fields */.
4a40: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
4a50: 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20   *pDlidx;       
4a60: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
4a70: 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
4a80: 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61  x */..  /* Varia
4a90: 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62  bles populated b
4aa0: 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20  ased on current 
4ab0: 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35  entry. */.  Fts5
4ac0: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4ae0: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
4af0: 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
4b20: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b  d */.  int nPos;
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4b50: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75 72   of bytes in cur
4b60: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  rent position li
4b70: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c  st */.  int bDel
4b80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4ba0: 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c  if the delete fl
4bb0: 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a  ag is set */.};.
4bc0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45  .#define FTS5_SE
4bd0: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78  GITER_ONETERM 0x
4be0: 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  01.#define FTS5_
4bf0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
4c00: 30 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  0x02.../*.** Obj
4c10: 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e  ect for iteratin
4c20: 67 20 74 68 72 6f 75 67 68 20 70 61 67 69 6e 61  g through pagina
4c30: 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 72  ted data..*/.str
4c40: 75 63 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65  uct Fts5ChunkIte
4c50: 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  r {.  Fts5Data *
4c60: 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
4c70: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4c80: 20 6c 65 61 66 20 64 61 74 61 2e 20 4e 55 4c 4c   leaf data. NULL
4c90: 20 2d 3e 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 36   -> EOF. */.  i6
4ca0: 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 20 20 20  4 iLeafRowid;   
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4cc0: 20 41 62 73 6f 6c 75 74 65 20 72 6f 77 69 64 20   Absolute rowid 
4cd0: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
4ce0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20  */.  int nRem;  
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e       /* Remainin
4d10: 67 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  g bytes of data 
4d20: 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 2f 2a  to read */..  /*
4d30: 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
4d40: 72 73 20 2a 2f 0a 20 20 75 38 20 2a 70 3b 20 20  rs */.  u8 *p;  
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
4d70: 65 72 20 74 6f 20 63 68 75 6e 6b 20 6f 66 20 64  er to chunk of d
4d80: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ata */.  int n; 
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4db0: 20 6f 66 20 62 75 66 66 65 72 20 70 20 69 6e 20   of buffer p in 
4dc0: 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  bytes */.};../*.
4dd0: 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74  ** Object for it
4de0: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
4df0: 61 20 73 69 6e 67 6c 65 20 70 6f 73 69 74 69 6f  a single positio
4e00: 6e 20 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a  n list on disk..
4e10: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f  */.struct Fts5Po
4e20: 73 49 74 65 72 20 7b 0a 20 20 46 74 73 35 43 68  sIter {.  Fts5Ch
4e30: 75 6e 6b 49 74 65 72 20 63 68 75 6e 6b 3b 20 20  unkIter chunk;  
4e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4e50: 72 65 6e 74 20 63 68 75 6e 6b 20 6f 66 20 64 61  rent chunk of da
4e60: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  ta */.  int iOff
4e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4e80: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
4e90: 74 20 77 69 74 68 69 6e 20 63 68 75 6e 6b 20 64  t within chunk d
4ea0: 61 74 61 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43  ata */..  int iC
4eb0: 6f 6c 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a  ol;.  int iPos;.
4ec0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  };../*.** Object
4ed0: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
4ee0: 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e  hrough the conen
4ef0: 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69  ts of a single i
4f00: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20  nternal node in 
4f10: 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
4f20: 74 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74  truct Fts5NodeIt
4f30: 65 72 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e  er {.  /* Intern
4f40: 61 6c 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61  al. Set and mana
4f50: 67 65 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49  ged by fts5NodeI
4f60: 74 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f  terXXX() functio
4f70: 6e 73 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a  ns. Except, .  *
4f80: 2a 20 74 68 65 20 45 4f 46 20 74 65 73 74 20 66  * the EOF test f
4f90: 6f 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  or the iterator 
4fa0: 69 73 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72  is (Fts5NodeIter
4fb0: 2e 61 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a  .aData==0).  */.
4fc0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74    const u8 *aDat
4fd0: 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a  a;.  int nData;.
4fe0: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f    int iOff;..  /
4ff0: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
5000: 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  es */.  Fts5Buff
5010: 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e  er term;.  int n
5020: 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68  Empty;.  int iCh
5030: 69 6c 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64  ild;.  int bDlid
5040: 78 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  x;.};../*.** An 
5050: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5060: 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69  following type i
5070: 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
5080: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  e through the co
5090: 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64  ntents.** of a d
50a0: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63  oclist-index rec
50b0: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61  ord..**.** pData
50c0: 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f  :.**   Record co
50d0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63  ntaining the doc
50e0: 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e  list-index data.
50f0: 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20  .**.** bEof:.** 
5100: 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e    Set to true on
5110: 63 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20  ce iterator has 
5120: 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a  reached EOF..**.
5130: 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65  ** iOff:.**   Se
5140: 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  t to the current
5150: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72   offset within r
5160: 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a  ecord pData..*/.
5170: 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78  struct Fts5Dlidx
5180: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74  Iter {.  Fts5Dat
5190: 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  a *pData;       
51a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
51b0: 6f 72 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  or doclist index
51c0: 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  , if any */.  in
51d0: 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t iOff;         
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
51f0: 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e  urrent offset in
5200: 74 6f 20 70 44 6c 69 64 78 20 2a 2f 0a 20 20 69  to pDlidx */.  i
5210: 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20  nt bEof;        
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5230: 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79 20 2a  At EOF already *
5240: 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 4f 66  /.  int iFirstOf
5250: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
5260: 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72 65 76    /* Used by rev
5270: 65 72 73 65 20 69 74 65 72 61 74 6f 72 73 20 6f  erse iterators o
5280: 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  nly */..  /* Out
5290: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
52a0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
52b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
52c0: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
52d0: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
52e0: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
52f0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5300: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5310: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5320: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a  LeafPgno */.};..
5330: 0a 2f 2a 0a 2a 2a 20 41 6e 20 46 74 73 35 42 74  ./*.** An Fts5Bt
5340: 72 65 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69  reeIter object i
5350: 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
5360: 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 6e  e through all en
5370: 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
5380: 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
5390: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
53a0: 73 69 6e 67 6c 65 20 66 74 73 35 20 73 65 67 6d  single fts5 segm
53b0: 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ent. In this cas
53c0: 65 20 74 68 65 0a 2a 2a 20 22 62 2d 74 72 65 65  e the.** "b-tree
53d0: 20 68 69 65 72 61 72 63 68 79 22 20 69 73 20 61   hierarchy" is a
53e0: 6c 6c 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20  ll b-tree nodes 
53f0: 65 78 63 65 70 74 20 6c 65 61 76 65 73 2e 20 45  except leaves. E
5400: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
5410: 0a 2a 2a 20 62 2d 74 72 65 65 20 68 69 65 72 61  .** b-tree hiera
5420: 72 63 68 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  rchy consists of
5430: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
5440: 2a 2a 0a 2a 2a 20 20 20 69 4c 65 61 66 3a 20 20  **.**   iLeaf:  
5450: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
5460: 6f 66 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  of the leaf page
5470: 20 74 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74   the entry point
5480: 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 74 65  s to..**.**   te
5490: 72 6d 3a 20 20 20 41 20 73 70 6c 69 74 2d 6b 65  rm:   A split-ke
54a0: 79 20 74 68 61 74 20 61 6c 6c 20 74 65 72 6d 73  y that all terms
54b0: 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 24 69   on leaf page $i
54c0: 4c 65 61 66 20 6d 75 73 74 20 62 65 20 67 72 65  Leaf must be gre
54d0: 61 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ater.**         
54e0: 20 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20    than or equal 
54f0: 74 6f 2e 20 54 68 65 20 22 74 65 72 6d 22 20 61  to. The "term" a
5500: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
5510: 68 65 20 66 69 72 73 74 20 62 2d 74 72 65 65 0a  he first b-tree.
5520: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 68 69 65  **           hie
5530: 72 61 72 63 68 79 20 65 6e 74 72 79 20 28 74 68  rarchy entry (th
5540: 65 20 6f 6e 65 20 74 68 61 74 20 70 6f 69 6e 74  e one that point
5550: 73 20 74 6f 20 6c 65 61 66 20 70 61 67 65 20 31  s to leaf page 1
5560: 29 20 69 73 20 61 6c 77 61 79 73 20 0a 2a 2a 20  ) is always .** 
5570: 20 20 20 20 20 20 20 20 20 20 61 6e 20 65 6d 70            an emp
5580: 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ty string..**.**
5590: 20 20 20 6e 45 6d 70 74 79 3a 20 54 68 65 20 6e     nEmpty: The n
55a0: 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20 28  umber of empty (
55b0: 74 65 72 6d 6c 65 73 73 29 20 6c 65 61 66 20 70  termless) leaf p
55c0: 61 67 65 73 20 74 68 61 74 20 69 6d 6d 65 64 69  ages that immedi
55d0: 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ately.**        
55e0: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65     following iLe
55f0: 61 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74  af..**.** The Ft
5600: 73 35 42 74 72 65 65 49 74 65 72 20 6f 62 6a 65  s5BtreeIter obje
5610: 63 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ct is only used 
5620: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  as part of the i
5630: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63  ntegrity-check c
5640: 6f 64 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ode..*/.struct F
5650: 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
5660: 6c 20 7b 0a 20 20 46 74 73 35 4e 6f 64 65 49 74  l {.  Fts5NodeIt
5670: 65 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  er s;           
5680: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
5690: 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  r for the curren
56a0: 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  t node */.  Fts5
56b0: 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20  Data *pData;    
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
56d0: 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72  ata for the curr
56e0: 65 6e 74 20 6e 6f 64 65 20 2a 2f 0a 7d 3b 0a 73  ent node */.};.s
56f0: 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65 49  truct Fts5BtreeI
5700: 74 65 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65  ter {.  Fts5Inde
5710: 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
5720: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
5730: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
5740: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
5750: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
5760: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
5770: 68 72 6f 75 67 68 20 74 68 69 73 20 73 65 67 6d  hrough this segm
5780: 65 6e 74 27 73 20 62 2d 74 72 65 65 20 2a 2f 0a  ent's b-tree */.
5790: 20 20 69 6e 74 20 6e 4c 76 6c 3b 20 20 20 20 20    int nLvl;     
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 4c 76    /* Size of aLv
57c0: 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46  l[] array */.  F
57d0: 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
57e0: 6c 20 2a 61 4c 76 6c 3b 20 20 20 20 20 20 20 2f  l *aLvl;       /
57f0: 2a 20 4c 65 76 65 6c 20 66 6f 72 20 65 61 63 68  * Level for each
5800: 20 74 69 65 72 20 6f 66 20 62 2d 74 72 65 65 20   tier of b-tree 
5810: 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  */..  /* Output 
5820: 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 46  variables */.  F
5830: 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5850: 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  * Current term *
5860: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 3b 20 20  /.  int iLeaf;  
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 20 20 20 2f 2a 20 4c 65 61 66 20 63 6f 6e 74      /* Leaf cont
5890: 61 69 6e 69 6e 67 20 74 65 72 6d 73 20 3e 3d 20  aining terms >= 
58a0: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
58b0: 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20    int nEmpty;   
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22    /* Number of "
58e0: 65 6d 70 74 79 22 20 6c 65 61 76 65 73 20 66 6f  empty" leaves fo
58f0: 6c 6c 6f 77 69 6e 67 20 69 4c 65 61 66 20 2a 2f  llowing iLeaf */
5900: 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20  .  int bEof;    
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
5930: 65 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 6e  e at EOF */.  in
5940: 74 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20 20  t bDlidx;       
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5960: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
5970: 78 69 73 74 73 20 61 20 64 6c 69 64 78 20 2a 2f  xists a dlidx */
5980: 0a 7d 3b 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  .};...static voi
5990: 64 20 66 74 73 35 50 75 74 55 31 36 28 75 38 20  d fts5PutU16(u8 
59a0: 2a 61 4f 75 74 2c 20 75 31 36 20 69 56 61 6c 29  *aOut, u16 iVal)
59b0: 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d 20 28 69  {.  aOut[0] = (i
59c0: 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f 75 74 5b  Val>>8);.  aOut[
59d0: 31 5d 20 3d 20 28 69 56 61 6c 26 30 78 46 46 29  1] = (iVal&0xFF)
59e0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 31 36 20  ;.}..static u16 
59f0: 66 74 73 35 47 65 74 55 31 36 28 63 6f 6e 73 74  fts5GetU16(const
5a00: 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20 72 65 74   u8 *aIn){.  ret
5a10: 75 72 6e 20 28 28 75 31 36 29 61 49 6e 5b 30 5d  urn ((u16)aIn[0]
5a20: 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b 31 5d 3b   << 8) + aIn[1];
5a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5a40: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
5a50: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
5a60: 33 32 28 29 20 72 6f 75 74 69 6e 65 20 66 72 6f  32() routine fro
5a70: 6d 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  m the SQLite cor
5a80: 65 2e 0a 2a 2a 20 45 78 63 65 70 74 2c 20 74 68  e..** Except, th
5a90: 69 73 20 76 65 72 73 69 6f 6e 20 64 6f 65 73 20  is version does 
5aa0: 68 61 6e 64 6c 65 20 74 68 65 20 73 69 6e 67 6c  handle the singl
5ab0: 65 20 62 79 74 65 20 63 61 73 65 20 74 68 61 74  e byte case that
5ac0: 20 74 68 65 20 63 6f 72 65 0a 2a 2a 20 76 65 72   the core.** ver
5ad0: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
5ae0: 62 65 69 6e 67 20 68 61 6e 64 6c 65 64 20 62 65  being handled be
5af0: 66 6f 72 65 20 69 74 73 20 66 75 6e 63 74 69 6f  fore its functio
5b00: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
5b10: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 47  int sqlite3Fts5G
5b20: 65 74 56 61 72 69 6e 74 33 32 28 63 6f 6e 73 74  etVarint32(const
5b30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5b40: 70 2c 20 75 33 32 20 2a 76 29 7b 0a 20 20 75 33  p, u32 *v){.  u3
5b50: 32 20 61 2c 62 3b 0a 0a 20 20 2f 2a 20 54 68 65  2 a,b;..  /* The
5b60: 20 31 2d 62 79 74 65 20 63 61 73 65 2e 20 4f 76   1-byte case. Ov
5b70: 65 72 77 68 65 6c 6d 69 6e 67 6c 79 20 74 68 65  erwhelmingly the
5b80: 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 2e 20 2a 2f   most common. */
5b90: 0a 20 20 61 20 3d 20 2a 70 3b 0a 20 20 2f 2a 20  .  a = *p;.  /* 
5ba0: 61 3a 20 70 30 20 28 75 6e 6d 61 73 6b 65 64 29  a: p0 (unmasked)
5bb0: 20 2a 2f 0a 20 20 69 66 20 28 21 28 61 26 30 78   */.  if (!(a&0x
5bc0: 38 30 29 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20  80)).  {.    /* 
5bd0: 56 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30  Values between 0
5be0: 20 61 6e 64 20 31 32 37 20 2a 2f 0a 20 20 20 20   and 127 */.    
5bf0: 2a 76 20 3d 20 61 3b 0a 20 20 20 20 72 65 74 75  *v = a;.    retu
5c00: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
5c10: 54 68 65 20 32 2d 62 79 74 65 20 63 61 73 65 20  The 2-byte case 
5c20: 2a 2f 0a 20 20 70 2b 2b 3b 0a 20 20 62 20 3d 20  */.  p++;.  b = 
5c30: 2a 70 3b 0a 20 20 2f 2a 20 62 3a 20 70 31 20 28  *p;.  /* b: p1 (
5c40: 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69  unmasked) */.  i
5c50: 66 20 28 21 28 62 26 30 78 38 30 29 29 0a 20 20  f (!(b&0x80)).  
5c60: 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20  {.    /* Values 
5c70: 62 65 74 77 65 65 6e 20 31 32 38 20 61 6e 64 20  between 128 and 
5c80: 31 36 33 38 33 20 2a 2f 0a 20 20 20 20 61 20 26  16383 */.    a &
5c90: 3d 20 30 78 37 66 3b 0a 20 20 20 20 61 20 3d 20  = 0x7f;.    a = 
5ca0: 61 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61  a<<7;.    *v = a
5cb0: 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75 72 6e   | b;.    return
5cc0: 20 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   2;.  }..  /* Th
5cd0: 65 20 33 2d 62 79 74 65 20 63 61 73 65 20 2a 2f  e 3-byte case */
5ce0: 0a 20 20 70 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c  .  p++;.  a = a<
5cf0: 3c 31 34 3b 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a  <14;.  a |= *p;.
5d00: 20 20 2f 2a 20 61 3a 20 70 30 3c 3c 31 34 20 7c    /* a: p0<<14 |
5d10: 20 70 32 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a   p2 (unmasked) *
5d20: 2f 0a 20 20 69 66 20 28 21 28 61 26 30 78 38 30  /.  if (!(a&0x80
5d30: 29 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61  )).  {.    /* Va
5d40: 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 36 33  lues between 163
5d50: 38 34 20 61 6e 64 20 32 30 39 37 31 35 31 20 2a  84 and 2097151 *
5d60: 2f 0a 20 20 20 20 61 20 26 3d 20 28 30 78 37 66  /.    a &= (0x7f
5d70: 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 0a 20 20  <<14)|(0x7f);.  
5d80: 20 20 62 20 26 3d 20 30 78 37 66 3b 0a 20 20 20    b &= 0x7f;.   
5d90: 20 62 20 3d 20 62 3c 3c 37 3b 0a 20 20 20 20 2a   b = b<<7;.    *
5da0: 76 20 3d 20 61 20 7c 20 62 3b 0a 20 20 20 20 72  v = a | b;.    r
5db0: 65 74 75 72 6e 20 33 3b 0a 20 20 7d 0a 0a 20 20  eturn 3;.  }..  
5dc0: 2f 2a 20 41 20 33 32 2d 62 69 74 20 76 61 72 69  /* A 32-bit vari
5dd0: 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  nt is used to st
5de0: 6f 72 65 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61  ore size informa
5df0: 74 69 6f 6e 20 69 6e 20 62 74 72 65 65 73 2e 0a  tion in btrees..
5e00: 20 20 2a 2a 20 4f 62 6a 65 63 74 73 20 61 72 65    ** Objects are
5e10: 20 72 61 72 65 6c 79 20 6c 61 72 67 65 72 20 74   rarely larger t
5e20: 68 61 6e 20 32 4d 69 42 20 6c 69 6d 69 74 20 6f  han 2MiB limit o
5e30: 66 20 61 20 33 2d 62 79 74 65 20 76 61 72 69 6e  f a 3-byte varin
5e40: 74 2e 0a 20 20 2a 2a 20 41 20 33 2d 62 79 74 65  t..  ** A 3-byte
5e50: 20 76 61 72 69 6e 74 20 69 73 20 73 75 66 66 69   varint is suffi
5e60: 63 69 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70  cient, for examp
5e70: 6c 65 2c 20 74 6f 20 72 65 63 6f 72 64 20 74 68  le, to record th
5e80: 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 61  e size.  ** of a
5e90: 20 31 30 34 38 35 36 39 2d 62 79 74 65 20 42 4c   1048569-byte BL
5ea0: 4f 42 20 6f 72 20 73 74 72 69 6e 67 2e 0a 20 20  OB or string..  
5eb0: 2a 2a 0a 20 20 2a 2a 20 57 65 20 6f 6e 6c 79 20  **.  ** We only 
5ec0: 75 6e 72 6f 6c 6c 20 74 68 65 20 66 69 72 73 74  unroll the first
5ed0: 20 31 2d 2c 20 32 2d 2c 20 61 6e 64 20 33 2d 20   1-, 2-, and 3- 
5ee0: 62 79 74 65 20 63 61 73 65 73 2e 20 20 54 68 65  byte cases.  The
5ef0: 20 76 65 72 79 0a 20 20 2a 2a 20 72 61 72 65 20   very.  ** rare 
5f00: 6c 61 72 67 65 72 20 63 61 73 65 73 20 63 61 6e  larger cases can
5f10: 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
5f20: 68 65 20 73 6c 6f 77 65 72 20 36 34 2d 62 69 74  he slower 64-bit
5f30: 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 72 6f 75   varint.  ** rou
5f40: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20  tine..  */.  {. 
5f50: 20 20 20 75 36 34 20 76 36 34 3b 0a 20 20 20 20     u64 v64;.    
5f60: 75 38 20 6e 3b 0a 20 20 20 20 70 20 2d 3d 20 32  u8 n;.    p -= 2
5f70: 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
5f80: 33 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 76  3GetVarint(p, &v
5f90: 36 34 29 3b 0a 20 20 20 20 2a 76 20 3d 20 28 75  64);.    *v = (u
5fa0: 33 32 29 76 36 34 3b 0a 20 20 20 20 61 73 73 65  32)v64;.    asse
5fb0: 72 74 28 20 6e 3e 33 20 26 26 20 6e 3c 3d 39 20  rt( n>3 && n<=9 
5fc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 3b  );.    return n;
5fd0: 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  .  }.}..int sqli
5fe0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
5ff0: 4c 65 6e 28 75 33 32 20 69 56 61 6c 29 7b 0a 20  Len(u32 iVal){. 
6000: 20 69 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20   if( iVal<(1 << 
6010: 37 20 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  7 ) ) return 1;.
6020: 20 20 69 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c    if( iVal<(1 <<
6030: 20 31 34 29 20 29 20 72 65 74 75 72 6e 20 32 3b   14) ) return 2;
6040: 0a 20 20 69 66 28 20 69 56 61 6c 3c 28 31 20 3c  .  if( iVal<(1 <
6050: 3c 20 32 31 29 20 29 20 72 65 74 75 72 6e 20 33  < 21) ) return 3
6060: 3b 0a 20 20 69 66 28 20 69 56 61 6c 3c 28 31 20  ;.  if( iVal<(1 
6070: 3c 3c 20 32 38 29 20 29 20 72 65 74 75 72 6e 20  << 28) ) return 
6080: 34 3b 0a 20 20 72 65 74 75 72 6e 20 35 3b 0a 7d  4;.  return 5;.}
6090: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
60a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 62 75   and return a bu
60b0: 66 66 65 72 20 61 74 20 6c 65 61 73 74 20 6e 42  ffer at least nB
60c0: 79 74 65 20 62 79 74 65 73 20 69 6e 20 73 69 7a  yte bytes in siz
60d0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  e..**.** If an O
60e0: 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
60f0: 75 6e 74 65 72 65 64 2c 20 72 65 74 75 72 6e 20  untered, return 
6100: 4e 55 4c 4c 20 61 6e 64 20 73 65 74 20 74 68 65  NULL and set the
6110: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 0a 2a   error code in.*
6120: 2a 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  * the Fts5Index 
6130: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
6140: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
6150: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
6160: 6f 69 64 20 2a 66 74 73 35 49 64 78 4d 61 6c 6c  oid *fts5IdxMall
6170: 6f 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  oc(Fts5Index *p,
6180: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 72   int nByte){.  r
6190: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73  eturn sqlite3Fts
61a0: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
61b0: 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  rc, nByte);.}../
61c0: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
61d0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
61e0: 20 70 4c 65 66 74 20 62 75 66 66 65 72 20 77 69   pLeft buffer wi
61f0: 74 68 20 74 68 65 20 70 52 69 67 68 74 2f 6e 52  th the pRight/nR
6200: 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a  ight blob..**.**
6210: 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70   Return -ve if p
6220: 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  Left is smaller 
6230: 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69  than pRight, 0 i
6240: 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c  f they are equal
6250: 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52   or.** +ve if pR
6260: 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  ight is smaller 
6270: 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f  than pLeft. In o
6280: 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a  ther words:.**.*
6290: 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65  *     res = *pLe
62a0: 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a  ft - *pRight.*/.
62b0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42  static int fts5B
62c0: 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
62d0: 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
62e0: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
62f0: 20 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64      /* Left hand
6300: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
6310: 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  son */.  const u
6320: 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e  8 *pRight, int n
6330: 52 69 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68  Right    /* Righ
6340: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63  t hand side of c
6350: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a  omparison */.){.
6360: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
6370: 28 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68  (pLeft->n, nRigh
6380: 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  t);.  int res = 
6390: 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c  memcmp(pLeft->p,
63a0: 20 70 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a   pRight, nCmp);.
63b0: 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30    return (res==0
63c0: 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e   ? (pLeft->n - n
63d0: 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d  Right) : res);.}
63e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
63f0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
6400: 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
6410: 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
6420: 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a   If one buffer.*
6430: 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  * is a prefix of
6440: 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
6450: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65  s considered the
6460: 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   lesser..**.** R
6470: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
6480: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
6490: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
64a0: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
64b0: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
64c0: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
64d0: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
64e0: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
64f0: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
6500: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
6510: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
6520: 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42  ferCompare(Fts5B
6530: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74  uffer *pLeft, Ft
6540: 73 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74  s5Buffer *pRight
6550: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
6560: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52  MIN(pLeft->n, pR
6570: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20  ight->n);.  int 
6580: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
6590: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70  ft->p, pRight->p
65a0: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
65b0: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
65c0: 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e  ft->n - pRight->
65d0: 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 23 69  n) : res);.}..#i
65e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
65f0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  G.static int fts
6600: 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 0a 20 20  5BlobCompare(.  
6610: 63 6f 6e 73 74 20 75 38 20 2a 70 4c 65 66 74 2c  const u8 *pLeft,
6620: 20 69 6e 74 20 6e 4c 65 66 74 2c 20 0a 20 20 63   int nLeft, .  c
6630: 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74 2c  onst u8 *pRight,
6640: 20 69 6e 74 20 6e 52 69 67 68 74 0a 29 7b 0a 20   int nRight.){. 
6650: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
6660: 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 29 3b 0a  nLeft, nRight);.
6670: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
6680: 6d 70 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  mp(pLeft, pRight
6690: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
66a0: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 6e 4c 65  n (res==0 ? (nLe
66b0: 66 74 20 2d 20 6e 52 69 67 68 74 29 20 3a 20 72  ft - nRight) : r
66c0: 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  es);.}.#endif...
66d0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
66e0: 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68  read-only blob h
66f0: 61 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20  andle, if it is 
6700: 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  open..*/.static 
6710: 76 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65  void fts5CloseRe
6720: 61 64 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a  ader(Fts5Index *
6730: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65  p){.  if( p->pRe
6740: 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ader ){.    sqli
6750: 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65  te3_blob *pReade
6760: 72 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a  r = p->pReader;.
6770: 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d      p->pReader =
6780: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
6790: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64  blob_close(pRead
67a0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
67b0: 2a 20 43 68 65 63 6b 20 69 66 20 72 6f 77 20 69  * Check if row i
67c0: 52 6f 77 69 64 20 65 78 69 73 74 73 20 69 6e 20  Rowid exists in 
67d0: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
67e0: 2c 20 61 6e 64 20 74 68 61 74 20 69 74 20 63 6f  , and that it co
67f0: 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 62 6c 6f 62  ntains.** a blob
6800: 20 76 61 6c 75 65 2e 20 49 66 20 73 6f 2c 20 72   value. If so, r
6810: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
6820: 4f 52 20 28 79 65 73 20 2d 20 53 51 4c 49 54 45  OR (yes - SQLITE
6830: 5f 45 52 52 4f 52 2c 20 6e 6f 74 20 0a 2a 2a 20  _ERROR, not .** 
6840: 53 51 4c 49 54 45 5f 4f 4b 29 2e 20 49 66 20 6e  SQLITE_OK). If n
6850: 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
6860: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 2e 0a  E_CORRUPT_VTAB..
6870: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
6880: 72 20 6f 63 63 75 72 73 20 28 65 2e 67 2e 20 4f  r occurs (e.g. O
6890: 4f 4d 20 6f 72 20 49 4f 45 52 52 29 2c 20 72 65  OM or IOERR), re
68a0: 74 75 72 6e 20 74 68 65 20 72 65 6c 65 76 61 6e  turn the relevan
68b0: 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  t error code..**
68c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
68d0: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
68e0: 74 6f 20 62 65 20 65 66 66 69 63 69 65 6e 74 2e  to be efficient.
68f0: 20 49 74 20 69 73 20 70 61 72 74 20 6f 66 20 76   It is part of v
6900: 61 72 79 20 72 61 72 65 6c 79 0a 2a 2a 20 69 6e  ary rarely.** in
6910: 76 6f 6b 65 64 20 65 72 72 6f 72 20 68 61 6e 64  voked error hand
6920: 6c 69 6e 67 20 63 6f 64 65 20 6f 6e 6c 79 2e 0a  ling code only..
6930: 2a 2f 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20  */.#if 0.static 
6940: 69 6e 74 20 66 74 73 35 43 68 65 63 6b 4d 69 73  int fts5CheckMis
6950: 73 69 6e 67 52 6f 77 69 64 28 46 74 73 35 49 6e  singRowid(Fts5In
6960: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
6970: 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  id){.  const cha
6980: 72 20 2a 7a 46 6d 74 20 3d 20 22 53 45 4c 45 43  r *zFmt = "SELEC
6990: 54 20 74 79 70 65 6f 66 28 62 6c 6f 63 6b 29 3d  T typeof(block)=
69a0: 3d 27 62 6c 6f 62 27 20 46 52 4f 4d 20 27 25 71  ='blob' FROM '%q
69b0: 27 2e 25 51 20 57 48 45 52 45 20 69 64 3d 25 6c  '.%Q WHERE id=%l
69c0: 6c 64 22 3b 0a 20 20 69 6e 74 20 62 4f 6b 20 3d  ld";.  int bOk =
69d0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
69e0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 7a  char *zSql;..  z
69f0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
6a00: 72 69 6e 74 66 28 7a 46 6d 74 2c 20 70 2d 3e 70  rintf(zFmt, p->p
6a10: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
6a20: 7a 44 61 74 61 54 62 6c 2c 20 69 52 6f 77 69 64  zDataTbl, iRowid
6a30: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
6a40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
6a50: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
6a60: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
6a70: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
6a80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
6a90: 65 70 61 72 65 5f 76 32 28 70 2d 3e 70 43 6f 6e  epare_v2(p->pCon
6aa0: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
6ab0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
6ac0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6ad0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
6ae0: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
6af0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
6b00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b  ) ){.        bOk
6b10: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
6b20: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
6b30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
6b40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
6b50: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
6b60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
6b70: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a  ree(zSql);.  }..
6b80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6b90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6ba0: 62 4f 6b 20 3f 20 53 51 4c 49 54 45 5f 45 52 52  bOk ? SQLITE_ERR
6bb0: 4f 52 20 3a 20 46 54 53 35 5f 43 4f 52 52 55 50  OR : FTS5_CORRUP
6bc0: 54 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  T;.  }..  return
6bd0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73   rc;.}.#endif..s
6be0: 74 61 74 69 63 20 46 74 73 35 44 61 74 61 20 2a  tatic Fts5Data *
6bf0: 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
6c00: 66 66 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65  ffer(.  Fts5Inde
6c10: 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66  x *p, .  Fts5Buf
6c20: 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 69 36  fer *pBuf, .  i6
6c30: 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 46 74  4 iRowid.){.  Ft
6c40: 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20 30  s5Data *pRet = 0
6c50: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
6c60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6c70: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6c80: 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  OK;..    if( p->
6c90: 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  pReader ){.     
6ca0: 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
6cb0: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
6cc0: 41 42 4f 52 54 20 69 66 20 74 68 65 72 65 20 68  ABORT if there h
6cd0: 61 73 20 62 65 65 6e 20 61 20 73 61 76 65 70 6f  as been a savepo
6ce0: 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  int.      ** rol
6cf0: 6c 62 61 63 6b 20 73 69 6e 63 65 20 69 74 20 77  lback since it w
6d00: 61 73 20 6c 61 73 74 20 75 73 65 64 2e 20 49 6e  as last used. In
6d10: 20 74 68 69 73 20 63 61 73 65 20 61 20 6e 65 77   this case a new
6d20: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20   blob handle.   
6d30: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
6d40: 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  d.  */.      sql
6d50: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
6d60: 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20   = p->pReader;. 
6d70: 20 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20       p->pReader 
6d80: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
6d90: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f  sqlite3_blob_reo
6da0: 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69  pen(pBlob, iRowi
6db0: 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
6dc0: 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
6dd0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  );.      p->pRea
6de0: 64 65 72 20 3d 20 70 42 6c 6f 62 3b 0a 20 20 20  der = pBlob;.   
6df0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6e00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6e10: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
6e20: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6e30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6e40: 5f 41 42 4f 52 54 20 29 20 72 63 20 3d 20 53 51  _ABORT ) rc = SQ
6e50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
6e60: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 62 6c      /* If the bl
6e70: 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74  ob handle is not
6e80: 20 79 65 74 20 6f 70 65 6e 2c 20 6f 70 65 6e 20   yet open, open 
6e90: 61 6e 64 20 73 65 65 6b 20 69 74 2e 20 4f 74 68  and seek it. Oth
6ea0: 65 72 77 69 73 65 2c 20 75 73 65 0a 20 20 20 20  erwise, use.    
6eb0: 2a 2a 20 74 68 65 20 62 6c 6f 62 5f 72 65 6f 70  ** the blob_reop
6ec0: 65 6e 28 29 20 41 50 49 20 74 6f 20 72 65 73 65  en() API to rese
6ed0: 65 6b 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ek the existing 
6ee0: 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  blob handle.  */
6ef0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61  .    if( p->pRea
6f00: 64 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  der==0 && rc==SQ
6f10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6f20: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
6f30: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
6f40: 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  g;.      rc = sq
6f50: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
6f60: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20  pConfig->db, .  
6f70: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
6f80: 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
6f90: 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77  l, "block", iRow
6fa0: 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61 64  id, 0, &p->pRead
6fb0: 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  er.      );.    
6fc0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 69 74  }..    /* If eit
6fd0: 68 65 72 20 6f 66 20 74 68 65 20 73 71 6c 69 74  her of the sqlit
6fe0: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f  e3_blob_open() o
6ff0: 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  r sqlite3_blob_r
7000: 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20  eopen() calls.  
7010: 20 20 2a 2a 20 61 62 6f 76 65 20 72 65 74 75 72    ** above retur
7020: 6e 65 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ned SQLITE_ERROR
7030: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
7040: 43 4f 52 52 55 50 54 5f 56 54 41 42 20 69 6e 73  CORRUPT_VTAB ins
7050: 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c  tead..    ** All
7060: 20 74 68 65 20 72 65 61 73 6f 6e 73 20 74 68 6f   the reasons tho
7070: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67  se functions mig
7080: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
7090: 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67  _ERROR - missing
70a0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d  .    ** table, m
70b0: 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d  issing row, non-
70c0: 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f  blob/text in blo
70d0: 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69  ck column - indi
70e0: 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 62 61 63  cate .    ** bac
70f0: 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f 72 72 75  king store corru
7100: 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69  ption.  */.    i
7110: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  f( rc==SQLITE_ER
7120: 52 4f 52 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ROR ) rc = FTS5_
7130: 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 69 66  CORRUPT;..    if
7140: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7150: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f 75  ){.      u8 *aOu
7160: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7170: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f       /* Read blo
7180: 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  b data into this
7190: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 20   buffer */.     
71a0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
71b0: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
71c0: 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20  p->pReader);.   
71d0: 20 20 20 69 66 28 20 70 42 75 66 20 29 7b 0a 20     if( pBuf ){. 
71e0: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
71f0: 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20 20  rZero(pBuf);.   
7200: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47       fts5BufferG
7210: 72 6f 77 28 26 72 63 2c 20 70 42 75 66 2c 20 6e  row(&rc, pBuf, n
7220: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 61  Byte);.        a
7230: 4f 75 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20  Out = pBuf->p;. 
7240: 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d         pBuf->n =
7250: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65   nByte;.      }e
7260: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
7270: 20 6e 53 70 61 63 65 20 3d 20 6e 42 79 74 65 20   nSpace = nByte 
7280: 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  + FTS5_DATA_ZERO
7290: 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PADDING;.      
72a0: 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 44 61    pRet = (Fts5Da
72b0: 74 61 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  ta*)sqlite3Fts5M
72c0: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
72d0: 53 70 61 63 65 2b 73 69 7a 65 6f 66 28 46 74 73  Space+sizeof(Fts
72e0: 35 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 20  5Data));.       
72f0: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
7300: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 20 3d         pRet->n =
7310: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
7320: 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70    aOut = pRet->p
7330: 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31 5d   = (u8*)&pRet[1]
7340: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  ;.          pRet
7350: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
7360: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7370: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7380: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
73a0: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61  lob_read(p->pRea
73b0: 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65  der, aOut, nByte
73c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
73d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
73e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
73f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
7400: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  et);.        pRe
7410: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
7420: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d     }.    p->rc =
7430: 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61   rc;.    p->nRea
7440: 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  d++;.  }..  retu
7450: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
7460: 2a 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63  * Retrieve a rec
7470: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ord from the %_d
7480: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ata table..**.**
7490: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
74a0: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
74b0: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
74c0: 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a  or left in the .
74d0: 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a  ** Fts5Index obj
74e0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  ect..*/.static F
74f0: 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74  ts5Data *fts5Dat
7500: 61 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  aRead(Fts5Index 
7510: 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  *p, i64 iRowid){
7520: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65  .  Fts5Data *pRe
7530: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
7540: 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c 20 69  OrBuffer(p, 0, i
7550: 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72 74  Rowid);.  assert
7560: 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d  ( (pRet==0)==(p-
7570: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  >rc!=SQLITE_OK) 
7580: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
7590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
75a0: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
75b0: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69  e %_data table i
75c0: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73  nto the buffer s
75d0: 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a  upplied as the.*
75e0: 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
75f0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
7600: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
7610: 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69 6e  error is left in
7620: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
7630: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
7640: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
7650: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
7660: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
7670: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
7680: 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73   .** no-op..*/.s
7690: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
76a0: 61 74 61 42 75 66 66 65 72 28 46 74 73 35 49 6e  ataBuffer(Fts5In
76b0: 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66 66  dex *p, Fts5Buff
76c0: 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 52  er *pBuf, i64 iR
76d0: 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 66  owid){.  (void)f
76e0: 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66  ts5DataReadOrBuf
76f0: 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69 52 6f  fer(p, pBuf, iRo
7700: 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  wid);.}../*.** R
7710: 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
7720: 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72  ce to data recor
7730: 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  d returned by an
7740: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
7750: 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61 64  .** fts5DataRead
7760: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
7770: 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  id fts5DataRelea
7780: 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61  se(Fts5Data *pDa
7790: 74 61 29 7b 0a 20 20 69 66 28 20 70 44 61 74 61  ta){.  if( pData
77a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
77b0: 70 44 61 74 61 2d 3e 6e 52 65 66 3e 30 20 29 3b  pData->nRef>0 );
77c0: 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 52 65 66  .    pData->nRef
77d0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74  --;.    if( pDat
77e0: 61 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c  a->nRef==0 ) sql
77f0: 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29  ite3_free(pData)
7800: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
7810: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 66  void fts5DataRef
7820: 65 72 65 6e 63 65 28 46 74 73 35 44 61 74 61 20  erence(Fts5Data 
7830: 2a 70 44 61 74 61 29 7b 0a 20 20 70 44 61 74 61  *pData){.  pData
7840: 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nRef++;.}../*.
7850: 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50  ** INSERT OR REP
7860: 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20 69 6e  LACE a record in
7870: 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  to the %_data ta
7880: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
7890: 6f 69 64 20 66 74 73 35 44 61 74 61 57 72 69 74  oid fts5DataWrit
78a0: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
78b0: 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73  i64 iRowid, cons
78c0: 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74  t u8 *pData, int
78d0: 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70   nData){.  if( p
78e0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
78f0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
7900: 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29   p->pWriter==0 )
7910: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
7920: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
7930: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
7940: 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  ig;.    char *zS
7950: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
7960: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 52  intf(.        "R
7970: 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71 27  EPLACE INTO '%q'
7980: 2e 25 51 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56  .%Q(id, block) V
7990: 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 70 43 6f  ALUES(?,?)", pCo
79a0: 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44  nfig->zDb, p->zD
79b0: 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20  ataTbl.    );.  
79c0: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
79d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
79e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
79f0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
7a00: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
7a10: 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  v2(pConfig->db, 
7a20: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 57  zSql, -1, &p->pW
7a30: 72 69 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  riter, 0);.     
7a40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
7a50: 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
7a60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7a70: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
7a80: 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
7a90: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
7aa0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
7ab0: 74 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20  t64(p->pWriter, 
7ac0: 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71  1, iRowid);.  sq
7ad0: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
7ae0: 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70  p->pWriter, 2, p
7af0: 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c  Data, nData, SQL
7b00: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
7b10: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
7b20: 57 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63  Writer);.  p->rc
7b30: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
7b40: 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a  (p->pWriter);.}.
7b50: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  ./*.** Execute t
7b60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
7b70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45  :.**.**     DELE
7b80: 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57  TE FROM %_data W
7b90: 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20  HERE id BETWEEN 
7ba0: 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61  $iFirst AND $iLa
7bb0: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  st.*/.static voi
7bc0: 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65  d fts5DataDelete
7bd0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
7be0: 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69  64 iFirst, i64 i
7bf0: 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Last){.  if( p->
7c00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7c10: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70  return;..  if( p
7c20: 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b  ->pDeleter==0 ){
7c30: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
7c40: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
7c50: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
7c60: 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  g;.    char *zSq
7c70: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
7c80: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 44 45  ntf(.        "DE
7c90: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 25  LETE FROM '%q'.%
7ca0: 51 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e  Q WHERE id>=? AN
7cb0: 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66 69  D id<=?", pConfi
7cc0: 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
7cd0: 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Tbl.    );.    i
7ce0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
7cf0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7d00: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
7d10: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7d20: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
7d30: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
7d40: 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65  l, -1, &p->pDele
7d50: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
7d60: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
7d70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7d80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7d90: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
7da0: 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
7db0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
7dc0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
7dd0: 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31  4(p->pDeleter, 1
7de0: 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71 6c  , iFirst);.  sql
7df0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
7e00: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c 20  p->pDeleter, 2, 
7e10: 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  iLast);.  sqlite
7e20: 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74  3_step(p->pDelet
7e30: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
7e40: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
7e50: 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  pDeleter);.}../*
7e60: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 73 71  .** Close the sq
7e70: 6c 69 74 65 33 5f 62 6c 6f 62 20 68 61 6e 64 6c  lite3_blob handl
7e80: 65 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 72  e used to read r
7e90: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
7ea0: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a  %_data table..**
7eb0: 20 41 6e 64 20 64 69 73 63 61 72 64 20 61 6e 79   And discard any
7ec0: 20 63 61 63 68 65 64 20 72 65 61 64 73 2e 20 54   cached reads. T
7ed0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7ee0: 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 65 6e  called at the en
7ef0: 64 20 6f 66 0a 2a 2a 20 61 20 72 65 61 64 20 74  d of.** a read t
7f00: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 77 68  ransaction or wh
7f10: 65 6e 20 61 6e 79 20 73 75 62 2d 74 72 61 6e 73  en any sub-trans
7f20: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
7f30: 20 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20 30 0a   back..*/.#if 0.
7f40: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7f50: 44 61 74 61 52 65 73 65 74 28 46 74 73 35 49 6e  DataReset(Fts5In
7f60: 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dex *p){.  if( p
7f70: 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20  ->pReader ){.   
7f80: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
7f90: 6f 73 65 28 70 2d 3e 70 52 65 61 64 65 72 29 3b  ose(p->pReader);
7fa0: 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20  .    p->pReader 
7fb0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
7fc0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  f../*.** Remove 
7fd0: 61 6c 6c 20 72 65 63 6f 72 64 73 20 61 73 73 6f  all records asso
7fe0: 63 69 61 74 65 64 20 77 69 74 68 20 73 65 67 6d  ciated with segm
7ff0: 65 6e 74 20 69 53 65 67 69 64 2e 0a 2a 2f 0a 73  ent iSegid..*/.s
8000: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
8010: 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74  ataRemoveSegment
8020: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
8030: 6e 74 20 69 53 65 67 69 64 29 7b 0a 20 20 69 36  nt iSegid){.  i6
8040: 34 20 69 46 69 72 73 74 20 3d 20 46 54 53 35 5f  4 iFirst = FTS5_
8050: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
8060: 65 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69  egid, 0, 0);.  i
8070: 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f  64 iLast = FTS5_
8080: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
8090: 65 67 69 64 2b 31 2c 20 30 2c 20 30 29 2d 31 3b  egid+1, 0, 0)-1;
80a0: 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  .  fts5DataDelet
80b0: 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61  e(p, iFirst, iLa
80c0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
80d0: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
80e0: 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75  e to an Fts5Stru
80f0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74  cture object ret
8100: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
8110: 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ier .** call to 
8120: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
8130: 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75 63  d() or fts5Struc
8140: 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f  tureDecode()..*/
8150: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8160: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
8170: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e(Fts5Structure 
8180: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  *pStruct){.  if(
8190: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
81a0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
81b0: 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e  =0; i<pStruct->n
81c0: 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
81d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
81e0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
81f0: 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a  i].aSeg);.    }.
8200: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8210: 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d  (pStruct);.  }.}
8220: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
8230: 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ize and return t
8240: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 63  he structure rec
8250: 6f 72 64 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ord currently st
8260: 6f 72 65 64 20 69 6e 20 73 65 72 69 61 6c 69 7a  ored in serializ
8270: 65 64 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69  ed.** form withi
8280: 6e 20 62 75 66 66 65 72 20 70 44 61 74 61 2f 6e  n buffer pData/n
8290: 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Data..**.** The 
82a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c  Fts5Structure.aL
82b0: 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20  evel[] and each 
82c0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
82d0: 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a  el.aSeg[] array.
82e0: 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f  ** are over-allo
82f0: 63 61 74 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f  cated by one slo
8300: 74 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  t. This allows t
8310: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  he structure con
8320: 74 65 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d  tents.** to be m
8330: 6f 72 65 20 65 61 73 69 6c 79 20 65 64 69 74 65  ore easily edite
8340: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
8350: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
8360: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55  Out is set to NU
8370: 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65  LL and an SQLite
8380: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72   error code.** r
8390: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
83a0: 73 65 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65  se, *ppOut is se
83b0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
83c0: 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64  e new object and
83d0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
83e0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
83f0: 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74  c int fts5Struct
8400: 75 72 65 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e  ureDecode(.  con
8410: 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 20 20  st u8 *pData,   
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8430: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
8440: 67 20 73 65 72 69 61 6c 69 7a 65 64 20 73 74 72  g serialized str
8450: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
8460: 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  nData,          
8470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8480: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 44  ize of buffer pD
8490: 61 74 61 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ata in bytes */.
84a0: 20 20 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c    int *piCookie,
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
84d0: 6f 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  on cookie value 
84e0: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
84f0: 72 65 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  re **ppOut      
8500: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73       /* OUT: Des
8510: 65 72 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74  erialized object
8520: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
8530: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
8540: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
8550: 69 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76  iLvl;.  int nLev
8560: 65 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53  el = 0;.  int nS
8570: 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  egment = 0;.  in
8580: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
85a0: 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
85b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 74 20 70  to allocate at p
85c0: 52 65 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  Ret */.  Fts5Str
85d0: 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30  ucture *pRet = 0
85e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75  ;        /* Stru
85f0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 74 6f 20  cture object to 
8600: 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  return */..  /* 
8610: 47 72 61 62 20 74 68 65 20 63 6f 6f 6b 69 65 20  Grab the cookie 
8620: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 70  value */.  if( p
8630: 69 43 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f  iCookie ) *piCoo
8640: 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  kie = sqlite3Fts
8650: 35 47 65 74 33 32 28 70 44 61 74 61 29 3b 0a 20  5Get32(pData);. 
8660: 20 69 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65   i = 4;..  /* Re
8670: 61 64 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ad the total num
8680: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e  ber of levels an
8690: 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  d segments from 
86a0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
86b0: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20  .  ** structure 
86c0: 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20  record.  */.  i 
86d0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
86e0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c  32(&pData[i], nL
86f0: 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74  evel);.  i += ft
8700: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8710: 44 61 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e  Data[i], nSegmen
8720: 74 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a  t);.  nByte = (.
8730: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
8740: 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20  5Structure) +   
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8760: 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75   /* Main structu
8770: 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  re */.      size
8780: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
8790: 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c  Level) * (nLevel
87a0: 29 20 20 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c  )      /* aLevel
87b0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b  [] array */.  );
87c0: 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 53  .  pRet = (Fts5S
87d0: 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65  tructure*)sqlite
87e0: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
87f0: 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  &rc, nByte);..  
8800: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
8810: 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  pRet->nLevel = n
8820: 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d  Level;.    pRet-
8830: 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67  >nSegment = nSeg
8840: 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73  ment;.    i += s
8850: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
8860: 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74  &pData[i], &pRet
8870: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
8880: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  ;..    for(iLvl=
8890: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
88a0: 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b   && iLvl<nLevel;
88b0: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
88c0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
88d0: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74  el *pLvl = &pRet
88e0: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
88f0: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c        int nTotal
8900: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
8910: 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  ;..      i += ft
8920: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8930: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
8940: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20  Merge);.      i 
8950: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
8960: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
8970: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  otal);.      ass
8980: 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76  ert( nTotal>=pLv
8990: 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20  l->nMerge );.   
89a0: 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
89b0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
89c0: 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
89d0: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
89e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f  , .          nTo
89f0: 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  tal * sizeof(Fts
8a00: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
8a10: 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  t).      );..   
8a20: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8a30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8a40: 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f  pLvl->nSeg = nTo
8a50: 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  tal;.        for
8a60: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54  (iSeg=0; iSeg<nT
8a70: 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  otal; iSeg++){. 
8a80: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
8a90: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8aa0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
8ab0: 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
8ac0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
8ad0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
8ae0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
8af0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48  l->aSeg[iSeg].nH
8b00: 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  eight);.        
8b10: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
8b20: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
8b30: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
8b40: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
8b50: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
8b60: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8b70: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
8b80: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61  Seg[iSeg].pgnoLa
8b90: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
8ba0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8bb0: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
8bc0: 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a  eRelease(pRet);.
8bd0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
8be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8bf0: 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20    }..  *ppOut = 
8c00: 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  pRet;.  return r
8c10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  c;.}../*.**.*/.s
8c20: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
8c30: 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
8c40: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53  (int *pRc, Fts5S
8c50: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
8c60: 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  uct){.  if( *pRc
8c70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8c80: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
8c90: 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
8ca0: 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e  truct;.    int n
8cb0: 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
8cc0: 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74  >nLevel;.    int
8cd0: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
8ce0: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
8cf0: 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20  ructure) +      
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8d10: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
8d20: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
8d30: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
8d40: 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29  el) * (nLevel+1)
8d50: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
8d60: 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20  ray */.    );.. 
8d70: 20 20 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c     pStruct = sql
8d80: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74  ite3_realloc(pSt
8d90: 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ruct, nByte);.  
8da0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
8db0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
8dc0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e  Struct->aLevel[n
8dd0: 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f  Level], 0, sizeo
8de0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
8df0: 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53  evel));.      pS
8e00: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b  truct->nLevel++;
8e10: 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74  .      *ppStruct
8e20: 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20   = pStruct;.    
8e30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
8e40: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8e50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8e60: 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65  *.** Extend leve
8e70: 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74  l iLvl so that t
8e80: 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
8e90: 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61   at least nExtra
8ea0: 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74   more.** segment
8eb0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
8ec0: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45  d fts5StructureE
8ed0: 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e  xtendLevel(.  in
8ee0: 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53  t *pRc, .  Fts5S
8ef0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
8f00: 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  t, .  int iLvl, 
8f10: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a  .  int nExtra, .
8f20: 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b    int bInsert.){
8f30: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
8f40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
8f50: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
8f60: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
8f70: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
8f80: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
8f90: 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b  reSegment *aNew;
8fa0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  .    int nByte;.
8fb0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 70 4c  .    nByte = (pL
8fc0: 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72  vl->nSeg + nExtr
8fd0: 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  a) * sizeof(Fts5
8fe0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8ff0: 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  );.    aNew = sq
9000: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c  lite3_realloc(pL
9010: 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65 29  vl->aSeg, nByte)
9020: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 20 29  ;.    if( aNew )
9030: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 73  {.      if( bIns
9040: 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ert==0 ){.      
9050: 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70    memset(&aNew[p
9060: 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73  Lvl->nSeg], 0, s
9070: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
9080: 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45  ureSegment) * nE
9090: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtra);.      }el
90a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
90b0: 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nMove = pLvl->nS
90c0: 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  eg * sizeof(Fts5
90d0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
90e0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
90f0: 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d  ve(&aNew[nExtra]
9100: 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a  , aNew, nMove);.
9110: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
9120: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  New, 0, sizeof(F
9130: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
9140: 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a  ent) * nExtra);.
9150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
9160: 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b  vl->aSeg = aNew;
9170: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9180: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
9190: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
91a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20  .}../*.** Read, 
91b0: 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  deserialize and 
91c0: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
91d0: 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
91e0: 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63  ** The Fts5Struc
91f0: 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e  ture.aLevel[] an
9200: 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63  d each Fts5Struc
9210: 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d  tureLevel.aSeg[]
9220: 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76   array.** are ov
9230: 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20  er-allocated as 
9240: 64 65 73 63 72 69 62 65 64 20 66 6f 72 20 66 75  described for fu
9250: 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63  nction fts5Struc
9260: 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a  tureDecode() .**
9270: 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   above..**.** If
9280: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9290: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
92a0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
92b0: 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65  code left in the
92c0: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61  .** Fts5Index ha
92d0: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
92e0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
92f0: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
9300: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
9310: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
9320: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
9330: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
9340: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
9350: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  d(Fts5Index *p){
9360: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
9370: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
9380: 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  fig;.  Fts5Struc
9390: 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20  ture *pRet = 0; 
93a0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
93b0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
93c0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93e0: 2f 2a 20 25 5f 64 61 74 61 20 65 6e 74 72 79 20  /* %_data entry 
93f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 74 72 75 63  containing struc
9400: 74 75 72 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ture record */. 
9410: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20   int iCookie;   
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
9440: 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 0a 20 20 70  n cookie */..  p
9450: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
9460: 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55  ead(p, FTS5_STRU
9470: 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20  CTURE_ROWID);.  
9480: 69 66 28 20 21 70 44 61 74 61 20 29 20 72 65 74  if( !pData ) ret
9490: 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 72 63 20 3d  urn 0;.  p->rc =
94a0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
94b0: 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70  code(pData->p, p
94c0: 44 61 74 61 2d 3e 6e 2c 20 26 69 43 6f 6f 6b 69  Data->n, &iCooki
94d0: 65 2c 20 26 70 52 65 74 29 3b 0a 0a 20 20 69 66  e, &pRet);..  if
94e0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
94f0: 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e 69  OK && pConfig->i
9500: 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 20  Cookie!=iCookie 
9510: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
9520: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
9530: 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 69 43  Load(pConfig, iC
9540: 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 0a 20 20 66  ookie);.  }..  f
9550: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
9560: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Data);.  if( p->
9570: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9580: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
9590: 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b  reRelease(pRet);
95a0: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
95b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
95c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
95d0: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
95e0: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69  er of segments i
95f0: 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  n index structur
9600: 65 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 0a  e pStruct. This.
9610: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  ** function is o
9620: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 61 73  nly ever used as
9630: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
9640: 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f  ) conditions..*/
9650: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9660: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
9670: 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
9680: 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73 35 53  ntSegments(Fts5S
9690: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
96a0: 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65  t){.  int nSegme
96b0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
96c0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
96d0: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
96e0: 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75  s */.  if( pStru
96f0: 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  ct ){.    int iL
9700: 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
9710: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
9720: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
9730: 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
9740: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
9750: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
9760: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
9770: 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53    nSegment += pS
9780: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
9790: 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a  vl].nSeg;.    }.
97a0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53    }..  return nS
97b0: 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66  egment;.}.#endif
97c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a  ../*.** Serializ
97d0: 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
97e0: 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63 6f  "structure" reco
97f0: 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rd..**.** If an 
9800: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
9810: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ave an error cod
9820: 65 20 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64  e in the Fts5Ind
9830: 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  ex object. If an
9840: 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c  .** error has al
9850: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
9860: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
9870: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
9880: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
9890: 75 63 74 75 72 65 57 72 69 74 65 28 46 74 73 35  uctureWrite(Fts5
98a0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74  Index *p, Fts5St
98b0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
98c0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
98d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
98e0: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9900: 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65 72 69  * Buffer to seri
9910: 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69 6e 74  alize record int
9920: 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 76  o */.    int iLv
9930: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9940: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
9950: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
9960: 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20  h levels */.    
9970: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9990: 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f   Cookie value to
99a0: 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20 20 61   store */..    a
99b0: 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
99c0: 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74  nSegment==fts5St
99d0: 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
99e0: 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b  ents(pStruct) );
99f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66  .    memset(&buf
9a00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
9a10: 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f  Buffer));..    /
9a20: 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72  * Append the cur
9a30: 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69  rent configurati
9a40: 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20  on cookie */.   
9a50: 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70 43   iCookie = p->pC
9a60: 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a  onfig->iCookie;.
9a70: 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69 65 3c      if( iCookie<
9a80: 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20 30 3b  0 ) iCookie = 0;
9a90: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
9aa0: 70 70 65 6e 64 33 32 28 26 70 2d 3e 72 63 2c 20  ppend32(&p->rc, 
9ab0: 26 62 75 66 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a  &buf, iCookie);.
9ac0: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
9ad0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
9ae0: 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63  rc, &buf, pStruc
9af0: 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20  t->nLevel);.    
9b00: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9b10: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9b20: 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53  buf, pStruct->nS
9b30: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 66 74 73  egment);.    fts
9b40: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
9b50: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
9b60: 2c 20 28 69 36 34 29 70 53 74 72 75 63 74 2d 3e  , (i64)pStruct->
9b70: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
9b80: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
9b90: 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
9ba0: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
9bb0: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 20        int iSeg; 
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
9be0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
9bf0: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  egments */.     
9c00: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9c10: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
9c20: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
9c30: 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  l];.      fts5Bu
9c40: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
9c50: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
9c60: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20  Lvl->nMerge);.  
9c70: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9c80: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9c90: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
9ca0: 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Seg);.      asse
9cb0: 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
9cc0: 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
9cd0: 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d  .      for(iSeg=
9ce0: 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53  0; iSeg<pLvl->nS
9cf0: 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
9d00: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
9d10: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
9d20: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
9d30: 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69  aSeg[iSeg].iSegi
9d40: 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
9d50: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9d60: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9d70: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
9d80: 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20  ].nHeight);.    
9d90: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9da0: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9db0: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61  c, &buf, pLvl->a
9dc0: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69  Seg[iSeg].pgnoFi
9dd0: 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  rst);.        ft
9de0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9df0: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9e00: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9e10: 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  eg].pgnoLast);. 
9e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9e30: 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
9e40: 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  p, FTS5_STRUCTUR
9e50: 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20  E_ROWID, buf.p, 
9e60: 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35  buf.n);.    fts5
9e70: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
9e80: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73  ;.  }.}..#if 0.s
9e90: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
9ea0: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e  ebugStructure(in
9eb0: 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46  t*,Fts5Buffer*,F
9ec0: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a  ts5Structure*);.
9ed0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9ee0: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63  PrintStructure(c
9ef0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74  onst char *zCapt
9f00: 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75  ion, Fts5Structu
9f10: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
9f20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9f30: 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  OK;.  Fts5Buffer
9f40: 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
9f50: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  buf, 0, sizeof(b
9f60: 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75  uf));.  fts5Debu
9f70: 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  gStructure(&rc, 
9f80: 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a  &buf, pStruct);.
9f90: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
9fa0: 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43  , "%s: %s\n", zC
9fb0: 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a  aption, buf.p);.
9fc0: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
9fd0: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
9fe0: 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73  ee(&buf);.}.#els
9ff0: 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50  e.# define fts5P
a000: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c  rintStructure(x,
a010: 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  y).#endif..stati
a020: 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e  c int fts5Segmen
a030: 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74  tSize(Fts5Struct
a040: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
a050: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20  ){.  return 1 + 
a060: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
a070: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
a080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a090: 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65  n a copy of inde
a0a0: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
a0b0: 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f  uct. Except, pro
a0c0: 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a  mote as many .**
a0d0: 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73   segments as pos
a0e0: 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69  sible to level i
a0f0: 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f  Promote. If an O
a100: 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  OM occurs, NULL 
a110: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
a120: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a130: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
a140: 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e  moteTo(.  Fts5In
a150: 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50  dex *p,.  int iP
a160: 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a  romote,.  int sz
a170: 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53  Promote,.  Fts5S
a180: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
a190: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69  t.){.  int il, i
a1a0: 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  s;.  Fts5Structu
a1b0: 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20  reLevel *pOut = 
a1c0: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
a1d0: 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69  [iPromote];..  i
a1e0: 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d  f( pOut->nMerge=
a1f0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c  =0 ){.    for(il
a200: 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c  =iPromote+1; il<
a210: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
a220: 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74   il++){.      Ft
a230: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
a240: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
a250: 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20  t->aLevel[il];. 
a260: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
a270: 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a  Merge ) return;.
a280: 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76        for(is=pLv
a290: 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30  l->nSeg-1; is>=0
a2a0: 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20  ; is--){.       
a2b0: 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65   int sz = fts5Se
a2c0: 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d  gmentSize(&pLvl-
a2d0: 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20  >aSeg[is]);.    
a2e0: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f      if( sz>szPro
a2f0: 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  mote ) return;. 
a300: 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
a310: 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
a320: 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
a330: 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29   iPromote, 1, 1)
a340: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
a350: 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
a360: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
a370: 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  t->aSeg, &pLvl->
a380: 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66  aSeg[is], sizeof
a390: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
a3a0: 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20  gment));.       
a3b0: 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20   pOut->nSeg++;. 
a3c0: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
a3d0: 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
a3e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a3f0: 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61  A new segment ha
a400: 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74  s just been writ
a410: 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76  ten to level iLv
a420: 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  l of index struc
a430: 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e  ture.** pStruct.
a440: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
a450: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79  etermines if any
a460: 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64   segments should
a470: 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20   be promoted.** 
a480: 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67  as a result. Seg
a490: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
a4a0: 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ed in two scenar
a4b0: 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
a4c0: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
a4d0: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73  ust written is s
a4e0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20  maller than one 
a4f0: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
a500: 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20  .**      within 
a510: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70  the previous pop
a520: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74  ulated level, it
a530: 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20   is promoted to 
a540: 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20  the previous.** 
a550: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c       populated l
a560: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29  evel..**.**   b)
a570: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
a580: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
a590: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
a5a0: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
a5b0: 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65  n.**      the ne
a5c0: 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76  xt populated lev
a5d0: 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65  el, then that se
a5e0: 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f  gment, and any o
a5f0: 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  ther adjacent.**
a600: 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74        segments t
a610: 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61  hat are also sma
a620: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ller than the on
a630: 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  e just written, 
a640: 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f  are .**      pro
a650: 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  moted. .**.** If
a660: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
a670: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
a680: 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  ed, the structur
a690: 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61  e object is upda
a6a0: 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63  ted.** to reflec
a6b0: 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  t this..*/.stati
a6c0: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
a6d0: 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46  turePromote(.  F
a6e0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a700: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
a710: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
a720: 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
a730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a740: 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75  dex level just u
a750: 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35  pdated */.  Fts5
a760: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
a770: 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ct          /* I
a780: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
a790: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
a7a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a7b0: 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20     int iTst;.   
a7c0: 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20   int iPromote = 
a7d0: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72  -1;.    int szPr
a7e0: 6f 6d 6f 74 65 3b 20 20 20 20 20 20 20 20 20 20  omote;          
a7f0: 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65        /* Promote
a800: 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73   anything this s
a810: 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a  ize or smaller *
a820: 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  /.    Fts5Struct
a830: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
a840: 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a  ;   /* Segment j
a850: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ust written */. 
a860: 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20     int szSeg;   
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a880: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d   /* Size of segm
a890: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
a8a0: 20 2a 2f 0a 0a 0a 20 20 20 20 70 53 65 67 20 3d   */...    pSeg =
a8b0: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
a8c0: 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74  l[iLvl].aSeg[pSt
a8d0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
a8e0: 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20  l].nSeg-1];.    
a8f0: 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65  szSeg = (1 + pSe
a900: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53  g->pgnoLast - pS
a910: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg->pgnoFirst);.
a920: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
a930: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  r condition (a) 
a940: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d  */.    for(iTst=
a950: 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20  iLvl-1; iTst>=0 
a960: 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
a970: 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30  el[iTst].nSeg==0
a980: 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69  ; iTst--);.    i
a990: 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20  f( iTst>=0 ){.  
a9a0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
a9b0: 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a   int szMax = 0;.
a9c0: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
a9d0: 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d  ureLevel *pTst =
a9e0: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
a9f0: 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 61  l[iTst];.      a
aa00: 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65  ssert( pTst->nMe
aa10: 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rge==0 );.      
aa20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d  for(i=0; i<pTst-
aa30: 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
aa40: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 54       int sz = pT
aa50: 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f  st->aSeg[i].pgno
aa60: 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61 53 65  Last - pTst->aSe
aa70: 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b  g[i].pgnoFirst +
aa80: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
aa90: 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78  sz>szMax ) szMax
aaa0: 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20   = sz;.      }. 
aab0: 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d       if( szMax>=
aac0: 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20  szSeg ){.       
aad0: 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61   /* Condition (a
aae0: 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f  ) is true. Promo
aaf0: 74 65 20 74 68 65 20 6e 65 77 65 73 74 20 73 65  te the newest se
ab00: 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a  gment on level .
ab10: 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20          ** iLvl 
ab20: 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e 20 20  to level iTst.  
ab30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72 6f 6d  */.        iProm
ab40: 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20 20 20  ote = iTst;.    
ab50: 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20      szPromote = 
ab60: 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20  szMax;.      }. 
ab70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
ab80: 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  condition (a) is
ab90: 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d 65   not met, assume
aba0: 20 28 62 29 20 69 73 20 74 72 75 65 2e 20 53 74   (b) is true. St
abb0: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
abc0: 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 6e  ().    ** is a n
abd0: 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20 6e 6f  o-op if it is no
abe0: 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  t.  */.    if( i
abf0: 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20  Promote<0 ){.   
ac00: 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c     iPromote = iL
ac10: 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d  vl;.      szProm
ac20: 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20  ote = szSeg;.   
ac30: 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
ac40: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c  turePromoteTo(p,
ac50: 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f   iPromote, szPro
ac60: 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a  mote, pStruct);.
ac70: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66    }.}.../*.** If
ac80: 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f 66 66   the pIter->iOff
ac90: 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c   offset currentl
aca0: 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  y points to an e
acb0: 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e 67 20  ntry indicating 
acc0: 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 74  one.** or more t
acd0: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 2c 20  erm-less nodes, 
ace0: 61 64 76 61 6e 63 65 20 70 61 73 74 20 69 74 20  advance past it 
acf0: 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d 3e 6e  and set pIter->n
ad00: 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68 65 20  Empty to.** the 
ad10: 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20  number of empty 
ad20: 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f 0a  child nodes..*/.
ad30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ad40: 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e 45  NodeIterGobbleNE
ad50: 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49 74 65  mpty(Fts5NodeIte
ad60: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
ad70: 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 49 74   pIter->iOff<pIt
ad80: 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30 3d 3d  er->nData && 0==
ad90: 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49  (pIter->aData[pI
ada0: 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78 66  ter->iOff] & 0xf
adb0: 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  e) ){.    pIter-
adc0: 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
add0: 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f  >aData[pIter->iO
ade0: 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20 20 20  ff] & 0x01;.    
adf0: 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20  pIter->iOff++;. 
ae00: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
ae10: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
ae20: 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  2(&pIter->aData[
ae30: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 70 49  pIter->iOff], pI
ae40: 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20  ter->nEmpty);.  
ae50: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
ae60: 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20  ->nEmpty = 0;.  
ae70: 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20    pIter->bDlidx 
ae80: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
ae90: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
aea0: 20 6e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   next entry with
aeb0: 69 6e 20 74 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a  in the node..*/.
aec0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
aed0: 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 69 6e 74  NodeIterNext(int
aee0: 20 2a 70 52 63 2c 20 46 74 73 35 4e 6f 64 65 49   *pRc, Fts5NodeI
aef0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
af00: 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3e 3d  f( pIter->iOff>=
af10: 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 29 7b 0a  pIter->nData ){.
af20: 20 20 20 20 70 49 74 65 72 2d 3e 61 44 61 74 61      pIter->aData
af30: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d   = 0;.    pIter-
af40: 3e 69 43 68 69 6c 64 20 2b 3d 20 70 49 74 65 72  >iChild += pIter
af50: 2d 3e 6e 45 6d 70 74 79 3b 0a 20 20 7d 65 6c 73  ->nEmpty;.  }els
af60: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 50 72 65 2c  e{.    int nPre,
af70: 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72   nNew;.    pIter
af80: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
af90: 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72  tVarint32(&pIter
afa0: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
afb0: 4f 66 66 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20  Off], nPre);.   
afc0: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20   pIter->iOff += 
afd0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
afe0: 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49  &pIter->aData[pI
aff0: 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 4e 65 77  ter->iOff], nNew
b000: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 74 65  );.    pIter->te
b010: 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d 32 3b 0a 20  rm.n = nPre-2;. 
b020: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
b030: 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 26 70 49  endBlob(pRc, &pI
b040: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
b050: 20 70 49 74 65 72 2d 3e 61 44 61 74 61 2b 70 49   pIter->aData+pI
b060: 74 65 72 2d 3e 69 4f 66 66 29 3b 0a 20 20 20 20  ter->iOff);.    
b070: 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 6e  pIter->iOff += n
b080: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
b090: 69 43 68 69 6c 64 20 2b 3d 20 28 31 20 2b 20 70  iChild += (1 + p
b0a0: 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20  Iter->nEmpty);. 
b0b0: 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47     fts5NodeIterG
b0c0: 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65  obbleNEmpty(pIte
b0d0: 72 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63  r);.    if( *pRc
b0e0: 20 29 20 70 49 74 65 72 2d 3e 61 44 61 74 61 20   ) pIter->aData 
b0f0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  = 0;.  }.}.../*.
b100: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
b110: 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
b120: 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61  t pIter to itera
b130: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  te through the i
b140: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73 65 67 6d 65  nternal.** segme
b150: 6e 74 20 6e 6f 64 65 20 69 6e 20 70 44 61 74 61  nt node in pData
b160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b170: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69   fts5NodeIterIni
b180: 74 28 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  t(const u8 *aDat
b190: 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 46 74  a, int nData, Ft
b1a0: 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65  s5NodeIter *pIte
b1b0: 72 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  r){.  memset(pIt
b1c0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
b1d0: 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
b1e0: 3e 61 44 61 74 61 20 3d 20 61 44 61 74 61 3b 0a  >aData = aData;.
b1f0: 20 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 3d    pIter->nData =
b200: 20 6e 44 61 74 61 3b 0a 20 20 70 49 74 65 72 2d   nData;.  pIter-
b210: 3e 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 56  >iOff = fts5GetV
b220: 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c 20 70  arint32(aData, p
b230: 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b 0a 20  Iter->iChild);. 
b240: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62   fts5NodeIterGob
b250: 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29  bleNEmpty(pIter)
b260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
b270: 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  any memory alloc
b280: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
b290: 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ator object..*/.
b2a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b2b0: 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46 74 73  NodeIterFree(Fts
b2c0: 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72  5NodeIter *pIter
b2d0: 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  ){.  fts5BufferF
b2e0: 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  ree(&pIter->term
b2f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
b300: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
b310: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
b320: 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f  ument has the fo
b330: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73  llowing fields s
b340: 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  et.** as follows
b350: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
b360: 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73 74  sets up the rest
b370: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
b380: 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70   so that it.** p
b390: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
b3a0: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
b3b0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
b3c0: 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 20 70 6f  *.**   pData: po
b3d0: 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
b3e0: 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a  -index record, .
b3f0: 2a 2a 20 20 20 69 4c 65 61 66 50 67 6e 6f 3a 20  **   iLeafPgno: 
b400: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
b410: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2d 69 6e   this doclist-in
b420: 64 65 78 20 69 73 20 61 73 73 6f 63 69 61 74 65  dex is associate
b430: 64 20 77 69 74 68 2e 0a 2a 2a 0a 2a 2a 20 57 68  d with..**.** Wh
b440: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b450: 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65 72   is called pIter
b460: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20 74  ->iLeafPgno is t
b470: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
b480: 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73  he.** doclist is
b490: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
b4a0: 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75 72   (the one featur
b4b0: 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a  ing the term)..*
b4c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
b4d0: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
b4e0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b4f0: 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 61 74  Iter){.  Fts5Dat
b500: 61 20 2a 70 44 61 74 61 20 3d 20 70 49 74 65 72  a *pData = pIter
b510: 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  ->pData;.  int i
b520: 3b 0a 20 20 69 6e 74 20 62 50 72 65 73 65 6e 74  ;.  int bPresent
b530: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
b540: 65 72 2d 3e 70 44 61 74 61 20 29 3b 0a 20 20 61  er->pData );.  a
b550: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c  ssert( pIter->iL
b560: 65 61 66 50 67 6e 6f 3e 30 20 29 3b 0a 0a 20 20  eafPgno>0 );..  
b570: 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  /* Read the firs
b580: 74 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 41  t rowid value. A
b590: 6e 64 20 74 68 65 20 22 70 72 65 73 65 6e 74 22  nd the "present"
b5a0: 20 66 6c 61 67 20 74 68 61 74 20 66 6f 6c 6c 6f   flag that follo
b5b0: 77 73 20 69 74 2e 20 2a 2f 0a 20 20 70 49 74 65  ws it. */.  pIte
b5c0: 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61  r->iOff += getVa
b5d0: 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 30  rint(&pData->p[0
b5e0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
b5f0: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 62 50 72 65  >iRowid);.  bPre
b600: 73 65 6e 74 20 3d 20 70 44 61 74 61 2d 3e 70 5b  sent = pData->p[
b610: 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 5d 3b 0a  pIter->iOff++];.
b620: 20 20 69 66 28 20 62 50 72 65 73 65 6e 74 20 29    if( bPresent )
b630: 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  {.    i = 0;.  }
b640: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  else{.    /* Cou
b650: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
b660: 20 6c 65 61 64 69 6e 67 20 30 78 30 30 20 62 79   leading 0x00 by
b670: 74 65 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  tes. */.    for(
b680: 69 3d 31 3b 20 70 49 74 65 72 2d 3e 69 4f 66 66  i=1; pIter->iOff
b690: 3c 70 44 61 74 61 2d 3e 6e 3b 20 69 2b 2b 29 7b  <pData->n; i++){
b6a0: 20 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74   .      if( pDat
b6b0: 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66  a->p[pIter->iOff
b6c0: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
b6d0: 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a   pIter->iOff++;.
b6e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
b6f0: 6c 65 73 73 20 77 65 20 61 72 65 20 61 6c 72 65  less we are alre
b700: 61 64 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ady at the end o
b710: 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  f the doclist-in
b720: 64 65 78 2c 20 6c 6f 61 64 20 74 68 65 20 66 69  dex, load the fi
b730: 72 73 74 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  rst.    ** rowid
b740: 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 20 20   value.  */.    
b750: 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c  if( pIter->iOff<
b760: 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20  pData->n ){.    
b770: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
b780: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
b790: 20 67 65 74 56 61 72 69 6e 74 28 26 70 44 61 74   getVarint(&pDat
b7a0: 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66  a->p[pIter->iOff
b7b0: 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b  ], (u64*)&iVal);
b7c0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52  .      pIter->iR
b7d0: 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
b7e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b7f0: 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Iter->bEof = 1;.
b800: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
b810: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20  r->iLeafPgno += 
b820: 28 69 2b 31 29 3b 0a 0a 20 20 70 49 74 65 72 2d  (i+1);..  pIter-
b830: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 49 74  >iFirstOff = pIt
b840: 65 72 2d 3e 69 4f 66 66 3b 0a 20 20 72 65 74 75  er->iOff;.  retu
b850: 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a  rn pIter->bEof;.
b860: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
b870: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
b880: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
b890: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
b8a0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b8b0: 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 44  dxIterNext(Fts5D
b8c0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b8d0: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  {.  Fts5Data *pD
b8e0: 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61  ata = pIter->pDa
b8f0: 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ta;.  int iOff;.
b900: 0a 20 20 66 6f 72 28 69 4f 66 66 3d 70 49 74 65  .  for(iOff=pIte
b910: 72 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  r->iOff; iOff<pD
b920: 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b  ata->n; iOff++){
b930: 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
b940: 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b  p[iOff] ) break;
b950: 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66   .  }..  if( iOf
b960: 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20  f<pData->n ){.  
b970: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
b980: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
b990: 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 49 74 65   += (iOff - pIte
b9a0: 72 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20  r->iOff) + 1;.  
b9b0: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
b9c0: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
b9d0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
b9e0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
b9f0: 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
ba00: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20    pIter->iOff = 
ba10: 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iOff;.  }else{. 
ba20: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
ba30: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
ba40: 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d  n pIter->bEof;.}
ba50: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
ba60: 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74  5DlidxIterEof(Ft
ba70: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
ba80: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
ba90: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  ){.  return pIte
baa0: 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74  r->bEof;.}..stat
bab0: 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64  ic void fts5Dlid
bac0: 78 49 74 65 72 4c 61 73 74 28 46 74 73 35 44 6c  xIterLast(Fts5Dl
bad0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
bae0: 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78  .  if( fts5Dlidx
baf0: 49 74 65 72 46 69 72 73 74 28 70 49 74 65 72 29  IterFirst(pIter)
bb00: 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  ==0 ){.    while
bb10: 28 20 30 3d 3d 66 74 73 35 44 6c 69 64 78 49 74  ( 0==fts5DlidxIt
bb20: 65 72 4e 65 78 74 28 70 49 74 65 72 29 20 29 3b  erNext(pIter) );
bb30: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
bb40: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 0;.  }.}..sta
bb50: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
bb60: 78 49 74 65 72 50 72 65 76 28 46 74 73 35 44 6c  xIterPrev(Fts5Dl
bb70: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
bb80: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49  .  int iOff = pI
bb90: 74 65 72 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73  ter->iOff;..  as
bba0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f  sert( pIter->bEo
bbb0: 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f  f==0 );.  if( iO
bbc0: 66 66 3c 3d 70 49 74 65 72 2d 3e 69 46 69 72 73  ff<=pIter->iFirs
bbd0: 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 49 74 65  tOff ){.    pIte
bbe0: 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d  r->bEof = 1;.  }
bbf0: 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20  else{.    u8 *a 
bc00: 3d 20 70 49 74 65 72 2d 3e 70 44 61 74 61 2d 3e  = pIter->pData->
bc10: 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  p;.    i64 iVal;
bc20: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
bc30: 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ..    /* Current
bc40: 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74  ly iOff points t
bc50: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
bc60: 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68   of a varint. Th
bc70: 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  is block .    **
bc80: 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66   decrements iOff
bc90: 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
bca0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
bcb0: 74 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  te of the previo
bcc0: 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e  us .    ** varin
bcd0: 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e  t. Taking care n
bce0: 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d  ot to read any m
bcf0: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
bd00: 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a  that occur.    *
bd10: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66  * before the buf
bd20: 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  fer in memory.  
bd30: 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  */.    iLimit = 
bd40: 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39  (iOff>9 ? iOff-9
bd50: 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69   : 0);.    for(i
bd60: 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d  Off--; iOff>iLim
bd70: 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20  it; iOff--){.   
bd80: 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31     if( (a[iOff-1
bd90: 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62  ] & 0x80)==0 ) b
bda0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
bdb0: 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f   getVarint(&a[iO
bdc0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
bdd0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
bde0: 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20  owid -= iVal;.  
bdf0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
be00: 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b  no--;..    /* Sk
be10: 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73  ip backwards pas
be20: 73 65 64 20 61 6e 79 20 30 78 30 30 20 62 79 74  sed any 0x00 byt
be30: 65 73 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  es. */.    while
be40: 28 20 69 4f 66 66 3e 70 49 74 65 72 2d 3e 69 46  ( iOff>pIter->iF
be50: 69 72 73 74 4f 66 66 20 0a 20 20 20 20 20 20 20  irstOff .       
be60: 20 26 26 20 61 5b 69 4f 66 66 2d 31 5d 3d 3d 30   && a[iOff-1]==0
be70: 78 30 30 20 26 26 20 28 61 5b 69 4f 66 66 2d 32  x00 && (a[iOff-2
be80: 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 0a 20 20  ] & 0x80)==0 .  
be90: 20 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 2d    ){.      iOff-
bea0: 2d 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  -;.      pIter->
beb0: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
bec0: 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f   }.    pIter->iO
bed0: 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a  ff = iOff;.  }..
bee0: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
bef0: 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bEof;.}..static 
bf00: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66  Fts5DlidxIter *f
bf10: 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
bf20: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
bf30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bf40: 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b      /* Fts5 Back
bf50: 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
bf60: 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ithin */.  int b
bf70: 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
bf80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
bf90: 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20  ue for ORDER BY 
bfa0: 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ASC */.  int iSe
bfb0: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
bfc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
bfd0: 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
bfe0: 69 4c 65 61 66 50 67 20 20 20 20 20 20 20 20 20  iLeafPg         
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c000: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
c010: 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f  to load dlidx fo
c020: 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c  r */.){.  Fts5Dl
c030: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 3b 0a  idxIter *pIter;.
c040: 0a 20 20 70 49 74 65 72 20 3d 20 28 46 74 73 35  .  pIter = (Fts5
c050: 44 6c 69 64 78 49 74 65 72 2a 29 66 74 73 35 49  DlidxIter*)fts5I
c060: 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
c070: 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  of(Fts5DlidxIter
c080: 29 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 3d  ));.  if( pIter=
c090: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
c0a0: 20 20 70 49 74 65 72 2d 3e 70 44 61 74 61 20 3d    pIter->pData =
c0b0: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
c0c0: 20 46 54 53 35 5f 44 4f 43 4c 49 53 54 5f 49 44   FTS5_DOCLIST_ID
c0d0: 58 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  X_ROWID(iSegid, 
c0e0: 69 4c 65 61 66 50 67 29 29 3b 0a 20 20 69 66 28  iLeafPg));.  if(
c0f0: 20 70 49 74 65 72 2d 3e 70 44 61 74 61 3d 3d 30   pIter->pData==0
c100: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c110: 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20  free(pIter);.   
c120: 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65   pIter = 0;.  }e
c130: 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
c140: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61  iLeafPgno = iLea
c150: 66 50 67 3b 0a 20 20 20 20 69 66 28 20 62 52 65  fPg;.    if( bRe
c160: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  v==0 ){.      ft
c170: 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74  s5DlidxIterFirst
c180: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c  (pIter);.    }el
c190: 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  se{.      fts5Dl
c1a0: 69 64 78 49 74 65 72 4c 61 73 74 28 70 49 74 65  idxIterLast(pIte
c1b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
c1c0: 20 72 65 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d   return pIter;.}
c1d0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64  ../*.** Free a d
c1e0: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65  oclist-index ite
c1f0: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c  rator object all
c200: 6f 63 61 74 65 64 20 62 79 20 66 74 73 35 44 6c  ocated by fts5Dl
c210: 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a  idxIterInit()..*
c220: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
c230: 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
c240: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
c250: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
c260: 65 72 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61  er ){.    fts5Da
c270: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
c280: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  >pData);.    sql
c290: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
c2a0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
c2b0: 76 6f 69 64 20 66 74 73 35 4c 65 61 66 48 65 61  void fts5LeafHea
c2c0: 64 65 72 28 46 74 73 35 44 61 74 61 20 2a 70 4c  der(Fts5Data *pL
c2d0: 65 61 66 2c 20 69 6e 74 20 2a 70 69 52 6f 77 69  eaf, int *piRowi
c2e0: 64 2c 20 69 6e 74 20 2a 70 69 54 65 72 6d 29 7b  d, int *piTerm){
c2f0: 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 28 69  .  *piRowid = (i
c300: 6e 74 29 66 74 73 35 47 65 74 55 31 36 28 26 70  nt)fts5GetU16(&p
c310: 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 2a  Leaf->p[0]);.  *
c320: 70 69 54 65 72 6d 20 3d 20 28 69 6e 74 29 66 74  piTerm = (int)ft
c330: 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
c340: 3e 70 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >p[2]);.}../*.**
c350: 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c   Load the next l
c360: 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68  eaf page into th
c370: 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  e segment iterat
c380: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
c390: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
c3a0: 78 74 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  xtPage(.  Fts5In
c3b0: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
c3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
c3d0: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
c3e0: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
c3f0: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
c400: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
c410: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20  r to advance to 
c420: 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  next page */.){.
c430: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
c440: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
c450: 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74  Iter->pSeg;.  ft
c460: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
c470: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
c480: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b  Iter->iLeafPgno+
c490: 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  +;.  if( pIter->
c4a0: 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d  iLeafPgno<=pSeg-
c4b0: 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
c4c0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
c4d0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
c4e0: 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45  .        FTS5_SE
c4f0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
c500: 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74  ->iSegid, 0, pIt
c510: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  er->iLeafPgno). 
c520: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
c530: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
c540: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
c550: 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69  * Argument p poi
c560: 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
c570: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76 61 72  containing a var
c580: 69 6e 74 20 74 6f 20 62 65 20 69 6e 74 65 72 70  int to be interp
c590: 72 65 74 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f  reted as a.** po
c5a0: 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65  sition list size
c5b0: 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65   field. Read the
c5c0: 20 76 61 72 69 6e 74 20 61 6e 64 20 72 65 74 75   varint and retu
c5d0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
c5e0: 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20   bytes.** read. 
c5f0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
c600: 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74  , set *pnSz to t
c610: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
c620: 65 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69  es in the positi
c630: 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20  on.** list, and 
c640: 2a 70 62 44 65 6c 20 74 6f 20 74 72 75 65 20 69  *pbDel to true i
c650: 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61  f the delete fla
c660: 67 20 69 73 20 73 65 74 2c 20 6f 72 20 66 61 6c  g is set, or fal
c670: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
c680: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
c690: 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 63  GetPoslistSize(c
c6a0: 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e 74 20  onst u8 *p, int 
c6b0: 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65  *pnSz, int *pbDe
c6c0: 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20  l){.  int nSz;. 
c6d0: 20 69 6e 74 20 6e 20 3d 20 66 74 73 35 47 65 74   int n = fts5Get
c6e0: 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 53 7a 29  Varint32(p, nSz)
c6f0: 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e  ;.  assert_nc( n
c700: 53 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a  Sz>=0 );.  *pnSz
c710: 20 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44   = nSz/2;.  *pbD
c720: 65 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30  el = nSz & 0x000
c730: 31 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  1;.  return n;.}
c740: 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49  ../*.** Fts5SegI
c750: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
c760: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
c770: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
c780: 74 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74  te of a.** posit
c790: 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
c7a0: 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61  eld. Read the va
c7b0: 6c 75 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64  lue of the field
c7c0: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a   and store it.**
c7d0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
c7e0: 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a  g variables:.**.
c7f0: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
c800: 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53  .nPos.**   Fts5S
c810: 65 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a  egIter.bDel.**.*
c820: 2a 20 4c 65 61 76 65 20 46 74 73 35 53 65 67 49  * Leave Fts5SegI
c830: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
c840: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
c850: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
c860: 65 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c  e .** position l
c870: 69 73 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20  ist content (if 
c880: 61 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  any)..*/.static 
c890: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
c8a0: 4c 6f 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64  LoadNPos(Fts5Ind
c8b0: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
c8c0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
c8d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
c8e0: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  OK ){.    int iO
c8f0: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
c900: 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66  fOffset;  /* Off
c910: 73 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a  set to read at *
c920: 2f 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  /.    if( iOff>=
c930: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20  pIter->pLeaf->n 
c940: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
c950: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
c960: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c970: 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 26 70  const u8 *a = &p
c980: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69  Iter->pLeaf->p[i
c990: 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 49 74 65  Off];.      pIte
c9a0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
c9b0: 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
c9c0: 53 69 7a 65 28 61 2c 20 26 70 49 74 65 72 2d 3e  Size(a, &pIter->
c9d0: 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e 62 44  nPos, &pIter->bD
c9e0: 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  el);.    }.  }.}
c9f0: 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49  ../*.** Fts5SegI
ca00: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
ca10: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
ca20: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
ca30: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e  te of the .** "n
ca40: 53 75 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66  Suffix" field of
ca50: 20 61 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f   a term. Functio
ca60: 6e 20 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65  n parameter nKee
ca70: 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  p contains the v
ca80: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22  alue.** of the "
ca90: 6e 50 72 65 66 69 78 22 20 66 69 65 6c 64 20 28  nPrefix" field (
caa0: 69 66 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65  if there was one
cab0: 20 2d 20 69 74 20 69 73 20 70 61 73 73 65 64 20   - it is passed 
cac0: 30 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20  0 if this is.** 
cad0: 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 69  the first term i
cae0: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a  n the segment)..
caf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
cb00: 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a  ion populates:.*
cb10: 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  *.**   Fts5SegIt
cb20: 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73  er.term.**   Fts
cb30: 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a  5SegIter.rowid.*
cb40: 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  *.** accordingly
cb50: 20 61 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73   and leaves (Fts
cb60: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
cb70: 66 73 65 74 29 20 73 65 74 20 74 6f 20 74 68 65  fset) set to the
cb80: 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74   content of.** t
cb90: 68 65 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f  he first positio
cba0: 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69  n list. The posi
cbb0: 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67  tion list belong
cbc0: 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20  ing to document 
cbd0: 0a 2a 2a 20 28 46 74 73 35 53 65 67 49 74 65 72  .** (Fts5SegIter
cbe0: 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61  .iRowid)..*/.sta
cbf0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
cc00: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73  IterLoadTerm(Fts
cc10: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
cc20: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
cc30: 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20  nt nKeep){.  u8 
cc40: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
cc50: 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  f->p;        /* 
cc60: 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64  Buffer to read d
cc70: 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ata from */.  in
cc80: 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
cc90: 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a  iLeafOffset;  /*
cca0: 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20   Offset to read 
ccb0: 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  at */.  int nNew
ccc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ccd0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
cce0: 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a   of new data */.
ccf0: 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  .  iOff += fts5G
cd00: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
cd10: 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49  ff], nNew);.  pI
cd20: 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b  ter->term.n = nK
cd30: 65 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65  eep;.  fts5Buffe
cd40: 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
cd50: 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
cd60: 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d  , nNew, &a[iOff]
cd70: 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65  );.  iOff += nNe
cd80: 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  w;.  pIter->iTer
cd90: 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  mLeafOffset = iO
cda0: 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65  ff;.  pIter->iTe
cdb0: 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74  rmLeafPgno = pIt
cdc0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  er->iLeafPgno;. 
cdd0: 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72   if( iOff>=pIter
cde0: 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20  ->pLeaf->n ){.  
cdf0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
ce00: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
ce10: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
ce20: 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
ce30: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ce40: 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
ce50: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
ce60: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
ce70: 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b   }.    iOff = 4;
ce80: 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e  .    a = pIter->
ce90: 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20  pLeaf->p;.  }.  
cea0: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
ceb0: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
cec0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
ced0: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70 49 74 65  >iRowid);.  pIte
cee0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
cef0: 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
cf00: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69  Initialize the i
cf10: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
cf20: 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20  Iter to iterate 
cf30: 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74 72  through the entr
cf40: 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e  ies in.** segmen
cf50: 74 20 70 53 65 67 2e 20 54 68 65 20 69 74 65 72  t pSeg. The iter
cf60: 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  ator is left poi
cf70: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
cf80: 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20 0a 2a  st entry when .*
cf90: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
cfa0: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
cfb0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
cfc0: 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
cfd0: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
cfe0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
cff0: 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
d000: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
d010: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
d020: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d030: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
d040: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
d050: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
d060: 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
d070: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
d080: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
d090: 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
d0a0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
d0b0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20  egment *pSeg,   
d0c0: 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
d0d0: 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20   of segment */. 
d0e0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
d0f0: 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
d100: 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f   /* Object to po
d110: 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  pulate */.){.  i
d120: 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  f( pSeg->pgnoFir
d130: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  st==0 ){.    /* 
d140: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
d150: 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 62  the segment is b
d160: 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e 20  eing used as an 
d170: 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63 72  input to an incr
d180: 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d  emental.    ** m
d190: 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61 74  erge and all dat
d1a0: 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
d1b0: 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53 65  en "trimmed". Se
d1c0: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a  e function.    *
d1d0: 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e  * fts5TrimSegmen
d1e0: 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  ts() for details
d1f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
d200: 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  eave the iterato
d210: 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20  r empty..    ** 
d220: 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
d230: 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d 3e  see the (pIter->
d240: 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61 73  pLeaf==0) and as
d250: 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74 6f  sume the iterato
d260: 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20 45  r is.    ** at E
d270: 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20  OF already. */. 
d280: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
d290: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  ->pLeaf==0 );.  
d2a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
d2b0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
d2c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d  TE_OK ){.    mem
d2d0: 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
d2e0: 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
d2f0: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d     pIter->pSeg =
d300: 20 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72   pSeg;.    pIter
d310: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53  ->iLeafPgno = pS
d320: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b  eg->pgnoFirst-1;
d330: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
d340: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
d350: 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
d360: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d370: 29 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  ){.    u8 *a = p
d380: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
d390: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d3a0: 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
d3b0: 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
d3c0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
d3d0: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29  erm(p, pIter, 0)
d3e0: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
d3f0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
d400: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
d410: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d420: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
d430: 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73  led on iterators
d440: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
d450: 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65  s to.** Fts5Inde
d460: 78 51 75 65 72 79 28 29 20 77 69 74 68 20 74 68  xQuery() with th
d470: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
d480: 59 5f 44 45 53 43 20 66 6c 61 67 20 73 65 74 2e  Y_DESC flag set.
d490: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
d4a0: 74 6f 72 20 69 73 20 69 6e 20 61 6e 20 75 6e 75  tor is in an unu
d4b0: 73 75 61 6c 20 73 74 61 74 65 20 77 68 65 6e 20  sual state when 
d4c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d4d0: 20 63 61 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20   called: the.** 
d4e0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
d4f0: 66 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c 65  fOffset variable
d500: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
d510: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 74 61  ffset of the sta
d520: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73  rt of.** the pos
d530: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
d540: 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69  field for the fi
d550: 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  rst relevant row
d560: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  id on the page..
d570: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 72  ** Fts5SegIter.r
d580: 6f 77 69 64 20 69 73 20 73 65 74 2c 20 62 75 74  owid is set, but
d590: 20 6e 50 6f 73 20 61 6e 64 20 62 44 65 6c 20 61   nPos and bDel a
d5a0: 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  re not..**.** Th
d5b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61  is function adva
d5c0: 6e 63 65 73 20 74 68 65 20 69 74 65 72 61 74 6f  nces the iterato
d5d0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
d5e0: 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
d5f0: 0a 2a 2a 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  .** relevant row
d600: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  id on the page a
d610: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
d620: 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  , initializes th
d630: 65 20 0a 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73  e .** aRowidOffs
d640: 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f  et[] and iRowidO
d650: 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e  ffset variables.
d660: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
d670: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69  he iterator.** i
d680: 73 20 69 6e 20 69 74 73 20 72 65 67 75 6c 61 72  s in its regular
d690: 20 73 74 61 74 65 20 2d 20 46 74 73 35 53 65 67   state - Fts5Seg
d6a0: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
d6b0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
d6c0: 69 72 73 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20  irst.** byte of 
d6d0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
d6e0: 74 20 63 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69  t content associ
d6f0: 61 74 65 64 20 77 69 74 68 20 73 61 69 64 20 72  ated with said r
d700: 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owid..*/.static 
d710: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d720: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
d730: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d740: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d750: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74  ){.  int n = pIt
d760: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 20 20  er->pLeaf->n;.  
d770: 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69  int i = pIter->i
d780: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38  LeafOffset;.  u8
d790: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
d7a0: 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f  af->p;.  int iRo
d7b0: 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  widOffset = 0;..
d7c0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
d7d0: 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30    i64 iDelta = 0
d7e0: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  ;.    int nPos;.
d7f0: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
d800: 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65  .    i += fts5Ge
d810: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
d820: 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  i], &nPos, &bDum
d830: 6d 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50  my);.    i += nP
d840: 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e  os;.    if( i>=n
d850: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20   ) break;.    i 
d860: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b  += getVarint(&a[
d870: 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  i], (u64*)&iDelt
d880: 61 29 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c  a);.    if( iDel
d890: 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ta==0 ) break;. 
d8a0: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
d8b0: 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20   += iDelta;..   
d8c0: 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65   if( iRowidOffse
d8d0: 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64  t>=pIter->nRowid
d8e0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
d8f0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72  int nNew = pIter
d900: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b  ->nRowidOffset +
d910: 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   8;.      int *a
d920: 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  New = (int*)sqli
d930: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65  te3_realloc(pIte
d940: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c  r->aRowidOffset,
d950: 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74   nNew*sizeof(int
d960: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e  ));.      if( aN
d970: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
d980: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
d990: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
d9a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d9b0: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
d9c0: 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a  dOffset = aNew;.
d9d0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f        pIter->nRo
d9e0: 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77  widOffset = nNew
d9f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74  ;.    }..    pIt
da00: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
da10: 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d  [iRowidOffset++]
da20: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
da30: 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72  ffset;.    pIter
da40: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
da50: 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  i;.  }.  pIter->
da60: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69  iRowidOffset = i
da70: 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66  RowidOffset;.  f
da80: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
da90: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  os(p, pIter);.}.
daa0: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
dab0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
dac0: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
dad0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
dae0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
daf0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
db00: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
db10: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
db20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
db30: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
db40: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
db50: 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61  M );..  fts5Data
db60: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
db70: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
db80: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69  pLeaf = 0;.  whi
db90: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
dba0: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69  E_OK && pIter->i
dbb0: 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
dbc0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
dbd0: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
dbe0: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
dbf0: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
dc00: 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61   pNew = fts5Data
dc10: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
dc20: 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20  MENT_ROWID(.    
dc30: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65        pIter->pSe
dc40: 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49  g->iSegid, 0, pI
dc50: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20  ter->iLeafPgno. 
dc60: 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70     ));.    if( p
dc70: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  New ){.      if(
dc80: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
dc90: 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  o==pIter->iTermL
dca0: 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
dcb0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
dcc0: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e  ermLeafOffset<pN
dcd0: 65 77 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20  ew->n ){.       
dce0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
dcf0: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
dd00: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
dd10: 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54  fset = pIter->iT
dd20: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ermLeafOffset;. 
dd30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dd40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
dd50: 74 20 69 52 6f 77 69 64 4f 66 66 2c 20 64 75 6d  t iRowidOff, dum
dd60: 6d 79 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  my;.        fts5
dd70: 4c 65 61 66 48 65 61 64 65 72 28 70 4e 65 77 2c  LeafHeader(pNew,
dd80: 20 26 69 52 6f 77 69 64 4f 66 66 2c 20 26 64 75   &iRowidOff, &du
dd90: 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  mmy);.        if
dda0: 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20  ( iRowidOff ){. 
ddb0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ddc0: 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20  pLeaf = pNew;.  
ddd0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
dde0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52 6f  LeafOffset = iRo
ddf0: 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  widOff;.        
de00: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
de10: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
de20: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  f ){.        u8 
de30: 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65  *a = &pIter->pLe
de40: 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65  af->p[pIter->iLe
de50: 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20  afOffset];.     
de60: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
de70: 66 66 73 65 74 20 2b 3d 20 67 65 74 56 61 72 69  ffset += getVari
de80: 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74  nt(a, (u64*)&pIt
de90: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
dea0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
deb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dec0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
ded0: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a  (pNew);.      }.
dee0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
def0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
df00: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
df10: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
df20: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
df30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
df40: 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61  rue if the itera
df50: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
df60: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
df70: 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
df80: 6f 69 6e 74 73 20 74 6f 20 61 20 64 65 6c 65 74  oints to a delet
df90: 65 20 6d 61 72 6b 65 72 2e 20 41 20 64 65 6c 65  e marker. A dele
dfa0: 74 65 20 6d 61 72 6b 65 72 20 69 73 20 61 6e 20  te marker is an 
dfb0: 65 6e 74 72 79 20 77 69 74 68 20 61 20 30 20 62  entry with a 0 b
dfc0: 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d  yte.** position-
dfd0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
dfe0: 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
dff0: 72 49 73 45 6d 70 74 79 28 46 74 73 35 49 6e 64  rIsEmpty(Fts5Ind
e000: 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69  ex *p, Fts5Multi
e010: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
e020: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
e030: 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
e040: 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73  Seg[pIter->aFirs
e050: 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20  t[1].iFirst];.  
e060: 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
e070: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65 67  QLITE_OK && pSeg
e080: 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d  ->pLeaf && pSeg-
e090: 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  >nPos==0);.}../*
e0a0: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72  .** Advance iter
e0b0: 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68  ator pIter to th
e0c0: 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
e0d0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
e0e0: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
e0f0: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
e100: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
e110: 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a  rror code. It .*
e120: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
e130: 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
e140: 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
e150: 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20  ches EOF. If an 
e160: 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
e170: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
e180: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
e190: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
e1a0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
e1b0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
e1c0: 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  egIterNext(.  Ft
e1d0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e1f0: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
e200: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
e210: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
e220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
e230: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
e240: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77   */.  int *pbNew
e250: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
e260: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
e270: 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a  t for new term *
e280: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
e290: 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a  bNewTerm==0 || *
e2a0: 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a  pbNewTerm==0 );.
e2b0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
e2c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
e2d0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
e2e0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
e2f0: 56 45 52 53 45 20 29 7b 0a 0a 20 20 20 20 20 20  VERSE ){..      
e300: 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69  if( pIter->iRowi
e310: 64 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  dOffset>0 ){.   
e320: 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74       u8 *a = pIt
e330: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
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 20 20 69 6e 74 20 6e 50 6f 73          int nPos
e360: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 44  ;.        int bD
e370: 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 69 36  ummy;.        i6
e380: 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 20  4 iDelta;..     
e390: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
e3a0: 4f 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 20 20  Offset--;.      
e3b0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e3c0: 66 73 65 74 20 3d 20 69 4f 66 66 20 3d 20 70 49  fset = iOff = pI
e3d0: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
e3e0: 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f  t[pIter->iRowidO
e3f0: 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  ffset];.        
e400: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50  iOff += fts5GetP
e410: 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f  oslistSize(&a[iO
e420: 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  ff], &nPos, &bDu
e430: 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  mmy);.        iO
e440: 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  ff += nPos;.    
e450: 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 26 61      getVarint(&a
e460: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
e470: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
e480: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d  pIter->iRowid -=
e490: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20   iDelta;.       
e4a0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
e4b0: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
e4c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e4d0: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
e4e0: 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70  ReverseNewPage(p
e4f0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
e500: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
e510: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
e520: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
e530: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  f;.      int iOf
e540: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65  f;.      int bNe
e550: 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20  wTerm = 0;.     
e560: 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a   int nKeep = 0;.
e570: 0a 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68  .      /* Search
e580: 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
e590: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
e5a0: 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  t within the cur
e5b0: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
e5c0: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 65 61      u8 *a = pLea
e5d0: 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  f->p;.      int 
e5e0: 6e 20 3d 20 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20  n = pLeaf->n;.. 
e5f0: 20 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65       iOff = pIte
e600: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
e610: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20   pIter->nPos;.. 
e620: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20       if( iOff<n 
e630: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
e640: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20  e next entry is 
e650: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
e660: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  age */.        u
e670: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
e680: 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
e690: 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  e3GetVarint(&a[i
e6a0: 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a  Off], &iDelta);.
e6b0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e6c0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
e6d0: 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  f;.        if( i
e6e0: 44 65 6c 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  Delta==0 ){.    
e6f0: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
e700: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   1;.          if
e710: 28 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20  ( iOff>=n ){.   
e720: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
e730: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
e740: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
e750: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e760: 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20  Offset = 4;.    
e770: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e780: 69 4f 66 66 21 3d 66 74 73 35 47 65 74 55 31 36  iOff!=fts5GetU16
e790: 28 26 61 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20  (&a[2]) ){.     
e7a0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
e7b0: 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73  eafOffset += fts
e7c0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
e7d0: 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20  iOff], nKeep);. 
e7e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e7f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e800: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
e810: 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
e820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
e830: 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53  se if( pIter->pS
e840: 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  eg==0 ){.       
e850: 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74   const u8 *pList
e860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6f   = 0;.        co
e870: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b  nst char *zTerm;
e880: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  .        int nLi
e890: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
e8a0: 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  0==(pIter->flags
e8b0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
e8c0: 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20 20  ONETERM) ){.    
e8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
e8e0: 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 2d  5HashScanNext(p-
e8f0: 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20 20  >pHash);.       
e900: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
e910: 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
e920: 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70  Hash, &zTerm, &p
e930: 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
e940: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e950: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
e960: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
e970: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
e980: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
e990: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
e9a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
e9b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
e9c0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d  Iter->pLeaf->p =
e9d0: 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
e9e0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
e9f0: 65 61 66 2d 3e 6e 20 3d 20 6e 4c 69 73 74 3b 0a  eaf->n = nList;.
ea00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ea10: 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
ea20: 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
ea30: 65 72 6d 2c 20 73 74 72 6c 65 6e 28 7a 54 65 72  erm, strlen(zTer
ea40: 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b  m), (u8*)zTerm);
ea50: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
ea60: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
ea70: 67 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74 2c  getVarint(pList,
ea80: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
ea90: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
eaa0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
eab0: 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 30 3b         iOff = 0;
eac0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  .        /* Next
ead0: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e   entry is not on
eae0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
eaf0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  e */.        whi
eb00: 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  le( iOff==0 ){. 
eb10: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
eb20: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
eb30: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
eb40: 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
eb50: 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20  >pLeaf;.        
eb60: 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
eb70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
eb80: 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74    if( (iOff = ft
eb90: 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
eba0: 3e 70 5b 30 5d 29 29 20 29 7b 0a 20 20 20 20 20  >p[0])) ){.     
ebb0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
ebc0: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
ebd0: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
ebe0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
ebf0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
ec00: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ec10: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
ec20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ec30: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 69       else if( (i
ec40: 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
ec50: 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 29 20  (&pLeaf->p[2])) 
ec60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
ec70: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ec80: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
ec90: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
eca0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
ecb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ecc0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  }..      /* Chec
ecd0: 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  k if the iterato
ece0: 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e  r is now at EOF.
ecf0: 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65   If so, return e
ed00: 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  arly. */.      i
ed10: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
ed20: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ){.        if( b
ed30: 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  NewTerm ){.     
ed40: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
ed50: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
ed60: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a  ITER_ONETERM ){.
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
ed80: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
ed90: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
eda0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
edb0: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eaf = 0;.       
edc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
edd0: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
ede0: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
edf0: 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  er, nKeep);.    
ee00: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
ee10: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
ee20: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
ee30: 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d     if( pbNewTerm
ee40: 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20   ) *pbNewTerm = 
ee50: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
ee60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ee70: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
ee80: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
ee90: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
eea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
eeb0: 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57   }.}..#define SW
eec0: 41 50 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b  APVAL(T, a, b) {
eed0: 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61   T tmp; tmp=a; a
eee0: 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 2f 2a  =b; b=tmp; }../*
eef0: 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
ef00: 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
ef10: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
ef20: 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c   rowid in a docl
ef30: 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ist. This.** fun
ef40: 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69  ction sets the i
ef50: 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68  terator up so th
ef60: 61 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72  at iterates in r
ef70: 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72  everse order thr
ef80: 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c  ough.** the docl
ef90: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
efa0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
efb0: 65 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78  everse(Fts5Index
efc0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
efd0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
efe0: 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
eff0: 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  x = pIter->pDlid
f000: 78 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  x;.  Fts5Data *p
f010: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Last = 0;.  int 
f020: 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20  pgnoLast = 0;.. 
f030: 20 69 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20   if( pDlidx ){. 
f040: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 6f 63     /* If the doc
f050: 6c 69 73 74 2d 69 74 65 72 61 74 6f 72 20 69 73  list-iterator is
f060: 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46 2c   already at EOF,
f070: 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
f080: 74 20 64 6f 63 6c 69 73 74 0a 20 20 20 20 2a 2a  t doclist.    **
f090: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 65 6e 74   contains no ent
f0a0: 72 69 65 73 20 65 78 63 65 70 74 20 74 68 6f 73  ries except thos
f0b0: 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e on the current
f0c0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66   page. */.    if
f0d0: 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  ( fts5DlidxIterE
f0e0: 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
f0f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53   ){.      int iS
f100: 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53  egid = pIter->pS
f110: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
f120: 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 44 6c    pgnoLast = pDl
f130: 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  idx->iLeafPgno;.
f140: 20 20 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74        pLast = ft
f150: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
f160: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
f170: 28 69 53 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f  (iSegid, 0, pgno
f180: 4c 61 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Last));.    }els
f190: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
f1a0: 69 4c 65 61 66 4f 66 66 73 65 74 20 2d 3d 20 73  iLeafOffset -= s
f1b0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
f1c0: 69 6e 74 4c 65 6e 28 70 49 74 65 72 2d 3e 6e 50  intLen(pIter->nP
f1d0: 6f 73 2a 32 2b 70 49 74 65 72 2d 3e 62 44 65 6c  os*2+pIter->bDel
f1e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
f1f0: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20  {.    int iOff; 
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f220: 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74   Byte offset wit
f230: 68 69 6e 20 70 4c 65 61 66 20 2a 2f 0a 20 20 20  hin pLeaf */.   
f240: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
f250: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
f260: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
f270: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
f280: 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ..    /* Current
f290: 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65 72 2e  ly, Fts5SegIter.
f2a0: 69 4c 65 61 66 4f 66 66 73 65 74 20 28 61 6e 64  iLeafOffset (and
f2b0: 20 69 4f 66 66 29 20 70 6f 69 6e 74 73 20 74 6f   iOff) points to
f2c0: 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
f2d0: 2a 2a 20 62 79 74 65 20 6f 66 20 70 6f 73 69 74  ** byte of posit
f2e0: 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion-list content
f2f0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
f300: 20 72 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20   rowid. Back it 
f310: 75 70 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61  up.    ** so tha
f320: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
f330: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f340: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
f350: 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20  ze field. */.   
f360: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f370: 73 65 74 20 2d 3d 20 73 71 6c 69 74 65 33 46 74  set -= sqlite3Ft
f380: 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 70  s5GetVarintLen(p
f390: 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74  Iter->nPos*2+pIt
f3a0: 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20 20 20 69  er->bDel);.    i
f3b0: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
f3c0: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 61 73  afOffset;.    as
f3d0: 73 65 72 74 28 20 69 4f 66 66 3e 3d 34 20 29 3b  sert( iOff>=4 );
f3e0: 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  ..    /* Search 
f3f0: 66 6f 72 20 61 20 6e 65 77 20 74 65 72 6d 20 77  for a new term w
f400: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
f410: 74 20 6c 65 61 66 2e 20 49 66 20 6f 6e 65 20 63  t leaf. If one c
f420: 61 6e 20 62 65 20 66 6f 75 6e 64 2c 0a 20 20 20  an be found,.   
f430: 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 70 61   ** then this pa
f440: 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ge contains the 
f450: 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f  largest rowid fo
f460: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  r the current te
f470: 72 6d 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  rm. */.    while
f480: 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20  ( iOff<pLeaf->n 
f490: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  ){.      int nPo
f4a0: 73 3b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  s;.      i64 iDe
f4b0: 6c 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  lta;.      int b
f4c0: 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 20 20 2f 2a  Dummy;..      /*
f4d0: 20 52 65 61 64 20 74 68 65 20 70 6f 73 69 74 69   Read the positi
f4e0: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
f4f0: 6c 64 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66  ld */.      iOff
f500: 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
f510: 73 74 53 69 7a 65 28 26 70 4c 65 61 66 2d 3e 70  stSize(&pLeaf->p
f520: 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
f530: 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69  bDummy);.      i
f540: 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  Off += nPos;.   
f550: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
f560: 61 66 2d 3e 6e 20 29 20 62 72 65 61 6b 3b 0a 0a  af->n ) break;..
f570: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 64        /* Rowid d
f580: 65 6c 74 61 2e 20 4f 72 2c 20 69 66 20 30 78 30  elta. Or, if 0x0
f590: 30 2c 20 74 68 65 20 65 6e 64 20 6f 66 20 64 6f  0, the end of do
f5a0: 63 6c 69 73 74 20 6d 61 72 6b 65 72 2e 20 2a 2f  clist marker. */
f5b0: 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 67 65  .      nPos = ge
f5c0: 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
f5d0: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
f5e0: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69  iDelta);.      i
f5f0: 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62  f( iDelta==0 ) b
f600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 4f 66 66  reak;.      iOff
f610: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a   += nPos;.    }.
f620: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f630: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
f640: 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65  e then the large
f650: 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  st rowid for the
f660: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
f670: 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20  term may not be 
f680: 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75  stored on the cu
f690: 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73  rrent page. So s
f6a0: 65 61 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f  earch forward to
f6b0: 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72  .    ** see wher
f6c0: 65 20 73 61 69 64 20 72 6f 77 69 64 20 72 65 61  e said rowid rea
f6d0: 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20  lly is.  */.    
f6e0: 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d  if( iOff>=pLeaf-
f6f0: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >n ){.      int 
f700: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73 35  pgno;.      Fts5
f710: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
f720: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
f730: 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pSeg;..      /* 
f740: 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69  The last rowid i
f750: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61  n the doclist ma
f760: 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20  y not be on the 
f770: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65  current page. Se
f780: 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f  arch.      ** fo
f790: 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68  rward to find th
f7a0: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  e page containin
f7b0: 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  g the last rowid
f7c0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
f7d0: 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61  pgno=pIter->iLea
f7e0: 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20  fPgno+1; !p->rc 
f7f0: 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  && pgno<=pSeg->p
f800: 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29  gnoLast; pgno++)
f810: 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 41  {.        i64 iA
f820: 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  bs = FTS5_SEGMEN
f830: 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
f840: 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f 29 3b 0a  egid, 0, pgno);.
f850: 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61          Fts5Data
f860: 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74   *pNew = fts5Dat
f870: 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a  aRead(p, iAbs);.
f880: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
f890: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
f8a0: 74 20 69 52 6f 77 69 64 2c 20 69 54 65 72 6d 3b  t iRowid, iTerm;
f8b0: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 4c  .          fts5L
f8c0: 65 61 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20  eafHeader(pNew, 
f8d0: 26 69 52 6f 77 69 64 2c 20 26 69 54 65 72 6d 29  &iRowid, &iTerm)
f8e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f8f0: 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
f900: 20 20 20 20 20 20 53 57 41 50 56 41 4c 28 46 74        SWAPVAL(Ft
f910: 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70  s5Data*, pNew, p
f920: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Last);.         
f930: 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67     pgnoLast = pg
f940: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
f950: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
f960: 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b  taRelease(pNew);
f970: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
f980: 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
f990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f9a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f9b0: 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c  If pLast is NULL
f9c0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
f9d0: 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
f9e0: 77 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63  wid for this doc
f9f0: 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f  list.  ** lies o
fa00: 6e 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  n the page curre
fa10: 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
fa20: 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20  y the iterator. 
fa30: 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20 20  In this case .  
fa40: 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  ** pIter->iLeafO
fa50: 66 66 73 65 74 20 69 73 20 61 6c 72 65 61 64 79  ffset is already
fa60: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
fa70: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
fa80: 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65  st size.  ** fie
fa90: 6c 64 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ld associated wi
faa0: 74 68 20 74 68 65 20 66 69 72 73 74 20 72 65 6c  th the first rel
fab0: 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74  evant rowid on t
fac0: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  he page..  **.  
fad0: 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73 74 20  ** Or, if pLast 
fae0: 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
faf0: 6e 20 69 74 20 69 73 20 74 68 65 20 70 61 67 65  n it is the page
fb00: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
fb10: 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77  he last.  ** row
fb20: 69 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  id. In this case
fb30: 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69   configure the i
fb40: 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
fb50: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
fb60: 0a 20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69  .  ** first rowi
fb70: 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 0a  d on this page..
fb80: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74    */.  if( pLast
fb90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d   ){.    int dumm
fba0: 79 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  y;.    int iOff;
fbb0: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
fbc0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
fbd0: 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
fbe0: 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20  Leaf = pLast;.  
fbf0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
fc00: 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20  no = pgnoLast;. 
fc10: 20 20 20 66 74 73 35 4c 65 61 66 48 65 61 64 65     fts5LeafHeade
fc20: 72 28 70 4c 61 73 74 2c 20 26 69 4f 66 66 2c 20  r(pLast, &iOff, 
fc30: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66  &dummy);.    iOf
fc40: 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  f += getVarint(&
fc50: 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLast->p[iOff], 
fc60: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
fc70: 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72  owid);.    pIter
fc80: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
fc90: 69 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  iOff;.  }..  fts
fca0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
fcb0: 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
fcc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  );.}../*.** Iter
fcd0: 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
fce0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
fcf0: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
fd00: 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20  f a doclist..** 
fd10: 54 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  There is a docli
fd20: 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61  st-index associa
fd30: 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6e  ted with the fin
fd40: 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 63  al term on the c
fd50: 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e  urrent .** page.
fd60: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
fd70: 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74  term is the last
fd80: 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70 61 67   term on the pag
fd90: 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20  e, load the .** 
fda0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72  doclist-index fr
fdb0: 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e 69 74  om disk and init
fdc0: 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74  ialize an iterat
fdd0: 6f 72 20 61 74 20 28 70 49 74 65 72 2d 3e 70 44  or at (pIter->pD
fde0: 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lidx)..*/.static
fdf0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
fe00: 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49  rLoadDlidx(Fts5I
fe10: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
fe20: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
fe30: 69 6e 74 20 69 53 65 67 20 3d 20 70 49 74 65 72  int iSeg = pIter
fe40: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
fe50: 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
fe60: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
fe70: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
fe80: 45 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  E);.  Fts5Data *
fe90: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
fea0: 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74  Leaf; /* Current
feb0: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20   leaf data */.. 
fec0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
fed0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
fee0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
fef0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
ff00: 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20  >pDlidx==0 );.. 
ff10: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
ff20: 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
ff30: 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61   ends on this pa
ff40: 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ge. If it does, 
ff50: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c  return.  ** earl
ff60: 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e  y without loadin
ff70: 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  g the doclist-in
ff80: 64 65 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e  dex (as it belon
ff90: 67 73 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  gs to a differen
ffa0: 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a  t.  ** term. */.
ffb0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
ffc0: 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  rmLeafPgno==pIte
ffd0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
ffe0: 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70      int iOff = p
fff0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10000 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b  t + pIter->nPos;
10010 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66  .    while( iOff
10020 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  <pLeaf->n ){.   
10030 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
10040 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20       int nPos;. 
10050 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
10060 0a 0a 20 20 20 20 20 20 2f 2a 20 69 4f 66 66 20  ..      /* iOff 
10070 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
10080 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
10090 74 61 72 74 20 6f 66 20 70 6f 73 69 74 69 6f 6e  tart of position
100a0 20 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20   list data */.  
100b0 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56      iOff += getV
100c0 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b  arint(&pLeaf->p[
100d0 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
100e0 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  elta);.      if(
100f0 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65 74   iDelta==0 ) ret
10100 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  urn;.      asser
10110 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61 66  t_nc( iOff<pLeaf
10120 2d 3e 6e 20 29 3b 0a 20 20 20 20 20 20 69 4f 66  ->n );.      iOf
10130 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  f += fts5GetPosl
10140 69 73 74 53 69 7a 65 28 26 70 4c 65 61 66 2d 3e  istSize(&pLeaf->
10150 70 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  p[iOff], &nPos, 
10160 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  &bDummy);.      
10170 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20  iOff += nPos;.  
10180 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72    }.  }..  pIter
10190 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44  ->pDlidx = fts5D
101a0 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
101b0 62 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65  bRev, iSeg, pIte
101c0 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
101d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
101e0 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
101f0 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
10200 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
10210 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d  Term within segm
10220 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20  ent.** pSeg. If 
10230 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
10240 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64   term in the ind
10250 65 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  ex, the iterator
10260 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a   is set to EOF..
10270 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
10280 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
10290 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
102a0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
102b0 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
102c0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
102d0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
102e0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
102f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
10300 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
10310 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
10320 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74  5SegIterSeekInit
10330 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
10340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10350 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
10360 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  end */.  const u
10370 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
10380 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
10390 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
103a0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
103d0 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20  INDEX_XXX flags 
103e0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
103f0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
10400 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
10410 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
10420 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
10430 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
10440 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
10450 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
10460 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20    int iPg = 1;. 
10470 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 62 47   int h;.  int bG
10480 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53  e = (flags & FTS
10490 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
104a0 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78  N);.  int bDlidx
104b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
104c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
104d0 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
104e0 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
104f0 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20 7c  assert( bGe==0 |
10500 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  | (flags & FTS5I
10510 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29  NDEX_QUERY_DESC)
10520 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
10530 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 20   pTerm && nTerm 
10540 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  );.  memset(pIte
10550 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
10560 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
10570 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20 20  pSeg = pSeg;..  
10580 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
10590 74 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ts stack variabl
105a0 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65 61  e iPg to the lea
105b0 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  f page number th
105c0 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74  at may.  ** cont
105d0 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d 2f  ain term (pTerm/
105e0 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69 73  nTerm), if it is
105f0 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
10600 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 66 6f  segment. */.  fo
10610 72 28 68 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68  r(h=pSeg->nHeigh
10620 74 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d 29 7b 0a  t-1; h>0; h--){.
10630 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72      Fts5NodeIter
10640 20 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20   node;          
10650 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61      /* For itera
10660 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 74  ting through int
10670 65 72 6e 61 6c 20 6e 6f 64 65 73 20 2a 2f 0a 20  ernal nodes */. 
10680 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
10690 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
106a0 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
106b0 20 68 2c 20 69 50 67 29 3b 0a 20 20 20 20 46 74   h, iPg);.    Ft
106c0 73 35 44 61 74 61 20 2a 70 4e 6f 64 65 20 3d 20  s5Data *pNode = 
106d0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
106e0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  iRowid);.    if(
106f0 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61   pNode==0 ) brea
10700 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f 64 65  k;..    fts5Node
10710 49 74 65 72 49 6e 69 74 28 70 4e 6f 64 65 2d 3e  IterInit(pNode->
10720 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26 6e 6f  p, pNode->n, &no
10730 64 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  de);.    assert(
10740 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d 30 20   node.term.n==0 
10750 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20 6e 6f  );..    iPg = no
10760 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 62  de.iChild;.    b
10770 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44 6c  Dlidx = node.bDl
10780 69 64 78 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  idx;.    for(fts
10790 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70  5NodeIterNext(&p
107a0 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a 20 20  ->rc, &node);.  
107b0 20 20 20 20 20 20 6e 6f 64 65 2e 61 44 61 74 61        node.aData
107c0 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f   && fts5BufferCo
107d0 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64 65 2e  mpareBlob(&node.
107e0 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  term, pTerm, nTe
107f0 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20 20 20  rm)<=0;.        
10800 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74  fts5NodeIterNext
10810 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 0a  (&p->rc, &node).
10820 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 67      ){.      iPg
10830 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a   = node.iChild;.
10840 20 20 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e        bDlidx = n
10850 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20  ode.bDlidx;.    
10860 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74  }.    fts5NodeIt
10870 65 72 46 72 65 65 28 26 6e 6f 64 65 29 3b 0a 20  erFree(&node);. 
10880 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
10890 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a  se(pNode);.  }..
108a0 20 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e    if( iPg<pSeg->
108b0 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20  pgnoFirst ){.   
108c0 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e   iPg = pSeg->pgn
108d0 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69  oFirst;.    bDli
108e0 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  dx = 0;.  }..  p
108f0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
10900 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73  = iPg - 1;.  fts
10910 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
10920 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69  (p, pIter);..  i
10930 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
10940 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  ){.    int res;.
10950 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
10960 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
10970 55 31 36 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  U16(&pIter->pLea
10980 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 66 74  f->p[2]);.    ft
10990 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
109a0 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  m(p, pIter, 0);.
109b0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
109c0 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
109d0 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  );.    do {.    
109e0 20 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66    res = fts5Buff
109f0 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70  erCompareBlob(&p
10a00 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72  Iter->term, pTer
10a10 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, nTerm);.     
10a20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62 72   if( res>=0 ) br
10a30 65 61 6b 3b 0a 20 20 20 20 20 20 66 74 73 35 53  eak;.      fts5S
10a40 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  egIterNext(p, pI
10a50 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 77 68  ter, 0);.    }wh
10a60 69 6c 65 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ile( pIter->pLea
10a70 66 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  f && p->rc==SQLI
10a80 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 69 66  TE_OK );..    if
10a90 28 20 62 47 65 3d 3d 30 20 26 26 20 72 65 73 20  ( bGe==0 && res 
10aa0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ){.      /* Set 
10ab0 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
10ac0 74 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20 20 20  t to EOF */.    
10ad0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
10ae0 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
10af0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
10b00 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  eaf = 0;.    }. 
10b10 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
10b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47  =SQLITE_OK && bG
10b30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65  e==0 ){.    pIte
10b40 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
10b50 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
10b60 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
10b70 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
10b80 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
10b90 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
10ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
10bb0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
10bc0 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
10bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10be0 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20  if( bDlidx ){.  
10bf0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
10c00 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 70 49  rLoadDlidx(p, pI
10c10 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
10c20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
10c30 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
10c40 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  DESC ){.        
10c50 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
10c60 73 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  se(p, pIter);.  
10c70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10c80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
10c90 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
10ca0 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
10cb0 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
10cc0 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
10cd0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
10ce0 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  able. If there i
10cf0 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
10d00 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
10d10 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
10d20 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
10d30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10d40 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
10d50 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
10d60 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
10d70 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
10d80 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
10d90 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
10da0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
10db0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
10dc0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
10dd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
10de0 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
10df0 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
10e00 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
10e10 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
10e20 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ckend */.  const
10e30 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
10e40 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
10e50 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
10e60 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e80 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
10e90 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
10ea0 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
10eb0 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
10ec0 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
10ed0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
10ee0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  ){.  const u8 *p
10ef0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  List = 0;.  int 
10f00 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  nList = 0;.  con
10f10 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20  st u8 *z = 0;.  
10f20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73  int n = 0;..  as
10f30 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29  sert( p->pHash )
10f40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
10f50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
10f60 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
10f70 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
10f80 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
10f90 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
10fa0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
10fb0 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73  ScanInit(p->pHas
10fc0 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
10fd0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
10fe0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
10ff0 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
11000 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
11010 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
11020 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
11030 20 28 7a 20 3f 20 73 74 72 6c 65 6e 28 28 63 6f   (z ? strlen((co
11040 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30  nst char*)z) : 0
11050 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11060 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
11070 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
11080 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  TERM;.    sqlite
11090 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28 70  3Fts5HashQuery(p
110a0 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20  ->pHash, (const 
110b0 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65  char*)pTerm, nTe
110c0 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  rm, &pList, &nLi
110d0 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65  st);.    z = pTe
110e0 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72  rm;.    n = nTer
110f0 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  m;.  }..  if( pL
11100 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44  ist ){.    Fts5D
11110 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20  ata *pLeaf;.    
11120 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
11130 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
11140 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29  ter->term, n, z)
11150 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
11160 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73  s5IdxMalloc(p, s
11170 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29 29  izeof(Fts5Data))
11180 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d  ;.    if( pLeaf=
11190 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
111a0 20 70 4c 65 61 66 2d 3e 6e 52 65 66 20 3d 20 31   pLeaf->nRef = 1
111b0 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d  ;.    pLeaf->p =
111c0 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
111d0 20 70 4c 65 61 66 2d 3e 6e 20 3d 20 6e 4c 69 73   pLeaf->n = nLis
111e0 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  t;.    pIter->pL
111f0 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20  eaf = pLeaf;.   
11200 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
11210 73 65 74 20 3d 20 67 65 74 56 61 72 69 6e 74 28  set = getVarint(
11220 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29  pLeaf->p, (u64*)
11230 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
11240 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  ..    if( flags 
11250 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
11260 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
11270 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
11280 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
11290 45 52 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35  ERSE;.      fts5
112a0 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
112b0 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
112c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
112d0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
112e0 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
112f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11300 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74  *.** Zero the it
11310 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
11320 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
11330 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
11340 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43 6c  id fts5SegIterCl
11350 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72 20  ear(Fts5SegIter 
11360 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42  *pIter){.  fts5B
11370 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
11380 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44  ->term);.  fts5D
11390 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
113a0 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35  ->pLeaf);.  fts5
113b0 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49  DlidxIterFree(pI
113c0 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20  ter->pDlidx);.  
113d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
113e0 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
113f0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  );.  memset(pIte
11400 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
11410 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23  5SegIter));.}..#
11420 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
11430 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  UG../*.** This f
11440 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
11450 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 62  as part of the b
11460 69 67 20 61 73 73 65 72 74 28 29 20 70 72 6f 63  ig assert() proc
11470 65 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  edure implemente
11480 64 20 62 79 0a 2a 2a 20 66 74 73 35 41 73 73 65  d by.** fts5Asse
11490 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
114a0 28 29 2e 20 49 74 20 65 6e 73 75 72 65 73 20 74  (). It ensures t
114b0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 63  hat the result c
114c0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a  urrently stored.
114d0 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69 73 20 74  ** in *pRes is t
114e0 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
114f0 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74  t of comparing t
11500 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
11510 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ions of the.** t
11520 77 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f  wo iterators..*/
11530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
11540 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f  5AssertCompariso
11550 6e 52 65 73 75 6c 74 28 0a 20 20 46 74 73 35 4d  nResult(.  Fts5M
11560 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
11570 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67 49 74  er, .  Fts5SegIt
11580 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35 53 65  er *p1,.  Fts5Se
11590 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46 74 73  gIter *p2,.  Fts
115a0 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 0a 29  5CResult *pRes.)
115b0 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70 31 20  {.  int i1 = p1 
115c0 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20  - pIter->aSeg;. 
115d0 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d 20 70   int i2 = p2 - p
115e0 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69  Iter->aSeg;..  i
115f0 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20  f( p1->pLeaf || 
11600 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  p2->pLeaf ){.   
11610 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d   if( p1->pLeaf==
11620 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
11630 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
11640 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  =i2 );.    }else
11650 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d   if( p2->pLeaf==
11660 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
11670 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
11680 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  =i1 );.    }else
11690 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e  {.      int nMin
116a0 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e   = MIN(p1->term.
116b0 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a  n, p2->term.n);.
116c0 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
116d0 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e  memcmp(p1->term.
116e0 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e  p, p2->term.p, n
116f0 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Min);.      if( 
11700 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 70  res==0 ) res = p
11710 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e  1->term.n - p2->
11720 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69  term.n;..      i
11730 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
11740 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
11750 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b  s->bTermEq==1 );
11760 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11770 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d   p1->iRowid!=p2-
11780 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  >iRowid );.     
11790 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69     res = ((p1->i
117a0 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77  Rowid > p2->iRow
117b0 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
117c0 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20  ) ? -1 : 1;.    
117d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
117e0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
117f0 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20  TermEq==0 );.   
11800 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
11810 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
11820 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
11830 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20  First==i1 );.   
11840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11850 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
11860 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20  iFirst==i2 );.  
11870 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11880 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11890 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
118a0 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
118b0 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
118c0 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c   when this modul
118d0 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64  e.** is compiled
118e0 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
118f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
11900 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20   essentially an 
11910 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61  assert() .** sta
11920 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 76  tement used to v
11930 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
11940 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
11950 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61  Iter->aFirst[] a
11960 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72  rray.** are corr
11970 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
11980 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 4d 75  oid fts5AssertMu
11990 6c 74 69 49 74 65 72 53 65 74 75 70 28 46 74 73  ltiIterSetup(Fts
119a0 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d  5Index *p, Fts5M
119b0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
119c0 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er){.  if( p->rc
119d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
119e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
119f0 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
11a00 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  nSeg; i+=2){.   
11a10 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
11a20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
11a30 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  g[i];.      Fts5
11a40 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70  SegIter *p2 = &p
11a50 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b  Iter->aSeg[i+1];
11a60 0a 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75  .      Fts5CResu
11a70 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65  lt *pRes = &pIte
11a80 72 2d 3e 61 46 69 72 73 74 5b 28 70 49 74 65 72  r->aFirst[(pIter
11a90 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20 32 5d  ->nSeg + i) / 2]
11aa0 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  ;.      fts5Asse
11ab0 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75  rtComparisonResu
11ac0 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32  lt(pIter, p1, p2
11ad0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a  , pRes);.    }..
11ae0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28      for(i=1; i<(
11af0 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29  pIter->nSeg / 2)
11b00 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46  ; i+=2){.      F
11b10 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
11b20 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
11b30 74 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  t[i];.      Fts5
11b40 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70  SegIter *p1 = &p
11b50 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
11b60 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69  r->aFirst[i*2].i
11b70 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
11b80 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d  ts5SegIter *p2 =
11b90 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
11ba0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32  Iter->aFirst[i*2
11bb0 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 0a 20  +1].iFirst ];.. 
11bc0 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43       fts5AssertC
11bd0 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
11be0 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70  pIter, p1, p2, p
11bf0 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Res);.    }.  }.
11c00 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
11c10 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
11c20 49 74 65 72 53 65 74 75 70 28 78 2c 79 29 0a 23  IterSetup(x,y).#
11c30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  endif../*.** Do 
11c40 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e  the comparison n
11c50 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f 70 75  ecessary to popu
11c60 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46 69 72  late pIter->aFir
11c70 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20  st[iOut]..**.** 
11c80 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
11c90 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  value is non-zer
11ca0 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
11cb0 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e  e index of an en
11cc0 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49  try.** in the pI
11cd0 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61  ter->aSeg[] arra
11ce0 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6e 6f  y that is (a) no
11cf0 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20 28 62  t at EOF, and (b
11d00 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  ) pointing.** to
11d10 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20 61   a key that is a
11d20 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
11d30 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20 70 72  other, higher pr
11d40 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d  iority, .** segm
11d50 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69 6e 20  ent-iterator in 
11d60 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d  the pSeg->aSeg[]
11d70 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
11d80 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
11d90 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46 74 73  terDoCompare(Fts
11da0 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
11db0 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b  Iter, int iOut){
11dc0 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20  .  int i1;      
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11de0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c     /* Index of l
11df0 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  eft-hand Fts5Seg
11e00 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32  Iter */.  int i2
11e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11e30 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  ex of right-hand
11e40 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
11e50 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74    int iRes;.  Ft
11e60 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20  s5SegIter *p1;  
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e80 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   Left-hand Fts5S
11e90 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35  egIter */.  Fts5
11ea0 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20  SegIter *p2;    
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11ec0 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65  ight-hand Fts5Se
11ed0 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43  gIter */.  Fts5C
11ee0 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
11ef0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
11f00 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ut];..  assert( 
11f10 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67  iOut<pIter->nSeg
11f20 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20   && iOut>0 );.  
11f30 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62  assert( pIter->b
11f40 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d  Rev==0 || pIter-
11f50 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69  >bRev==1 );..  i
11f60 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d  f( iOut>=(pIter-
11f70 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20  >nSeg/2) ){.    
11f80 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74  i1 = (iOut - pIt
11f90 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b  er->nSeg/2) * 2;
11fa0 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31  .    i2 = i1 + 1
11fb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
11fc0 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  1 = pIter->aFirs
11fd0 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74  t[iOut*2].iFirst
11fe0 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65 72  ;.    i2 = pIter
11ff0 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b  ->aFirst[iOut*2+
12000 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20  1].iFirst;.  }. 
12010 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   p1 = &pIter->aS
12020 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26  eg[i1];.  p2 = &
12030 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b  pIter->aSeg[i2];
12040 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  ..  pRes->bTermE
12050 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d  q = 0;.  if( p1-
12060 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20  >pLeaf==0 ){    
12070 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20         /* If p1 
12080 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20  is at EOF */.   
12090 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65   iRes = i2;.  }e
120a0 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61  lse if( p2->pLea
120b0 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49  f==0 ){     /* I
120c0 66 20 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a  f p2 is at EOF *
120d0 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b  /.    iRes = i1;
120e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
120f0 74 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66  t res = fts5Buff
12100 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74  erCompare(&p1->t
12110 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b  erm, &p2->term);
12120 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
12130 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12140 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20   i2>i1 );.      
12150 61 73 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b  assert( i2!=0 );
12160 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65  .      pRes->bTe
12170 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  rmEq = 1;.      
12180 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d  if( p1->iRowid==
12190 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  p2->iRowid ){.  
121a0 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d        p1->bDel =
121b0 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20   p2->bDel;.     
121c0 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20     return i2;.  
121d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20      }.      res 
121e0 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e  = ((p1->iRowid >
121f0 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49   p2->iRowid)==pI
12200 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20  ter->bRev) ? -1 
12210 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  : +1;.    }.    
12220 61 73 73 65 72 74 28 20 72 65 73 21 3d 30 20 29  assert( res!=0 )
12230 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
12240 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  ){.      iRes = 
12250 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i1;.    }else{. 
12260 20 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a       iRes = i2;.
12270 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65      }.  }..  pRe
12280 73 2d 3e 69 46 69 72 73 74 20 3d 20 69 52 65 73  s->iFirst = iRes
12290 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
122a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
122b0 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74  seg-iter so that
122c0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
122d0 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
122e0 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e   page iLeafPgno.
122f0 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72  .** It is an err
12300 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66  or if leaf iLeaf
12310 50 67 6e 6f 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  Pgno contains no
12320 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   rowid..*/.stati
12330 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
12340 65 72 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74  erGotoPage(.  Ft
12350 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12370 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
12380 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
12390 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
123a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
123b0 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
123c0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
123d0 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28  gno.){.  assert(
123e0 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72   iLeafPgno>pIter
123f0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 20  ->iLeafPgno );. 
12400 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
12410 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b  o = iLeafPgno-1;
12420 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  .  fts5SegIterNe
12430 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
12440 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
12450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
12460 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12470 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ==iLeafPgno );..
12480 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
12490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
124a0 74 20 69 4f 66 66 3b 0a 20 20 20 20 75 38 20 2a  t iOff;.    u8 *
124b0 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
124c0 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  ->p;.    int n =
124d0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
124e0 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74  ;..    iOff = ft
124f0 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b  s5GetU16(&a[0]);
12500 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20  .    if( iOff<4 
12510 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20  || iOff>=n ){.  
12520 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
12530 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
12540 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  lse{.      iOff 
12550 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b  += getVarint(&a[
12560 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
12570 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
12580 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
12590 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
125a0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
125b0 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
125c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
125d0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
125e0 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
125f0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
12600 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20   argument until 
12610 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20  it is at or .** 
12620 70 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d  past rowid iFrom
12630 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
12640 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72  the value of iFr
12650 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  om, the iterator
12660 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64   is.** always ad
12670 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20  vanced at least 
12680 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  once..*/.static 
12690 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
126a0 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35  NextFrom(.  Fts5
126b0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
126c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
126d0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
126e0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
126f0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
12700 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
12710 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
12720 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20 20  /.  i64 iMatch  
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69      /* Advance i
12750 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74  terator at least
12760 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a   this far */.){.
12770 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
12780 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
12790 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
127a0 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  E);.  Fts5DlidxI
127b0 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49  ter *pDlidx = pI
127c0 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69  ter->pDlidx;.  i
127d0 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  nt iLeafPgno = p
127e0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
127f0 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31  .  int bMove = 1
12800 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
12810 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
12820 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
12830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
12840 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20  ter->pDlidx );. 
12850 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
12860 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20  pLeaf );..  if( 
12870 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77  bRev==0 ){.    w
12880 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 49  hile( fts5DlidxI
12890 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
128a0 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68 3e 70  )==0 && iMatch>p
128b0 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 7b  Dlidx->iRowid ){
128c0 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f  .      iLeafPgno
128d0 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66   = pDlidx->iLeaf
128e0 50 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74 73 35  Pgno;.      fts5
128f0 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 44  DlidxIterNext(pD
12900 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lidx);.    }.   
12910 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67   assert( iLeafPg
12920 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no>=pIter->iLeaf
12930 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b  Pgno || p->rc );
12940 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67  .    if( iLeafPg
12950 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no>pIter->iLeafP
12960 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gno ){.      fts
12970 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65  5SegIterGotoPage
12980 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66  (p, pIter, iLeaf
12990 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Pgno);.      bMo
129a0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
129b0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
129c0 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d  t( iMatch<pIter-
129d0 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77  >iRowid );.    w
129e0 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 49  hile( fts5DlidxI
129f0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
12a00 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68 3c 70  )==0 && iMatch<p
12a10 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 7b  Dlidx->iRowid ){
12a20 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
12a30 49 74 65 72 50 72 65 76 28 70 44 6c 69 64 78 29  IterPrev(pDlidx)
12a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61  ;.    }.    iLea
12a50 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e  fPgno = pDlidx->
12a60 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 20 20  iLeafPgno;..    
12a70 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64  assert( fts5Dlid
12a80 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
12a90 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f  dx) || iLeafPgno
12aa0 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  <=pIter->iLeafPg
12ab0 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  no );..    if( i
12ac0 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e  LeafPgno<pIter->
12ad0 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
12ae0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
12af0 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b  gno = iLeafPgno+
12b00 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  1;.      fts5Seg
12b10 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61  IterReverseNewPa
12b20 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
12b30 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20      bMove = 0;. 
12b40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c     }.  }..  whil
12b50 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
12b60 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 62  _OK ){.    if( b
12b70 4d 6f 76 65 20 29 20 66 74 73 35 53 65 67 49 74  Move ) fts5SegIt
12b80 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
12b90 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74   0);.    if( pIt
12ba0 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62  er->pLeaf==0 ) b
12bb0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52  reak;.    if( bR
12bc0 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  ev==0 && pIter->
12bd0 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29  iRowid>=iMatch )
12be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
12bf0 62 52 65 76 21 3d 30 20 26 26 20 70 49 74 65 72  bRev!=0 && pIter
12c00 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68  ->iRowid<=iMatch
12c10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d   ) break;.    bM
12c20 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ove = 1;.  }.}..
12c30 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
12c40 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
12c50 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
12c60 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
12c70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
12c80 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
12c90 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
12ca0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
12cb0 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
12cc0 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ter ){.    int i
12cd0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
12ce0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
12cf0 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  +){.      fts5Se
12d00 67 49 74 65 72 43 6c 65 61 72 28 26 70 49 74 65  gIterClear(&pIte
12d10 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20  r->aSeg[i]);.   
12d20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
12d30 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ree(pIter);.  }.
12d40 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
12d50 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
12d60 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65  nced(.  Fts5Inde
12d70 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
12d80 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
12d90 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
12da0 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
12db0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
12dc0 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f  *pIter,        /
12dd0 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70  * Iterator to up
12de0 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72  date aFirst[] ar
12df0 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ray for */.  int
12e00 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20   iChanged,      
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65  Index of sub-ite
12e30 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e  rator just advan
12e40 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69  ced */.  int iMi
12e50 6e 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  nset            
12e60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69           /* Mini
12e70 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69  mum entry in aFi
12e80 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a  rst[] to set */.
12e90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
12ea0 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67  r(i=(pIter->nSeg
12eb0 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e  +iChanged)/2; i>
12ec0 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72  =iMinset && p->r
12ed0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d  c==SQLITE_OK; i=
12ee0 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45  i/2){.    int iE
12ef0 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45 71 20  q;.    if( (iEq 
12f00 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  = fts5MultiIterD
12f10 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20  oCompare(pIter, 
12f20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73  i)) ){.      fts
12f30 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20  5SegIterNext(p, 
12f40 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71  &pIter->aSeg[iEq
12f50 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d  ], 0);.      i =
12f60 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69   pIter->nSeg + i
12f70 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  Eq;.    }.  }.}.
12f80 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
12f90 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
12fa0 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64  Rowid(.  Fts5Ind
12fb0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
12fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
12fd0 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
12fe0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
12ff0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
13000 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
13010 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75  /* Iterator to u
13020 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61  pdate aFirst[] a
13030 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  rray for */.  in
13040 74 20 69 43 68 61 6e 67 65 64 20 20 20 20 20 20  t iChanged      
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13060 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74   Index of sub-it
13070 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61  erator just adva
13080 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nced */.){.  int
13090 20 69 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65   i;.  Fts5SegIte
130a0 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72  r *pNew = &pIter
130b0 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d  ->aSeg[iChanged]
130c0 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ;.  Fts5SegIter 
130d0 2a 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72  *pOther = &pIter
130e0 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20  ->aSeg[iChanged 
130f0 5e 20 30 78 30 30 30 31 5d 3b 0a 0a 20 20 66 6f  ^ 0x0001];..  fo
13100 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67  r(i=(pIter->nSeg
13110 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 70 2d  +iChanged)/2; p-
13120 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
13130 69 3d 69 2f 32 29 7b 0a 20 20 20 20 46 74 73 35  i=i/2){.    Fts5
13140 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
13150 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69  &pIter->aFirst[i
13160 5d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  ];..    assert( 
13170 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20  pNew->pLeaf );. 
13180 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
13190 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70  >bTermEq==0 || p
131a0 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a  Other->pLeaf );.
131b0 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 52 65      .    if( pRe
131c0 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20 20  s->bTermEq ){.  
131d0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52      if( pNew->iR
131e0 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52  owid==pOther->iR
131f0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
13200 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
13210 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65  }else if( (pOthe
13220 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e  r->iRowid>pNew->
13230 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
13240 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
13250 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20  pNew = pOther;. 
13260 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13270 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20   pRes->iFirst = 
13280 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61  (pNew - pIter->a
13290 53 65 67 29 3b 0a 20 20 20 20 69 66 28 20 69 3d  Seg);.    if( i=
132a0 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =1 ) break;..   
132b0 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72   pOther = &pIter
132c0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
132d0 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31  First[i ^ 0x0001
132e0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 7d 0a  ].iFirst ];.  }.
132f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
13300 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
13310 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
13320 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a  ext entry. .**.*
13330 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
13340 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
13350 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
13360 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20  ts5Index.rc. It 
13370 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69  is not .** consi
13380 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
13390 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  f the iterator r
133a0 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69  eaches EOF, or i
133b0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
133c0 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20  at .** EOF when 
133d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
133e0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
133f0 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
13400 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  iIterNext(.  Fts
13410 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
13420 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
13430 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72  pIter,.  int bFr
13440 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
13450 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
13460 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72   if argument iFr
13470 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  om is valid */. 
13480 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20   i64 iFrom      
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c   /* Advance at l
134b0 65 61 73 74 20 61 73 20 66 61 72 20 61 73 20 74  east as far as t
134c0 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  his */.){.  if( 
134d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
134e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55 73 65   ){.    int bUse
134f0 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20  From = bFrom;.  
13500 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74    do {.      int
13510 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
13520 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
13530 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65  t;.      int bNe
13540 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20  wTerm = 0;.     
13550 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
13560 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
13570 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  g[iFirst];.     
13580 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
13590 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
135a0 20 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20     if( bUseFrom 
135b0 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20  && pSeg->pDlidx 
135c0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
135d0 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  egIterNextFrom(p
135e0 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a  , pSeg, iFrom);.
135f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13600 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
13610 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
13620 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  NewTerm);.      
13630 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  }..      if( pSe
13640 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62  g->pLeaf==0 || b
13650 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20  NewTerm .       
13660 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  || fts5MultiIter
13670 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c 20  AdvanceRowid(p, 
13680 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a 20  pIter, iFirst). 
13690 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
136a0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
136b0 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20  anced(p, pIter, 
136c0 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20  iFirst, 1);.    
136d0 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73    }.      fts5As
136e0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
136f0 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  up(p, pIter);.. 
13700 20 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20       bUseFrom = 
13710 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  0;.    }while( p
13720 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79  Iter->bSkipEmpty
13730 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65   && fts5MultiIte
13740 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65  rIsEmpty(p, pIte
13750 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  r) );.  }.}../*.
13760 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
13770 77 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  w Fts5MultiSegIt
13780 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  er object..**.**
13790 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
137a0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
137b0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
137c0 64 61 74 61 20 69 6e 20 73 74 72 75 63 74 75 72  data in structur
137d0 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66  e pStruct..** If
137e0 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20   iLevel is -ve, 
137f0 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e  then all data in
13800 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73   all segments is
13810 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20   merged. Or, if 
13820 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72  iLevel.** is zer
13830 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61  o or greater, da
13840 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  ta from the firs
13850 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65  t nSegment segme
13860 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65  nts on level iLe
13870 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64  vel.** is merged
13880 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ..**.** The iter
13890 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70  ator initially p
138a0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
138b0 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e  st term/rowid en
138c0 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69  try in the .** i
138d0 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f  terated data..*/
138e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
138f0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20  5MultiIterNew(. 
13900 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13920 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
13930 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
13940 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  in */.  Fts5Stru
13950 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20  cture *pStruct, 
13960 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63          /* Struc
13970 74 75 72 65 20 6f 66 20 73 70 65 63 69 66 69 63  ture of specific
13980 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
13990 62 53 6b 69 70 45 6d 70 74 79 2c 20 20 20 20 20  bSkipEmpty,     
139a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
139b0 72 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 64 65  rue to ignore de
139c0 6c 65 74 65 2d 6b 65 79 73 20 2a 2f 0a 20 20 69  lete-keys */.  i
139d0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
139f0 2a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  * FTS5INDEX_QUER
13a00 59 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  Y_XXX flags */. 
13a10 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
13a20 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20  , int nTerm,    
13a30 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b   /* Term to seek
13a40 20 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20   to (or NULL/0) 
13a50 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
13a80 20 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72   iterate (-1 for
13a90 20 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e   all) */.  int n
13aa0 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20  Segment,        
13ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13ac0 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
13ad0 20 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65   to merge (iLeve
13ae0 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 4d  l>=0) */.  Fts5M
13af0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 2a 70 70  ultiSegIter **pp
13b00 4f 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  Out        /* Ne
13b10 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  w object */.){. 
13b20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20   int nSeg;      
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
13b50 67 6d 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75  gment-iters in u
13b60 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f  se */.  int nSlo
13b70 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
13b80 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72          /* Power
13b90 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20   of two >= nSeg 
13ba0 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d  */.  int iIter =
13bb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13bc0 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74       /* */.  int
13bd0 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13bf0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
13c00 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73  through segments
13c10 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
13c20 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a  ureLevel *pLvl;.
13c30 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
13c40 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73  er *pNew;..  ass
13c50 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20 26  ert( (pTerm==0 &
13c60 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69  & nTerm==0) || i
13c70 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a  Level<0 );..  /*
13c80 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
13c90 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c 74  for the new mult
13ca0 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e 20  i-seg-iterator. 
13cb0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
13cc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13cd0 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
13ce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13cf0 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
13d00 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43  ==fts5StructureC
13d10 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74  ountSegments(pSt
13d20 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e  ruct) );.      n
13d30 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  Seg = pStruct->n
13d40 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20 6e  Segment;.      n
13d50 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73 68  Seg += (p->pHash
13d60 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d   ? 1 : 0);.    }
13d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65 67  else{.      nSeg
13d80 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e   = MIN(pStruct->
13d90 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e  aLevel[iLevel].n
13da0 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a  Seg, nSegment);.
13db0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6e 53      }.    for(nS
13dc0 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65  lot=2; nSlot<nSe
13dd0 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32  g; nSlot=nSlot*2
13de0 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74  );.  }..  *ppOut
13df0 20 3d 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64   = pNew = fts5Id
13e00 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20  xMalloc(p, .    
13e10 20 20 73 69 7a 65 6f 66 28 46 74 73 35 4d 75 6c    sizeof(Fts5Mul
13e20 74 69 53 65 67 49 74 65 72 29 20 2b 20 20 20 20  tiSegIter) +    
13e30 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f        /* pNew */
13e40 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
13e50 73 35 53 65 67 49 74 65 72 29 20 2a 20 6e 53 6c  s5SegIter) * nSl
13e60 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a 20 70 4e  ot +       /* pN
13e70 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20  ew->aSeg[] */.  
13e80 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43      sizeof(Fts5C
13e90 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20  Result) * nSlot 
13ea0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d          /* pNew-
13eb0 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29  >aFirst[] */.  )
13ec0 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
13ed0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77  ) return;.  pNew
13ee0 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a  ->nSeg = nSlot;.
13ef0 20 20 70 4e 65 77 2d 3e 61 53 65 67 20 3d 20 28    pNew->aSeg = (
13f00 46 74 73 35 53 65 67 49 74 65 72 2a 29 26 70 4e  Fts5SegIter*)&pN
13f10 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77 2d 3e 61  ew[1];.  pNew->a
13f20 46 69 72 73 74 20 3d 20 28 46 74 73 35 43 52 65  First = (Fts5CRe
13f30 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65  sult*)&pNew->aSe
13f40 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 70 4e 65 77  g[nSlot];.  pNew
13f50 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c  ->bRev = (0!=(fl
13f60 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
13f70 51 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20  QUERY_DESC));.  
13f80 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79  pNew->bSkipEmpty
13f90 20 3d 20 62 53 6b 69 70 45 6d 70 74 79 3b 0a 0a   = bSkipEmpty;..
13fa0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
13fb0 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70  each of the comp
13fc0 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74  onent segment it
13fd0 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66  erators. */.  if
13fe0 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20  ( iLevel<0 ){.  
13ff0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
14000 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53  evel *pEnd = &pS
14010 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53  truct->aLevel[pS
14020 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  truct->nLevel];.
14030 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68      if( p->pHash
14040 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64   ){.      /* Add
14050 20 61 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61   a segment itera
14060 74 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72 72  tor for the curr
14070 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
14080 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
14090 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  */.      Fts5Seg
140a0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
140b0 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
140c0 2b 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  +];.      fts5Se
140d0 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c  gIterHashInit(p,
140e0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
140f0 6c 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20  lags, pIter);.  
14100 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c    }.    for(pLvl
14110 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  =&pStruct->aLeve
14120 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b  l[0]; pLvl<pEnd;
14130 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pLvl++){.      
14140 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e  for(iSeg=pLvl->n
14150 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20  Seg-1; iSeg>=0; 
14160 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20  iSeg--){.       
14170 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
14180 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
14190 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
141a0 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67  .        Fts5Seg
141b0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
141c0 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
141d0 2b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +];.        if( 
141e0 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
141f0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
14200 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70  rInit(p, pSeg, p
14210 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
14220 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14230 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
14240 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54  nit(p, pTerm, nT
14250 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67  erm, flags, pSeg
14260 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
14270 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14280 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
14290 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
142a0 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a  aLevel[iLevel];.
142b0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65      for(iSeg=nSe
142c0 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
142d0 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73  eg--){.      fts
142e0 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
142f0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
14300 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  ], &pNew->aSeg[i
14310 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a  Iter++]);.    }.
14320 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 49    }.  assert( iI
14330 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20  ter==nSeg );..  
14340 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20  /* If the above 
14350 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20  was successful, 
14360 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69  each component i
14370 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69  terators now poi
14380 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65  nts .  ** to the
14390 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
143a0 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20  its segment. In 
143b0 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61  this case initia
143c0 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61  lize the .  ** a
143d0 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f  First[] array. O
143e0 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  r, if an error h
143f0 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65  as occurred, fre
14400 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20  e the iterator. 
14410 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73   ** object and s
14420 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
14430 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20  riable to NULL. 
14440 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
14450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14460 20 20 66 6f 72 28 69 49 74 65 72 3d 6e 53 6c 6f    for(iIter=nSlo
14470 74 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49  t-1; iIter>0; iI
14480 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e  ter--){.      in
14490 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28  t iEq;.      if(
144a0 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74   (iEq = fts5Mult
144b0 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70  iIterDoCompare(p
144c0 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a  New, iIter)) ){.
144d0 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
144e0 74 65 72 4e 65 78 74 28 70 2c 20 26 70 4e 65 77  terNext(p, &pNew
144f0 2d 3e 61 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b  ->aSeg[iEq], 0);
14500 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
14510 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70  tiIterAdvanced(p
14520 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74  , pNew, iEq, iIt
14530 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
14540 20 7d 0a 20 20 20 20 66 74 73 35 41 73 73 65 72   }.    fts5Asser
14550 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
14560 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69  p, pNew);..    i
14570 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  f( pNew->bSkipEm
14580 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69  pty && fts5Multi
14590 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
145a0 4e 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74  New) ){.      ft
145b0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
145c0 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  p, pNew, 0, 0);.
145d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
145e0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
145f0 46 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20  Free(p, pNew);. 
14600 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20     *ppOut = 0;. 
14610 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
14620 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
14630 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
14640 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  F or if an error
14650 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
14660 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  ** False otherwi
14670 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
14680 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  t fts5MultiIterE
14690 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
146a0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
146b0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
146c0 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49  urn (p->rc || pI
146d0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
146e0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
146f0 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3b 0a  st ].pLeaf==0);.
14700 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
14710 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
14720 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
14730 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
14740 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e  ly points.** to.
14750 20 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   If the iterator
14760 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77   points to EOF w
14770 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
14780 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a  n is called the.
14790 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  ** results are u
147a0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
147b0 74 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74  tic i64 fts5Mult
147c0 69 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 4d  iIterRowid(Fts5M
147d0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
147e0 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
147f0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
14800 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
14810 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20  rst ].pLeaf );. 
14820 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
14830 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
14840 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69  st[1].iFirst ].i
14850 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
14860 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
14870 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
14880 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77  try at or follow
14890 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73  ing iMatch..*/.s
148a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
148b0 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
148c0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
148d0 2c 20 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  , .  Fts5MultiSe
148e0 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20  gIter *pIter, . 
148f0 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20   i64 iMatch.){. 
14900 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
14910 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
14920 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
14930 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20  xt(p, pIter, 1, 
14940 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28  iMatch);.    if(
14950 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
14960 66 28 70 2c 20 70 49 74 65 72 29 20 29 20 62 72  f(p, pIter) ) br
14970 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20  eak;.    iRowid 
14980 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
14990 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
149a0 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76   if( pIter->bRev
149b0 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69  ==0 && iRowid>=i
149c0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
149d0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
149e0 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c  ev!=0 && iRowid<
149f0 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
14a00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
14a10 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
14a20 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
14a30 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61  ining the term a
14a40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
14a50 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61  he .** entry tha
14a60 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
14a70 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
14a80 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  to..*/.static co
14a90 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74  nst u8 *fts5Mult
14aa0 69 49 74 65 72 54 65 72 6d 28 46 74 73 35 4d 75  iIterTerm(Fts5Mu
14ab0 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
14ac0 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46  r, int *pn){.  F
14ad0 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20  ts5SegIter *p = 
14ae0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
14af0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
14b00 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d  First ];.  *pn =
14b10 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65   p->term.n;.  re
14b20 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a  turn p->term.p;.
14b30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
14b40 74 72 75 65 20 69 66 20 74 68 65 20 63 68 75 6e  true if the chun
14b50 6b 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  k iterator passe
14b60 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
14b70 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 61  argument is.** a
14b80 74 20 45 4f 46 2e 20 4f 72 20 69 66 20 61 6e 20  t EOF. Or if an 
14b90 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
14ba0 79 20 6f 63 63 75 72 72 65 64 2e 20 4f 74 68 65  y occurred. Othe
14bb0 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 66 61  rwise, return fa
14bc0 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lse..*/.static i
14bd0 6e 74 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  nt fts5ChunkIter
14be0 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
14bf0 2c 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20  , Fts5ChunkIter 
14c00 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
14c10 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65  n (p->rc || pIte
14c20 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a  r->pLeaf==0);.}.
14c30 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
14c40 68 65 20 63 68 75 6e 6b 2d 69 74 65 72 61 74 6f  he chunk-iterato
14c50 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  r to the next ch
14c60 75 6e 6b 20 6f 66 20 64 61 74 61 20 74 6f 20 72  unk of data to r
14c70 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ead..*/.static v
14c80 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65  oid fts5ChunkIte
14c90 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20  rNext(Fts5Index 
14ca0 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b 49 74 65  *p, Fts5ChunkIte
14cb0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
14cc0 65 72 74 28 20 70 49 74 65 72 2d 3e 6e 52 65 6d  ert( pIter->nRem
14cd0 3e 3d 70 49 74 65 72 2d 3e 6e 20 29 3b 0a 20 20  >=pIter->n );.  
14ce0 70 49 74 65 72 2d 3e 6e 52 65 6d 20 2d 3d 20 70  pIter->nRem -= p
14cf0 49 74 65 72 2d 3e 6e 3b 0a 20 20 66 74 73 35 44  Iter->n;.  fts5D
14d00 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
14d10 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65  ->pLeaf);.  pIte
14d20 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
14d30 70 49 74 65 72 2d 3e 70 20 3d 20 30 3b 0a 20 20  pIter->p = 0;.  
14d40 69 66 28 20 70 49 74 65 72 2d 3e 6e 52 65 6d 3e  if( pIter->nRem>
14d50 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  0 ){.    Fts5Dat
14d60 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 70 49  a *pLeaf;.    pI
14d70 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 2b  ter->iLeafRowid+
14d80 2b 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 70  +;.    pLeaf = p
14d90 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74  Iter->pLeaf = ft
14da0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 70 49  s5DataRead(p, pI
14db0 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 29  ter->iLeafRowid)
14dc0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 20  ;.    if( pLeaf 
14dd0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
14de0 6e 20 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e 6e  n = MIN(pIter->n
14df0 52 65 6d 2c 20 70 4c 65 61 66 2d 3e 6e 2d 34 29  Rem, pLeaf->n-4)
14e00 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
14e10 20 3d 20 70 4c 65 61 66 2d 3e 70 2b 34 3b 0a 20   = pLeaf->p+4;. 
14e20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14e30 2a 20 49 6e 74 69 61 6c 69 7a 65 20 74 68 65 20  * Intialize the 
14e40 63 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20 74  chunk iterator t
14e50 6f 20 72 65 61 64 20 74 68 65 20 70 6f 73 69 74  o read the posit
14e60 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f  ion list data fo
14e70 72 20 77 68 69 63 68 20 0a 2a 2a 20 74 68 65 20  r which .** the 
14e80 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 74  size field is at
14e90 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20   offset iOff of 
14ea0 6c 65 61 66 20 70 4c 65 61 66 2e 20 0a 2a 2f 0a  leaf pLeaf. .*/.
14eb0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14ec0 43 68 75 6e 6b 49 74 65 72 49 6e 69 74 28 0a 20  ChunkIterInit(. 
14ed0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
14f00 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
14f10 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20  5SegIter *pSeg, 
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f30 53 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  Segment iterator
14f40 20 74 6f 20 72 65 61 64 20 70 6f 73 6c 69 73 74   to read poslist
14f50 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 43   from */.  Fts5C
14f60 68 75 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 20  hunkIter *pIter 
14f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14f80 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6f 62  itialize this ob
14f90 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ject */.){.  Fts
14fa0 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70  5Data *pLeaf = p
14fb0 53 65 67 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e  Seg->pLeaf;.  in
14fc0 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69  t iOff = pSeg->i
14fd0 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 6d  LeafOffset;..  m
14fe0 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
14ff0 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
15000 0a 20 20 2f 2a 20 49 66 20 46 74 73 35 53 65 67  .  /* If Fts5Seg
15010 49 74 65 72 2e 70 53 65 67 20 69 73 20 4e 55 4c  Iter.pSeg is NUL
15020 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 74 65  L, then this ite
15030 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 20 74  rator iterates t
15040 68 72 6f 75 67 68 20 64 61 74 61 0a 20 20 2a 2a  hrough data.  **
15050 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
15060 64 20 69 6e 20 61 20 68 61 73 68 20 74 61 62 6c  d in a hash tabl
15070 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
15080 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 65 61 66  there is no leaf
15090 2d 72 6f 77 69 64 0a 20 20 2a 2a 20 74 6f 20 63  -rowid.  ** to c
150a0 61 6c 63 75 6c 61 74 65 2e 20 20 2a 2f 0a 20 20  alculate.  */.  
150b0 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 20 29  if( pSeg->pSeg )
150c0 7b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20  {.    i64 rowid 
150d0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
150e0 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d  OWID(pSeg->pSeg-
150f0 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 53 65 67  >iSegid, 0, pSeg
15100 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ->iLeafPgno);.  
15110 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f    pIter->iLeafRo
15120 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20 7d  wid = rowid;.  }
15130 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 66 65  ..  fts5DataRefe
15140 72 65 6e 63 65 28 70 4c 65 61 66 29 3b 0a 20 20  rence(pLeaf);.  
15150 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
15160 4c 65 61 66 3b 0a 20 20 70 49 74 65 72 2d 3e 6e  Leaf;.  pIter->n
15170 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  Rem = pSeg->nPos
15180 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d  ;.  pIter->n = M
15190 49 4e 28 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f  IN(pLeaf->n - iO
151a0 66 66 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29  ff, pIter->nRem)
151b0 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70  ;.  pIter->p = p
151c0 4c 65 61 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a  Leaf->p + iOff;.
151d0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 3d 3d    if( pIter->n==
151e0 30 20 29 7b 0a 20 20 20 20 66 74 73 35 43 68 75  0 ){.    fts5Chu
151f0 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  nkIterNext(p, pI
15200 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
15210 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
15220 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 46 74  nkIterRelease(Ft
15230 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74  s5ChunkIter *pIt
15240 65 72 29 7b 0a 20 20 66 74 73 35 44 61 74 61 52  er){.  fts5DataR
15250 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
15260 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
15270 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  Leaf = 0;.}.../*
15280 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
15290 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f  ew segment-id fo
152a0 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
152b0 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77  pStruct. The new
152c0 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d   segment.** id m
152d0 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31  ust be between 1
152e0 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75   and 65335 inclu
152f0 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e  sive, and must n
15300 6f 74 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a  ot be used by .*
15310 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20  * any currently 
15320 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74  existing segment
15330 2e 20 49 66 20 61 20 66 72 65 65 20 73 65 67 6d  . If a free segm
15340 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65  ent id cannot be
15350 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
15360 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  E_FULL is return
15370 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
15380 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
15390 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
153a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
153b0 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72  o-op. 0 is .** r
153c0 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20  eturned in this 
153d0 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
153e0 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  int fts5Allocate
153f0 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20  Segid(Fts5Index 
15400 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  *p, Fts5Structur
15410 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 75  e *pStruct){.  u
15420 33 32 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a  32 iSegid = 0;..
15430 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
15440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
15450 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
15460 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45  ent>=FTS5_MAX_SE
15470 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70  GMENT ){.      p
15480 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55  ->rc = SQLITE_FU
15490 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
154a0 20 20 20 20 20 77 68 69 6c 65 28 20 69 53 65 67       while( iSeg
154b0 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  id==0 ){.       
154c0 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
154d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
154e0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
154f0 6f 66 28 75 33 32 29 2c 20 28 76 6f 69 64 2a 29  of(u32), (void*)
15500 26 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20  &iSegid);.      
15510 20 20 69 53 65 67 69 64 20 3d 20 28 69 53 65 67    iSegid = (iSeg
15520 69 64 20 25 20 28 28 31 20 3c 3c 20 46 54 53 35  id % ((1 << FTS5
15530 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 32 29  _DATA_ID_B) - 2)
15540 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 61  ) + 1;.        a
15550 73 73 65 72 74 28 20 69 53 65 67 69 64 3e 30 20  ssert( iSegid>0 
15560 26 26 20 69 53 65 67 69 64 3c 3d 36 35 35 33 35  && iSegid<=65535
15570 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
15580 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
15590 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
155a0 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  vl++){.         
155b0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
155c0 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
155d0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
155e0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
155f0 20 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70     if( iSegid==p
15600 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
15610 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl].aSeg[iSeg].
15620 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20  iSegid ){.      
15630 20 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d          iSegid =
15640 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
15650 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
15660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15670 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
15680 75 72 6e 20 28 69 6e 74 29 69 53 65 67 69 64 3b  urn (int)iSegid;
15690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
156a0 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65  d all data curre
156b0 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74  ntly cached in t
156c0 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a  he hash-tables..
156d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
156e0 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
156f0 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ata(Fts5Index *p
15700 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
15710 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e  pHash || p->nPen
15720 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20  dingData==0 );. 
15730 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b   if( p->pHash ){
15740 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
15750 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61  HashClear(p->pHa
15760 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e  sh);.    p->nPen
15770 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20  dingData = 0;.  
15780 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
15790 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
157a0 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74  e prefix, in byt
157b0 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20  es, that buffer 
157c0 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72  (nNew/pNew) shar
157d0 65 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65  es.** with buffe
157e0 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a  r (nOld/pOld)..*
157f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
15800 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
15810 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e  .  int nOld, con
15820 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69  st u8 *pOld,.  i
15830 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75  nt nNew, const u
15840 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74  8 *pNew.){.  int
15850 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74   i;.  assert( ft
15860 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4f  s5BlobCompare(pO
15870 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e 65 77 2c 20  ld, nOld, pNew, 
15880 6e 4e 65 77 29 3c 30 20 29 3b 0a 20 20 66 6f 72  nNew)<0 );.  for
15890 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
158a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  +){.    if( pOld
158b0 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62  [i]!=pNew[i] ) b
158c0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
158d0 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn i;.}../*.** I
158e0 66 20 61 6e 20 22 6e 45 6d 70 74 79 22 20 72 65  f an "nEmpty" re
158f0 63 6f 72 64 20 6d 75 73 74 20 62 65 20 77 72 69  cord must be wri
15900 74 74 65 6e 20 74 6f 20 74 68 65 20 62 2d 74 72  tten to the b-tr
15910 65 65 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65  ee before the ne
15920 78 74 0a 2a 2a 20 74 65 72 6d 2c 20 77 72 69 74  xt.** term, writ
15930 65 20 69 74 20 6e 6f 77 2e 20 0a 2a 2f 0a 73 74  e it now. .*/.st
15940 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
15950 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 46  iteBtreeNEmpty(F
15960 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
15970 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
15980 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72 69  ter){.  if( pWri
15990 74 65 72 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a 20  ter->nEmpty ){. 
159a0 20 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30     int bFlag = 0
159b0 3b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  ;.    Fts5PageWr
159c0 69 74 65 72 20 2a 70 50 67 3b 0a 20 20 20 20 70  iter *pPg;.    p
159d0 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  Pg = &pWriter->a
159e0 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 20 20 69  Writer[1];.    i
159f0 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  f( pWriter->nEmp
15a00 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ty>=FTS5_MIN_DLI
15a10 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  DX_SIZE ){.     
15a20 20 69 36 34 20 69 4b 65 79 20 3d 20 46 54 53 35   i64 iKey = FTS5
15a30 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57  _DOCLIST_IDX_ROW
15a40 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 57  ID(.          pW
15a50 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70  riter->iSegid, p
15a60 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
15a70 30 5d 2e 70 67 6e 6f 20 2d 20 31 20 2d 20 70 57  0].pgno - 1 - pW
15a80 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 0a 20 20  riter->nEmpty.  
15a90 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
15aa0 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 63 64  ert( pWriter->cd
15ab0 6c 69 64 78 2e 6e 3e 30 20 29 3b 0a 20 20 20 20  lidx.n>0 );.    
15ac0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
15ad0 70 2c 20 69 4b 65 79 2c 20 70 57 72 69 74 65 72  p, iKey, pWriter
15ae0 2d 3e 63 64 6c 69 64 78 2e 70 2c 20 70 57 72 69  ->cdlidx.p, pWri
15af0 74 65 72 2d 3e 63 64 6c 69 64 78 2e 6e 29 3b 0a  ter->cdlidx.n);.
15b00 20 20 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b        bFlag = 1;
15b10 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
15b20 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
15b30 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e  t(&p->rc, &pPg->
15b40 62 75 66 2c 20 62 46 6c 61 67 29 3b 0a 20 20 20  buf, bFlag);.   
15b50 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
15b60 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
15b70 26 70 50 67 2d 3e 62 75 66 2c 20 70 57 72 69 74  &pPg->buf, pWrit
15b80 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20  er->nEmpty);.   
15b90 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
15ba0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
15bb0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69  Whether or not i
15bc0 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  t was written to
15bd0 20 64 69 73 6b 2c 20 7a 65 72 6f 20 74 68 65 20   disk, zero the 
15be0 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 61 74  doclist index at
15bf0 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
15c00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73   */.  sqlite3Fts
15c10 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 57 72  5BufferZero(&pWr
15c20 69 74 65 72 2d 3e 63 64 6c 69 64 78 29 3b 0a 20  iter->cdlidx);. 
15c30 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78   pWriter->bDlidx
15c40 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 7d  PrevValid = 0;.}
15c50 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
15c60 73 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77  s5WriteBtreeGrow
15c70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
15c80 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
15c90 72 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  riter){.  if( p-
15ca0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15cb0 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
15cc0 69 74 65 72 20 2a 61 4e 65 77 3b 0a 20 20 20 20  iter *aNew;.    
15cd0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
15ce0 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 4e  pNew;.    int nN
15cf0 65 77 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  ew = sizeof(Fts5
15d00 50 61 67 65 57 72 69 74 65 72 29 20 2a 20 28 70  PageWriter) * (p
15d10 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 2b  Writer->nWriter+
15d20 31 29 3b 0a 0a 20 20 20 20 61 4e 65 77 20 3d 20  1);..    aNew = 
15d30 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a  (Fts5PageWriter*
15d40 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
15d50 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  (pWriter->aWrite
15d60 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66  r, nNew);.    if
15d70 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
15d80 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
15d90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 72  E_NOMEM;.      r
15da0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
15db0 20 20 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70    pNew = &aNew[p
15dc0 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 5d  Writer->nWriter]
15dd0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  ;.    memset(pNe
15de0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  w, 0, sizeof(Fts
15df0 35 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20  5PageWriter));. 
15e00 20 20 20 70 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20     pNew->pgno = 
15e10 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  1;.    fts5Buffe
15e20 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
15e30 2d 3e 72 63 2c 20 26 70 4e 65 77 2d 3e 62 75 66  ->rc, &pNew->buf
15e40 2c 20 31 29 3b 0a 0a 20 20 20 20 70 57 72 69 74  , 1);..    pWrit
15e50 65 72 2d 3e 6e 57 72 69 74 65 72 2b 2b 3b 0a 20  er->nWriter++;. 
15e60 20 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69     pWriter->aWri
15e70 74 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  ter = aNew;.  }.
15e80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
15e90 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
15ea0 20 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20   each leaf page 
15eb0 65 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74  except the first
15ec0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
15ed0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  * at least one t
15ee0 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e  erm. Argument (n
15ef0 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74  Term/pTerm) is t
15f00 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61  he split-key - a
15f10 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73   term that.** is
15f20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c   larger than all
15f30 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74   terms written t
15f40 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73  o earlier leaves
15f50 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f  , and equal to o
15f60 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61  r.** smaller tha
15f70 6e 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  n the first term
15f80 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66   on the new leaf
15f90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
15fa0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
15fb0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
15fc0 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
15fd0 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a  c. If an error.*
15fe0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  * has already oc
15ff0 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
16000 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
16010 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
16020 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
16030 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65  id fts5WriteBtre
16040 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  eTerm(.  Fts5Ind
16050 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
16060 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
16070 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
16080 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
16090 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
160a0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
160b0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
160c0 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a  Term, const u8 *
160d0 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69  pTerm      /* Fi
160e0 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20  rst term on new 
160f0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
16100 20 69 48 65 69 67 68 74 3b 0a 20 20 66 6f 72 28   iHeight;.  for(
16110 69 48 65 69 67 68 74 3d 31 3b 20 31 3b 20 69 48  iHeight=1; 1; iH
16120 65 69 67 68 74 2b 2b 29 7b 0a 20 20 20 20 46 74  eight++){.    Ft
16130 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
16140 61 67 65 3b 0a 0a 20 20 20 20 69 66 28 20 69 48  age;..    if( iH
16150 65 69 67 68 74 3e 3d 70 57 72 69 74 65 72 2d 3e  eight>=pWriter->
16160 6e 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20 20  nWriter ){.     
16170 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 47   fts5WriteBtreeG
16180 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 29 3b  row(p, pWriter);
16190 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
161a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d   ) return;.    }
161b0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57  .    pPage = &pW
161c0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69  riter->aWriter[i
161d0 48 65 69 67 68 74 5d 3b 0a 0a 20 20 20 20 66 74  Height];..    ft
161e0 73 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70  s5WriteBtreeNEmp
161f0 74 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ty(p, pWriter);.
16200 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
16210 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69  buf.n>=p->pConfi
16220 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  g->pgsz ){.     
16230 20 2f 2a 20 70 50 61 67 65 20 77 69 6c 6c 20 62   /* pPage will b
16240 65 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  e written to dis
16250 6b 2e 20 54 68 65 20 74 65 72 6d 20 77 69 6c 6c  k. The term will
16260 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
16270 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61   the.      ** pa
16280 72 65 6e 74 20 6f 66 20 70 50 61 67 65 2e 20 20  rent of pPage.  
16290 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  */.      i64 iRo
162a0 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
162b0 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
162c0 2d 3e 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  ->iSegid, iHeigh
162d0 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  t, pPage->pgno);
162e0 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
162f0 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20  rite(p, iRowid, 
16300 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50  pPage->buf.p, pP
16310 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20  age->buf.n);.   
16320 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
16330 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a  o(&pPage->buf);.
16340 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
16350 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 74 65 72  Zero(&pPage->ter
16360 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  m);.      fts5Bu
16370 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
16380 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
16390 3e 62 75 66 2c 20 70 50 61 67 65 5b 2d 31 5d 2e  >buf, pPage[-1].
163a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50 61  pgno);.      pPa
163b0 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20  ge->pgno++;.    
163c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
163d0 20 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65 66   nPre = fts5Pref
163e0 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65  ixCompress(pPage
163f0 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d  ->term.n, pPage-
16400 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20  >term.p, nTerm, 
16410 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74  pTerm);.      ft
16420 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
16430 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
16440 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 2b 32  age->buf, nPre+2
16450 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
16460 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
16470 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
16480 62 75 66 2c 20 6e 54 65 72 6d 2d 6e 50 72 65 29  buf, nTerm-nPre)
16490 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
164a0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
164b0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
164c0 2c 20 6e 54 65 72 6d 2d 6e 50 72 65 2c 20 70 54  , nTerm-nPre, pT
164d0 65 72 6d 2b 6e 50 72 65 29 3b 0a 20 20 20 20 20  erm+nPre);.     
164e0 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
164f0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74  p->rc, &pPage->t
16500 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  erm, nTerm, pTer
16510 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
16520 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
16530 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
16540 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a  iteBtreeNoTerm(.
16550 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
16580 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
16590 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
165a0 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  iter          /*
165b0 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
165c0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74  /.){.  if( pWrit
165d0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
165e0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nPage ){.    /* 
165f0 4e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 69  No rowids on thi
16600 73 20 70 61 67 65 2e 20 41 70 70 65 6e 64 20 61  s page. Append a
16610 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20 74  n 0x00 byte to t
16620 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20  he current .    
16630 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
16640 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69   */.    if( pWri
16650 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56  ter->bDlidxPrevV
16660 61 6c 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  alid==0 ){.     
16670 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 70 57   i64 iRowid = pW
16680 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
16690 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
166a0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
166b0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
166c0 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c  pWriter->cdlidx,
166d0 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
166e0 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50  pWriter->bDlidxP
166f0 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  revValid = 1;.  
16700 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 44 6c      pWriter->iDl
16710 69 64 78 50 72 65 76 20 3d 20 69 52 6f 77 69 64  idxPrev = iRowid
16720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16730 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
16740 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
16750 2c 20 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69  , &pWriter->cdli
16760 64 78 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 57  dx, 0);.  }.  pW
16770 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b  riter->nEmpty++;
16780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20  .}../*.** Rowid 
16790 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20  iRowid has just 
167a0 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f  been appended to
167b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
167c0 66 20 70 61 67 65 2e 20 41 73 20 69 74 20 69 73  f page. As it is
167d0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e  .** the first on
167e0 20 69 74 73 20 70 61 67 65 2c 20 61 70 70 65 6e   its page, appen
167f0 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
16800 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
16810 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  t-index..*/.stat
16820 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
16830 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20 20  eDlidxAppend(.  
16840 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
16850 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
16860 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34 20  pWriter, .  i64 
16870 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 36 34 20  iRowid.){.  i64 
16880 69 56 61 6c 3b 0a 20 20 69 66 28 20 70 57 72 69  iVal;.  if( pWri
16890 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56  ter->bDlidxPrevV
168a0 61 6c 69 64 20 29 7b 0a 20 20 20 20 69 56 61 6c  alid ){.    iVal
168b0 20 3d 20 69 52 6f 77 69 64 20 2d 20 70 57 72 69   = iRowid - pWri
168c0 74 65 72 2d 3e 69 44 6c 69 64 78 50 72 65 76 3b  ter->iDlidxPrev;
168d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
168e0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
168f0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
16900 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 63 64  rc, &pWriter->cd
16910 6c 69 64 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20  lidx, iRowid);. 
16920 20 20 20 69 56 61 6c 20 3d 20 31 3b 0a 20 20 7d     iVal = 1;.  }
16930 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  .  sqlite3Fts5Bu
16940 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
16950 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
16960 72 2d 3e 63 64 6c 69 64 78 2c 20 69 56 61 6c 29  r->cdlidx, iVal)
16970 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 44 6c  ;.  pWriter->bDl
16980 69 64 78 50 72 65 76 56 61 6c 69 64 20 3d 20 31  idxPrevValid = 1
16990 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 44 6c  ;.  pWriter->iDl
169a0 69 64 78 50 72 65 76 20 3d 20 69 52 6f 77 69 64  idxPrev = iRowid
169b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
169c0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
169d0 65 61 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  eaf(Fts5Index *p
169e0 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
169f0 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73 74 61  *pWriter){.  sta
16a00 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
16a10 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78  o[] = { 0x00, 0x
16a20 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
16a30 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  ;.  Fts5PageWrit
16a40 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
16a50 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
16a60 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  ;.  i64 iRowid;.
16a70 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
16a80 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
16a90 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65   ){.    /* No te
16aa0 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  rm was written t
16ab0 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a  o this page. */.
16ac0 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66      assert( 0==f
16ad0 74 73 35 47 65 74 55 31 36 28 26 70 50 61 67 65  ts5GetU16(&pPage
16ae0 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20  ->buf.p[2]) );. 
16af0 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65     fts5WriteBtre
16b00 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72 69 74  eNoTerm(p, pWrit
16b10 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  er);.  }..  /* W
16b20 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
16b30 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 62 2e   page to the db.
16b40 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20 46   */.  iRowid = F
16b50 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
16b60 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
16b70 64 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d, 0, pPage->pgn
16b80 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72  o);.  fts5DataWr
16b90 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70  ite(p, iRowid, p
16ba0 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
16bb0 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f  ge->buf.n);..  /
16bc0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
16bd0 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20   next page. */. 
16be0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
16bf0 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20  &pPage->buf);.  
16c00 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
16c10 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
16c20 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
16c30 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e  o);.  pPage->pgn
16c40 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  o++;..  /* Incre
16c50 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20 77  ase the leaves w
16c60 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a  ritten counter *
16c70 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  /.  pWriter->nLe
16c80 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20  afWritten++;..  
16c90 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20  /* The new leaf 
16ca0 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f  holds no terms o
16cb0 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57  r rowids */.  pW
16cc0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
16cd0 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70  mInPage = 1;.  p
16ce0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
16cf0 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d  widInPage = 1;.}
16d00 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
16d10 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
16d20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
16d30 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20  eing written by 
16d40 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65  the writer passe
16d50 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f  d.** as the seco
16d60 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
16d70 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
16d80 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
16d90 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
16da0 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
16db0 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
16dc0 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
16dd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
16de0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
16df0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
16e00 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74  AppendTerm(.  Ft
16e10 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
16e20 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16e30 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65  riter,.  int nTe
16e40 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  rm, const u8 *pT
16e50 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  erm .){.  int nP
16e60 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
16e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
16e80 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
16e90 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72  pression for ter
16ea0 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  m */.  Fts5PageW
16eb0 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
16ec0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
16ed0 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  [0];..  assert( 
16ee0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20  pPage->buf.n==0 
16ef0 7c 7c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  || pPage->buf.n>
16f00 34 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  4 );.  if( pPage
16f10 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20  ->buf.n==0 ){.  
16f20 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69    /* Zero the fi
16f30 72 73 74 20 74 65 72 6d 20 61 6e 64 20 66 69 72  rst term and fir
16f40 73 74 20 64 6f 63 69 64 20 66 69 65 6c 64 73 20  st docid fields 
16f50 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
16f60 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20  nst u8 zero[] = 
16f70 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  { 0x00, 0x00, 0x
16f80 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 20 20  00, 0x00 };.    
16f90 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
16fa0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
16fb0 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
16fc0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
16fd0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
16fe0 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 20 20 7d  ermInPage );.  }
16ff0 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
17000 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28 20  eturn;.  .  if( 
17010 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
17020 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  ermInPage ){.   
17030 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 22   /* Update the "
17040 66 69 72 73 74 20 74 65 72 6d 22 20 66 69 65 6c  first term" fiel
17050 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  d of the page he
17060 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ader. */.    ass
17070 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e  ert( pPage->buf.
17080 70 5b 32 5d 3d 3d 30 20 26 26 20 70 50 61 67 65  p[2]==0 && pPage
17090 2d 3e 62 75 66 2e 70 5b 33 5d 3d 3d 30 20 29 3b  ->buf.p[3]==0 );
170a0 0a 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28  .    fts5PutU16(
170b0 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d  &pPage->buf.p[2]
170c0 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  , pPage->buf.n);
170d0 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30  .    nPrefix = 0
170e0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
170f0 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20  >pgno!=1 ){.    
17100 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
17110 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 61   first term on a
17120 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 6e 6f   leaf that is no
17130 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c  t the leftmost l
17140 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  eaf in.      ** 
17150 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  the segment b-tr
17160 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
17170 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
17180 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d 20 74   to add a term t
17190 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 62  o.      ** the b
171a0 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
171b0 74 68 61 74 20 69 73 20 28 61 29 20 6c 61 72 67  that is (a) larg
171c0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
171d0 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20 20 20  est term .      
171e0 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  ** already writt
171f0 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e  en to the segmen
17200 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65  t and (b) smalle
17210 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
17220 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  to.      ** this
17230 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20   term. In other 
17240 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69 78 20  words, a prefix 
17250 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  of (pTerm/nTerm)
17260 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20 20 20   that is one.   
17270 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65     ** byte longe
17280 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65  r than the longe
17290 73 74 20 70 72 65 66 69 78 20 28 70 54 65 72 6d  st prefix (pTerm
172a0 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73 20 77  /nTerm) shares w
172b0 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ith the.      **
172c0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20   previous term. 
172d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
172e0 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20  ** Usually, the 
172f0 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73  previous term is
17300 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 50   available in pP
17310 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65  age->term. The e
17320 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a  xception.      *
17330 2a 20 69 73 20 69 66 20 74 68 69 73 20 69 73 20  * is if this is 
17340 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 77  the first term w
17350 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63  ritten in an inc
17360 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73  remental-merge s
17370 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  tep..      ** In
17380 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
17390 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20  revious term is 
173a0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 73  not available, s
173b0 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61 0a 20  o just write a. 
173c0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
173d0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e  (pTerm/nTerm) in
173e0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f  to the parent no
173f0 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  de. This is slig
17400 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e  htly.      ** in
17410 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20 73  efficient, but s
17420 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a  till correct.  *
17430 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  /.      int n = 
17440 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  nTerm;.      if(
17450 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29   pPage->term.n )
17460 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 31 20  {.        n = 1 
17470 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  + fts5PrefixComp
17480 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d  ress(pPage->term
17490 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e  .n, pPage->term.
174a0 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  p, nTerm, pTerm)
174b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
174c0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65  fts5WriteBtreeTe
174d0 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e  rm(p, pWriter, n
174e0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
174f0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
17500 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20  ->aWriter[0];.  
17510 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
17520 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35 50   nPrefix = fts5P
17530 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
17540 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61  age->term.n, pPa
17550 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72  ge->term.p, nTer
17560 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 66  m, pTerm);.    f
17570 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
17580 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
17590 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66  Page->buf, nPref
175a0 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ix);.  }..  /* A
175b0 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  ppend the number
175c0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77   of bytes of new
175d0 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20   data, then the 
175e0 74 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66  term data itself
175f0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  .  ** to the pag
17600 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  e. */.  fts5Buff
17610 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
17620 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
17630 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65  uf, nTerm - nPre
17640 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66  fix);.  fts5Buff
17650 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
17660 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
17670 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69  , nTerm - nPrefi
17680 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69  x, &pTerm[nPrefi
17690 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74  x]);..  /* Updat
176a0 65 20 74 68 65 20 46 74 73 35 50 61 67 65 57 72  e the Fts5PageWr
176b0 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e  iter.term field.
176c0 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72   */.  fts5Buffer
176d0 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  Set(&p->rc, &pPa
176e0 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c  ge->term, nTerm,
176f0 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74   pTerm);.  pWrit
17700 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
17710 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72  Page = 0;..  pWr
17720 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
17730 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  dInPage = 0;.  p
17740 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
17750 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31  widInDoclist = 1
17760 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
17770 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
17780 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20   is full, flush 
17790 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20  it to disk. */. 
177a0 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
177b0 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
177c0 67 73 7a 20 29 7b 0a 20 20 20 20 66 74 73 35 57  gsz ){.    fts5W
177d0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
177e0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 7d   pWriter);.  }.}
177f0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
17800 20 64 6f 63 69 64 20 61 6e 64 20 70 6f 73 69 74   docid and posit
17810 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
17820 65 6c 64 20 74 6f 20 74 68 65 20 77 72 69 74 65  eld to the write
17830 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73  rs output. .*/.s
17840 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
17850 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
17860 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
17870 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
17880 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36  r *pWriter,.  i6
17890 34 20 69 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20  4 iRowid,.  int 
178a0 6e 50 6f 73 0a 29 7b 0a 20 20 69 66 28 20 70 2d  nPos.){.  if( p-
178b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
178c0 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
178d0 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
178e0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
178f0 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  0];..    /* If t
17900 68 69 73 20 69 73 20 74 6f 20 62 65 20 74 68 65  his is to be the
17910 20 66 69 72 73 74 20 64 6f 63 69 64 20 77 72 69   first docid wri
17920 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65  tten to the page
17930 2c 20 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a  , set the .    *
17940 2a 20 64 6f 63 69 64 2d 70 6f 69 6e 74 65 72 20  * docid-pointer 
17950 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  in the page-head
17960 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20  er. Also append 
17970 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  a value to the d
17980 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66  lidx.    ** buff
17990 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f  er, in case a do
179a0 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72  clist-index is r
179b0 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20  equired.  */.   
179c0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
179d0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
179e0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75 74  ){.      fts5Put
179f0 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70  U16(pPage->buf.p
17a00 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  , pPage->buf.n);
17a10 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
17a20 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70  DlidxAppend(p, p
17a30 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b  Writer, iRowid);
17a40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57  .    }..    /* W
17a50 72 69 74 65 20 74 68 65 20 64 6f 63 69 64 2e 20  rite the docid. 
17a60 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74  */.    if( pWrit
17a70 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
17a80 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69  nDoclist || pWri
17a90 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
17aa0 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  InPage ){.      
17ab0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
17ac0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
17ad0 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77  pPage->buf, iRow
17ae0 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
17af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17b00 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57  >rc || iRowid>pW
17b10 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
17b20 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  d );.      fts5B
17b30 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
17b40 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
17b50 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20  ->buf, iRowid - 
17b60 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
17b70 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
17b80 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
17b90 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
17ba0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
17bb0 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
17bc0 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72  = 0;.    pWriter
17bd0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
17be0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 66 74  age = 0;..    ft
17bf0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
17c00 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
17c10 61 67 65 2d 3e 62 75 66 2c 20 6e 50 6f 73 29 3b  age->buf, nPos);
17c20 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ..    if( pPage-
17c30 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
17c40 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
17c50 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
17c60 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
17c70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
17c80 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64  if 0.static void
17c90 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
17ca0 50 6f 73 6c 69 73 74 49 6e 74 28 0a 20 20 46 74  PoslistInt(.  Ft
17cb0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
17cc0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
17cd0 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 69 56 61  riter,.  int iVa
17ce0 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  l.){.  if( p->rc
17cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17d00 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
17d10 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
17d20 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b  ter->aWriter[0];
17d30 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
17d40 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
17d50 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
17d60 20 69 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20   iVal);.    if( 
17d70 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d  pPage->buf.n>=p-
17d80 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
17d90 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  {.      fts5Writ
17da0 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57  eFlushLeaf(p, pW
17db0 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  riter);.    }.  
17dc0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  }.}.#endif..stat
17dd0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
17de0 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
17df0 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ta(.  Fts5Index 
17e00 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
17e10 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
17e20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74    const u8 *aDat
17e30 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a  a, .  int nData.
17e40 29 7b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  ){.  Fts5PageWri
17e50 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
17e60 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
17e70 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ];.  const u8 *a
17e80 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20   = aData;.  int 
17e90 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20  n = nData;.  .  
17ea0 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
17eb0 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20  ig->pgsz>0 );.  
17ec0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
17ed0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67  LITE_OK && (pPag
17ee0 65 2d 3e 62 75 66 2e 6e 20 2b 20 6e 29 3e 3d 70  e->buf.n + n)>=p
17ef0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
17f00 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20  ){.    int nReq 
17f10 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
17f20 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e  sz - pPage->buf.
17f30 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  n;.    int nCopy
17f40 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
17f50 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20   nCopy<nReq ){. 
17f60 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a       i64 dummy;.
17f70 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 67        nCopy += g
17f80 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70  etVarint(&a[nCop
17f90 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d 79  y], (u64*)&dummy
17fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
17fb0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
17fc0 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
17fd0 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29  ->buf, nCopy, a)
17fe0 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79  ;.    a += nCopy
17ff0 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79  ;.    n -= nCopy
18000 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46  ;.    fts5WriteF
18010 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
18020 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ter);.  }.  if( 
18030 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  n>0 ){.    fts5B
18040 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
18050 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
18060 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a  buf, n, a);.  }.
18070 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
18080 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65  ts5WriteAppendZe
18090 72 6f 62 79 74 65 28 46 74 73 35 49 6e 64 65 78  robyte(Fts5Index
180a0 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
180b0 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
180c0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
180d0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
180e0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
180f0 5b 30 5d 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a  [0].buf, 0);.}..
18100 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
18110 64 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74  data cached by t
18120 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74  he writer object
18130 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18140 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c  . Free any.** al
18150 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
18160 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72  ated with the wr
18170 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iter..*/.static 
18180 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69  void fts5WriteFi
18190 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  nish(.  Fts5Inde
181a0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
181b0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
181c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
181d0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
181e0 6e 74 20 2a 70 6e 48 65 69 67 68 74 2c 20 20 20  nt *pnHeight,   
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18200 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 6f 66  * OUT: Height of
18210 20 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 20   the b-tree */. 
18220 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20   int *pnLeaf    
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
18250 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e  of leaf pages in
18260 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20   b-tree */.){.  
18270 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
18280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18290 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69  .    Fts5PageWri
182a0 74 65 72 20 2a 70 4c 65 61 66 20 3d 20 26 70 57  ter *pLeaf = &pW
182b0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
182c0 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  ];.    if( pLeaf
182d0 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 4c 65  ->pgno==1 && pLe
182e0 61 66 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a  af->buf.n==0 ){.
182f0 20 20 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20        *pnLeaf = 
18300 30 3b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  0;.      *pnHeig
18310 68 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ht = 0;.    }els
18320 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  e{.      if( pLe
18330 61 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20  af->buf.n>4 ){. 
18340 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
18350 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
18360 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iter);.      }. 
18370 20 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70       *pnLeaf = p
18380 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20  Leaf->pgno-1;.  
18390 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
183a0 3e 6e 57 72 69 74 65 72 3d 3d 31 20 26 26 20 70  >nWriter==1 && p
183b0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d  Writer->nEmpty>=
183c0 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
183d0 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66  IZE ){.        f
183e0 74 73 35 57 72 69 74 65 42 74 72 65 65 47 72 6f  ts5WriteBtreeGro
183f0 77 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  w(p, pWriter);. 
18400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18410 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65   pWriter->nWrite
18420 72 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 66  r>1 ){.        f
18430 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d  ts5WriteBtreeNEm
18440 70 74 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b  pty(p, pWriter);
18450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
18460 70 6e 48 65 69 67 68 74 20 3d 20 70 57 72 69 74  pnHeight = pWrit
18470 65 72 2d 3e 6e 57 72 69 74 65 72 3b 0a 0a 20 20  er->nWriter;..  
18480 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
18490 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b  Writer->nWriter;
184a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46   i++){.        F
184b0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
184c0 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  Pg = &pWriter->a
184d0 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20  Writer[i];.     
184e0 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
184f0 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
18500 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
18510 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
18520 67 69 64 2c 20 69 2c 20 70 50 67 2d 3e 70 67 6e  gid, i, pPg->pgn
18530 6f 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  o), .           
18540 20 70 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67   pPg->buf.p, pPg
18550 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 20 20  ->buf.n.        
18560 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
18570 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
18580 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74  i<pWriter->nWrit
18590 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  er; i++){.    Ft
185a0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
185b0 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  g = &pWriter->aW
185c0 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 66 74  riter[i];.    ft
185d0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 50  s5BufferFree(&pP
185e0 67 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 66 74  g->term);.    ft
185f0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 50  s5BufferFree(&pP
18600 67 2d 3e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73  g->buf);.  }.  s
18610 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69  qlite3_free(pWri
18620 74 65 72 2d 3e 61 57 72 69 74 65 72 29 3b 0a 20  ter->aWriter);. 
18630 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
18640 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d  erFree(&pWriter-
18650 3e 63 64 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61  >cdlidx);.}..sta
18660 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
18670 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  teInit(.  Fts5In
18680 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
18690 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
186a0 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64  r, .  int iSegid
186b0 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 57 72  .){.  memset(pWr
186c0 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  iter, 0, sizeof(
186d0 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b  Fts5SegWriter));
186e0 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  .  pWriter->iSeg
186f0 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20  id = iSegid;..  
18700 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
18710 20 3d 20 28 46 74 73 35 50 61 67 65 57 72 69 74   = (Fts5PageWrit
18720 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
18730 63 28 70 2c 73 69 7a 65 6f 66 28 46 74 73 35 50  c(p,sizeof(Fts5P
18740 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20 20 69  ageWriter));.  i
18750 66 28 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69  f( pWriter->aWri
18760 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ter==0 ) return;
18770 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69  .  pWriter->nWri
18780 74 65 72 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  ter = 1;.  pWrit
18790 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70  er->aWriter[0].p
187a0 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  gno = 1;.  pWrit
187b0 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
187c0 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 73 74 61  Page = 1;.}..sta
187d0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
187e0 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28  teInitForAppend(
187f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18810 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
18820 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
18830 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
18840 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
18850 2a 20 57 72 69 74 65 72 20 74 6f 20 69 6e 69 74  * Writer to init
18860 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 46 74 73 35  ialize */.  Fts5
18870 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
18880 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53   *pSeg      /* S
18890 65 67 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f  egment object to
188a0 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b   append to */.){
188b0 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70  .  int nByte = p
188c0 53 65 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73  Seg->nHeight * s
188d0 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72  izeof(Fts5PageWr
188e0 69 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  iter);.  memset(
188f0 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  pWriter, 0, size
18900 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
18910 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  ));.  pWriter->i
18920 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53  Segid = pSeg->iS
18930 65 67 69 64 3b 0a 20 20 70 57 72 69 74 65 72 2d  egid;.  pWriter-
18940 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74 73 35  >aWriter = (Fts5
18950 50 61 67 65 57 72 69 74 65 72 2a 29 66 74 73 35  PageWriter*)fts5
18960 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79  IdxMalloc(p, nBy
18970 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  te);..  if( p->r
18980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18990 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 31      int pgno = 1
189a0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
189b0 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65   pWriter->nWrite
189c0 72 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68  r = pSeg->nHeigh
189d0 74 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  t;.    pWriter->
189e0 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20  aWriter[0].pgno 
189f0 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
18a00 2b 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53  +1;.    for(i=pS
18a10 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20 69  eg->nHeight-1; i
18a20 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
18a30 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
18a40 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
18a50 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
18a60 20 69 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20   i, pgno);.     
18a70 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
18a80 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d  *pPg = &pWriter-
18a90 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20  >aWriter[i];.   
18aa0 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70     pPg->pgno = p
18ab0 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74 73 35 44  gno;.      fts5D
18ac0 61 74 61 42 75 66 66 65 72 28 70 2c 20 26 70 50  ataBuffer(p, &pP
18ad0 67 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b  g->buf, iRowid);
18ae0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
18af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18b00 20 20 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49         Fts5NodeI
18b10 74 65 72 20 73 73 3b 0a 20 20 20 20 20 20 20 20  ter ss;.        
18b20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
18b30 28 70 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67  (pPg->buf.p, pPg
18b40 2d 3e 62 75 66 2e 6e 2c 20 26 73 73 29 3b 0a 20  ->buf.n, &ss);. 
18b50 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 73         while( ss
18b60 2e 61 44 61 74 61 20 29 20 66 74 73 35 4e 6f 64  .aData ) fts5Nod
18b70 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
18b80 2c 20 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20  , &ss);.        
18b90 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
18ba0 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 74 65 72 6d  ->rc, &pPg->term
18bb0 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e  , ss.term.n, ss.
18bc0 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20  term.p);.       
18bd0 20 70 67 6e 6f 20 3d 20 73 73 2e 69 43 68 69 6c   pgno = ss.iChil
18be0 64 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e  d;.        fts5N
18bf0 6f 64 65 49 74 65 72 46 72 65 65 28 26 73 73 29  odeIterFree(&ss)
18c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18c10 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 48      if( pSeg->nH
18c20 65 69 67 68 74 3d 3d 31 20 29 7b 0a 20 20 20 20  eight==1 ){.    
18c30 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74    pWriter->nEmpt
18c40 79 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  y = pSeg->pgnoLa
18c50 73 74 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  st-1;.    }.    
18c60 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
18c70 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 67 6e  QLITE_OK || (pgn
18c80 6f 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74  o+pWriter->nEmpt
18c90 79 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  y)==pSeg->pgnoLa
18ca0 73 74 20 29 3b 0a 20 20 20 20 70 57 72 69 74 65  st );.    pWrite
18cb0 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
18cc0 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  age = 1;.    ass
18cd0 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 61 57  ert( pWriter->aW
18ce0 72 69 74 65 72 5b 30 5d 2e 74 65 72 6d 2e 6e 3d  riter[0].term.n=
18cf0 3d 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  =0 );.  }.}../*.
18d00 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
18d10 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74  r was used to it
18d20 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
18d30 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  e input segments
18d40 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63   of on an.** inc
18d50 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f  remental merge o
18d60 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66  peration. This f
18d70 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
18d80 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65  d if the increme
18d90 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74  ntal.** merge st
18da0 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ep has finished 
18db0 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61  but the input ha
18dc0 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c  s not been compl
18dd0 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e  etely exhausted.
18de0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18df0 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
18e00 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
18e10 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
18e20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
18e30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
18e40 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
18e50 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
18e60 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72  5Buffer));.  for
18e70 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
18e80 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Seg; i++){.    F
18e90 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
18ea0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
18eb0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67  i];.    if( pSeg
18ec0 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pSeg==0 ){.   
18ed0 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
18ee0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
18ef0 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  g->pLeaf==0 ){. 
18f00 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73       /* All keys
18f10 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74   from this input
18f20 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62 65   segment have be
18f30 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f  en transfered to
18f40 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20   the output..   
18f50 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20 74     ** Set both t
18f60 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73  he first and las
18f70 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 74  t page-numbers t
18f80 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20  o 0 to indicate 
18f90 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
18fa0 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77  * segment is now
18fb0 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
18fc0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
18fd0 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  oLast = 0;.     
18fe0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
18ff0 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20  oFirst = 0;.    
19000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
19010 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54   iOff = pSeg->iT
19020 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ermLeafOffset;  
19030 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20     /* Offset on 
19040 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66 20 70  new first leaf p
19050 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  age */.      i64
19060 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20   iLeafRowid;.   
19070 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61     Fts5Data *pDa
19080 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ta;.      int iI
19090 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e  d = pSeg->pSeg->
190a0 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38  iSegid;.      u8
190b0 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30   aHdr[4] = {0x00
190c0 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
190d0 30 34 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61  04};..      iLea
190e0 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  fRowid = FTS5_SE
190f0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c  GMENT_ROWID(iId,
19100 20 30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c   0, pSeg->iTermL
19110 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  eafPgno);.      
19120 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
19130 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77  Read(p, iLeafRow
19140 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
19150 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
19160 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
19170 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74  buf);.        ft
19180 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
19190 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
191a0 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61   sizeof(aHdr), a
191b0 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Hdr);.        ft
191c0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
191d0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
191e0 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29  f, pSeg->term.n)
191f0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
19200 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
19210 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
19220 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d  g->term.n, pSeg-
19230 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20  >term.p);.      
19240 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
19250 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
19260 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 20 2d 20  buf, pData->n - 
19270 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b  iOff, &pData->p[
19280 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20  iOff]);.        
19290 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
192a0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
192b0 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
192c0 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54  First = pSeg->iT
192d0 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ermLeafPgno;.   
192e0 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c       fts5DataDel
192f0 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ete(p, FTS5_SEGM
19300 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 30  ENT_ROWID(iId, 0
19310 2c 20 31 29 2c 69 4c 65 61 66 52 6f 77 69 64 29  , 1),iLeafRowid)
19320 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
19330 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66  taWrite(p, iLeaf
19340 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75  Rowid, buf.p, bu
19350 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  f.n);.      }.  
19360 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75    }.  }.  fts5Bu
19370 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
19380 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
19390 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
193a0 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46  xMergeLevel(.  F
193b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
193d0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
193e0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
193f0 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
19400 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
19410 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
19420 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
19430 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19450 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  Level to read in
19460 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  put from */.  in
19470 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19490 20 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69   Write up to thi
194a0 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65  s many output le
194b0 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  aves */.){.  Fts
194c0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
194d0 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
194e0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
194f0 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
19500 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
19510 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75  Lvl];.  Fts5Stru
19520 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
19530 4f 75 74 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69  Out;.  Fts5Multi
19540 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
19550 20 30 3b 20 20 20 20 2f 2a 20 49 74 65 72 61 74   0;    /* Iterat
19560 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  or to read input
19570 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
19580 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70  Rem = pnRem ? *p
19590 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75  nRem : 0;  /* Ou
195a0 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20  tput leaf pages 
195b0 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
195c0 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20  .  int nInput;  
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
195f0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
19600 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
19610 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20  r writer;       
19620 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
19630 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
19640 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
19650 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74  pSeg;     /* Out
19660 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
19670 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
19680 3b 0a 20 20 69 6e 74 20 62 52 65 71 75 69 72 65  ;.  int bRequire
19690 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 30 3b  DoclistTerm = 0;
196a0 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74      /* Doclist t
196b0 65 72 6d 69 6e 61 74 6f 72 20 28 30 78 30 30 29  erminator (0x00)
196c0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
196d0 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20  nt bOldest;     
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
196f0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75  * True if the ou
19700 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20  tput segment is 
19710 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 0a 20  the oldest */.. 
19720 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53   assert( iLvl<pS
19730 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b  truct->nLevel );
19740 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d  .  assert( pLvl-
19750 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
19760 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  Seg );..  memset
19770 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
19780 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
19790 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74  r));.  memset(&t
197a0 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
197b0 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
197c0 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
197d0 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d  ){.    pLvlOut =
197e0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
197f0 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61  l[iLvl+1];.    a
19800 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e  ssert( pLvlOut->
19810 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49  nSeg>0 );.    nI
19820 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65  nput = pLvl->nMe
19830 72 67 65 3b 0a 20 20 20 20 66 74 73 35 57 72 69  rge;.    fts5Wri
19840 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28  teInitForAppend(
19850 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 4c 76  p, &writer, &pLv
19860 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
19870 75 74 2d 3e 6e 53 65 67 2d 31 5d 29 3b 0a 20 20  ut->nSeg-1]);.  
19880 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
19890 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
198a0 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20 7d 65 6c 73  >nSeg-1];.  }els
198b0 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  e{.    int iSegi
198c0 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
198d0 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
198e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e  );..    /* Exten
198f0 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74  d the Fts5Struct
19900 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65  ure object as re
19910 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65  quired to ensure
19920 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
19930 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74  ** segment exist
19940 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c  s. */.    if( iL
19950 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65  vl==pStruct->nLe
19960 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  vel-1 ){.      f
19970 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
19980 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53  evel(&p->rc, ppS
19990 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
199a0 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
199b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  t;.    }.    fts
199c0 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
199d0 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53  Level(&p->rc, pS
199e0 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31  truct, iLvl+1, 1
199f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
19a00 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
19a10 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
19a20 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
19a30 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26  .    pLvlOut = &
19a40 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
19a50 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74  iLvl+1];..    ft
19a60 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
19a70 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b  writer, iSegid);
19a80 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
19a90 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20   new segment to 
19aa0 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c  the output level
19ab0 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26   */.    pSeg = &
19ac0 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
19ad0 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20  vlOut->nSeg];.  
19ae0 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b    pLvlOut->nSeg+
19af0 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  +;.    pSeg->pgn
19b00 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
19b10 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
19b20 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75  Segid;.    pStru
19b30 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a  ct->nSegment++;.
19b40 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70  .    /* Read inp
19b50 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d  ut from all segm
19b60 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ents in the inpu
19b70 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e  t level */.    n
19b80 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  Input = pLvl->nS
19b90 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73  eg;.  }.  bOldes
19ba0 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53  t = (pLvlOut->nS
19bb0 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74  eg==1 && pStruct
19bc0 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32  ->nLevel==iLvl+2
19bd0 29 3b 0a 0a 23 69 66 20 30 0a 66 70 72 69 6e 74  );..#if 0.fprint
19be0 66 28 73 74 64 6f 75 74 2c 20 22 6d 65 72 67 69  f(stdout, "mergi
19bf0 6e 67 20 25 64 20 73 65 67 6d 65 6e 74 73 20 66  ng %d segments f
19c00 72 6f 6d 20 6c 65 76 65 6c 20 25 64 21 22 2c 20  rom level %d!", 
19c10 6e 49 6e 70 75 74 2c 20 69 4c 76 6c 29 3b 0a 66  nInput, iLvl);.f
19c20 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 23  flush(stdout);.#
19c30 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
19c40 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f   iLvl>=0 );.  fo
19c50 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
19c60 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30  ew(p, pStruct, 0
19c70 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c  , 0, 0, 0, iLvl,
19c80 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29   nInput, &pIter)
19c90 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
19ca0 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
19cb0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  r)==0;.      fts
19cc0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
19cd0 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20  , pIter, 0, 0). 
19ce0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
19cf0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
19d00 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
19d10 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
19d20 74 20 5d 3b 0a 20 20 20 20 46 74 73 35 43 68 75  t ];.    Fts5Chu
19d30 6e 6b 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20  nkIter sPos;    
19d40 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
19d50 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
19d60 68 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  h position list 
19d70 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  */.    int nPos;
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e       /* position
19da0 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
19db0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
19dc0 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  t nTerm;.    con
19dd0 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20  st u8 *pTerm;.. 
19de0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
19df0 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e  key annihilation
19e00 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  . */.    if( pSe
19e10 67 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28 62  g->nPos==0 && (b
19e20 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67 2d 3e  Oldest || pSeg->
19e30 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69  bDel==0) ) conti
19e40 6e 75 65 3b 0a 0a 20 20 20 20 66 74 73 35 43 68  nue;..    fts5Ch
19e50 75 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70  unkIterInit(p, p
19e60 53 65 67 2c 20 26 73 50 6f 73 29 3b 0a 0a 20 20  Seg, &sPos);..  
19e70 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75    pTerm = fts5Mu
19e80 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
19e90 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  r, &nTerm);.    
19ea0 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e  if( nTerm!=term.
19eb0 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72  n || memcmp(pTer
19ec0 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d  m, term.p, nTerm
19ed0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
19ee0 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e  nRem && writer.n
19ef0 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d  LeafWritten>nRem
19f00 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
19f10 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65  ChunkIterRelease
19f20 28 26 73 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  (&sPos);.       
19f30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
19f40 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
19f50 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70  s a new term. Ap
19f60 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74  pend a term to t
19f70 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
19f80 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
19f90 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54  bRequireDoclistT
19fa0 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66  erm ){.        f
19fb0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65  ts5WriteAppendZe
19fc0 72 6f 62 79 74 65 28 70 2c 20 26 77 72 69 74 65  robyte(p, &write
19fd0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
19fe0 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
19ff0 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72  dTerm(p, &writer
1a000 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
1a010 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1a020 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65  rSet(&p->rc, &te
1a030 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
1a040 29 3b 0a 20 20 20 20 20 20 62 52 65 71 75 69 72  );.      bRequir
1a050 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 31  eDoclistTerm = 1
1a060 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1a070 41 70 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64  Append the rowid
1a080 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a   to the output *
1a090 2f 0a 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f  /.    /* WRITEPO
1a0a0 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
1a0b0 20 6e 50 6f 73 20 3d 20 70 53 65 67 2d 3e 6e 50   nPos = pSeg->nP
1a0c0 6f 73 2a 32 20 2b 20 70 53 65 67 2d 3e 62 44 65  os*2 + pSeg->bDe
1a0d0 6c 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  l;.    fts5Write
1a0e0 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26  AppendRowid(p, &
1a0f0 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74  writer, fts5Mult
1a100 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
1a110 29 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 66  ), nPos);..    f
1a120 6f 72 28 2f 2a 20 6e 6f 6f 70 20 2a 2f 3b 20 21  or(/* noop */; !
1a130 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
1a140 28 70 2c 20 26 73 50 6f 73 29 3b 20 66 74 73 35  (p, &sPos); fts5
1a150 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c  ChunkIterNext(p,
1a160 20 26 73 50 6f 73 29 29 7b 0a 20 20 20 20 20 20   &sPos)){.      
1a170 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50  fts5WriteAppendP
1a180 6f 73 6c 69 73 74 44 61 74 61 28 70 2c 20 26 77  oslistData(p, &w
1a190 72 69 74 65 72 2c 20 73 50 6f 73 2e 70 2c 20 73  riter, sPos.p, s
1a1a0 50 6f 73 2e 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pos.n);.    }.. 
1a1b0 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1a1c0 52 65 6c 65 61 73 65 28 26 73 50 6f 73 29 3b 0a  Release(&sPos);.
1a1d0 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20    }..  /* Flush 
1a1e0 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61  the last leaf pa
1a1f0 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20  ge to disk. Set 
1a200 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
1a210 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67 68 74  nt b-tree height
1a220 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c  .  ** and last l
1a230 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1a240 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
1a250 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74  .  */.  fts5Writ
1a260 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74  eFinish(p, &writ
1a270 65 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65 69 67  er, &pSeg->nHeig
1a280 68 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c  ht, &pSeg->pgnoL
1a290 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73  ast);..  if( fts
1a2a0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
1a2b0 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69   pIter) ){.    i
1a2c0 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  nt i;..    /* Re
1a2d0 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
1a2e0 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nt segments from
1a2f0 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
1a300 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
1a310 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29  ; i<nInput; i++)
1a320 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
1a330 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c  RemoveSegment(p,
1a340 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69   pLvl->aSeg[i].i
1a350 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  Segid);.    }.. 
1a360 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
1a370 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65   redundant segme
1a380 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  nts from the inp
1a390 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
1a3a0 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d  if( pLvl->nSeg!=
1a3b0 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20  nInput ){.      
1a3c0 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76  int nMove = (pLv
1a3d0 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74  l->nSeg - nInput
1a3e0 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  ) * sizeof(Fts5S
1a3f0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
1a400 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;.      memmove(
1a410 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76  pLvl->aSeg, &pLv
1a420 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c  l->aSeg[nInput],
1a430 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20   nMove);.    }. 
1a440 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1a450 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a  ment -= nInput;.
1a460 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d      pLvl->nSeg -
1a470 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c  = nInput;.    pL
1a480 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a  vl->nMerge = 0;.
1a490 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67      if( pSeg->pg
1a4a0 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20  noLast==0 ){.   
1a4b0 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
1a4c0 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  --;.      pStruc
1a4d0 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20  t->nSegment--;. 
1a4e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1a4f0 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e    assert( pSeg->
1a500 6e 48 65 69 67 68 74 3e 30 20 26 26 20 70 53 65  nHeight>0 && pSe
1a510 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b  g->pgnoLast>0 );
1a520 0a 20 20 20 20 66 74 73 35 54 72 69 6d 53 65 67  .    fts5TrimSeg
1a530 6d 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b  ments(p, pIter);
1a540 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  .    pLvl->nMerg
1a550 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a  e = nInput;.  }.
1a560 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
1a570 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Free(p, pIter);.
1a580 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1a590 28 26 74 65 72 6d 29 3b 0a 20 20 69 66 28 20 70  (&term);.  if( p
1a5a0 6e 52 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d  nRem ) *pnRem -=
1a5b0 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69   writer.nLeafWri
1a5c0 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  tten;.}../*.** D
1a5d0 6f 20 75 70 20 74 6f 20 6e 50 67 20 70 61 67 65  o up to nPg page
1a5e0 73 20 6f 66 20 61 75 74 6f 6d 65 72 67 65 20 77  s of automerge w
1a5f0 6f 72 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  ork on the index
1a600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a610 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28   fts5IndexMerge(
1a620 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1a650 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
1a660 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1a670 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
1a680 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
1a690 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
1a6a0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  ndex */.  int nP
1a6b0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
1a6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1a6d0 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f  es of work to do
1a6e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65   */.){.  int nRe
1a6f0 6d 20 3d 20 6e 50 67 3b 0a 20 20 46 74 73 35 53  m = nPg;.  Fts5S
1a700 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1a710 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1a720 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26   while( nRem>0 &
1a730 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
1a740 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  OK ){.    int iL
1a750 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
1a760 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
1a770 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
1a780 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  ls */.    int iB
1a790 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20  estLvl = 0;     
1a7a0 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
1a7b0 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74  ffering the most
1a7c0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1a7d0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74  */.    int nBest
1a7e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1a7f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a800 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
1a810 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
1a820 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73  .    /* Set iBes
1a830 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65  tLvl to the leve
1a840 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
1a850 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a  segments from. *
1a860 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  /.    assert( pS
1a870 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
1a880 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  );.    for(iLvl=
1a890 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
1a8a0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
1a8b0 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
1a8c0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1a8d0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1a8e0 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
1a8f0 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
1a900 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
1a910 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42   pLvl->nMerge>nB
1a920 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
1a930 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
1a940 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73  ;.          nBes
1a950 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
1a960 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a970 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a980 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76   }.      if( pLv
1a990 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b  l->nSeg>nBest ){
1a9a0 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d  .        nBest =
1a9b0 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20   pLvl->nSeg;.   
1a9c0 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
1a9d0 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iLvl;.      }.  
1a9e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1a9f0 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c  Best is still 0,
1aa00 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
1aa10 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a  must be empty. *
1aa20 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1aa30 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c  DEBUG.    for(iL
1aa40 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26  vl=0; nBest==0 &
1aa50 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  & iLvl<pStruct->
1aa60 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
1aa70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1aa80 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1aa90 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a  Lvl].nSeg==0 );.
1aaa0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1aab0 20 20 69 66 28 20 6e 42 65 73 74 3c 70 2d 3e 70    if( nBest<p->p
1aac0 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
1aad0 67 65 20 0a 20 20 20 20 20 20 20 20 26 26 20 70  ge .        && p
1aae0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1aaf0 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
1ab00 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =0 .      ){.   
1ab10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ab20 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
1ab30 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72  geLevel(p, &pStr
1ab40 75 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26  uct, iBestLvl, &
1ab50 6e 52 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  nRem);.    if( p
1ab60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ab70 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
1ab80 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65  el[iBestLvl].nMe
1ab90 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rge==0 ){.      
1aba0 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1abb0 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c  mote(p, iBestLvl
1abc0 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  +1, pStruct);.  
1abd0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72    }.  }.  *ppStr
1abe0 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d  uct = pStruct;.}
1abf0 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ../*.** A total 
1ac00 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61  of nLeaf leaf pa
1ac10 67 65 73 20 6f 66 20 64 61 74 61 20 68 61 73 20  ges of data has 
1ac20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65  just been flushe
1ac30 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a  d to a level-0.*
1ac40 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20  * segment. This 
1ac50 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
1ac60 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74   the write-count
1ac70 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  er accordingly a
1ac80 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73  nd, if.** necess
1ac90 61 72 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e  ary, performs in
1aca0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
1acb0 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  work..**.** If a
1acc0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1acd0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
1ace0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
1acf0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
1ad00 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
1ad10 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
1ad20 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1ad30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ad40 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72  fts5IndexAutomer
1ad50 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
1ad60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1ad70 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1ad80 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1ad90 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1ada0 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
1adb0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
1adc0 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
1add0 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
1ade0 20 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   nLeaf          
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae00 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
1ae10 20 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69   leaves just wri
1ae20 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tten */.){.  if(
1ae30 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ae40 4b 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  K && p->pConfig-
1ae50 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b  >nAutomerge>0 ){
1ae60 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1ae70 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
1ae80 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 36 34  pStruct;.    i64
1ae90 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
1aea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1aeb0 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77  itial value of w
1aec0 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  rite-counter */.
1aed0 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20      int nWork;  
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
1af00 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65  ork-quanta to pe
1af10 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  rform */.    int
1af20 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
1af30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1af40 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
1af50 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
1af60 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   */..    /* Upda
1af70 74 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75  te the write-cou
1af80 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e  nter. While doin
1af90 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e  g so, set nWork.
1afa0 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d   */.    nWrite =
1afb0 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
1afc0 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f  Counter;.    nWo
1afd0 72 6b 20 3d 20 28 28 6e 57 72 69 74 65 20 2b 20  rk = ((nWrite + 
1afe0 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72  nLeaf) / p->nWor
1aff0 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74 65  kUnit) - (nWrite
1b000 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
1b010 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  ;.    pStruct->n
1b020 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20  WriteCounter += 
1b030 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20  nLeaf;.    nRem 
1b040 3d 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a  = p->nWorkUnit *
1b050 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74   nWork * pStruct
1b060 2d 3e 6e 4c 65 76 65 6c 3b 0a 0a 20 20 20 20 66  ->nLevel;..    f
1b070 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c  ts5IndexMerge(p,
1b080 20 70 70 53 74 72 75 63 74 2c 20 6e 52 65 6d 29   ppStruct, nRem)
1b090 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1b0a0 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43 72  void fts5IndexCr
1b0b0 69 73 69 73 6d 65 72 67 65 28 0a 20 20 46 74 73  isismerge(.  Fts
1b0c0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b0e0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1b0f0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
1b100 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1b110 74 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t        /* IN/O
1b120 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
1b130 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
1b140 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  /.){.  const int
1b150 20 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e 70 43   nCrisis = p->pC
1b160 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65  onfig->nCrisisMe
1b170 72 67 65 3b 0a 20 20 46 74 73 35 53 74 72 75 63  rge;.  Fts5Struc
1b180 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
1b190 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74  *ppStruct;.  int
1b1a0 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61 73   iLvl = 0;..  as
1b1b0 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
1b1c0 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63  ITE_OK || pStruc
1b1d0 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20  t->nLevel>0 );. 
1b1e0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1b1f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72  QLITE_OK && pStr
1b200 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1b210 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73 20  ].nSeg>=nCrisis 
1b220 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
1b230 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70  MergeLevel(p, &p
1b240 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29  Struct, iLvl, 0)
1b250 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
1b260 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c  urePromote(p, iL
1b270 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a  vl+1, pStruct);.
1b280 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a      iLvl++;.  }.
1b290 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
1b2a0 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
1b2b0 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65   int fts5IndexRe
1b2c0 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a  turn(Fts5Index *
1b2d0 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  p){.  int rc = p
1b2e0 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ->rc;.  p->rc = 
1b2f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74  SQLITE_OK;.  ret
1b300 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64  urn rc;.}..typed
1b310 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c  ef struct Fts5Fl
1b320 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68  ushCtx Fts5Flush
1b330 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35  Ctx;.struct Fts5
1b340 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73  FlushCtx {.  Fts
1b350 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20  5Index *pIdx;.  
1b360 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
1b370 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  iter; .};../*.**
1b380 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63   Buffer aBuf[] c
1b390 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f  ontains a list o
1b3a0 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73  f varints, all s
1b3b0 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66  mall enough to f
1b3c0 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69  it.** in a 32-bi
1b3d0 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72  t integer. Retur
1b3e0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1b3f0 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69 78  e largest prefix
1b400 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73   of this .** lis
1b410 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20  t nMax bytes or 
1b420 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  less in size..*/
1b430 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1b440 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f  PoslistPrefix(co
1b450 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e  nst u8 *aBuf, in
1b460 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72  t nMax){.  int r
1b470 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b  et;.  u32 dummy;
1b480 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65 74  .  ret = fts5Get
1b490 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64  Varint32(aBuf, d
1b4a0 75 6d 6d 79 29 3b 0a 20 20 77 68 69 6c 65 28 20  ummy);.  while( 
1b4b0 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  1 ){.    int i =
1b4c0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
1b4d0 28 26 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d  (&aBuf[ret], dum
1b4e0 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 28 72 65  my);.    if( (re
1b4f0 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20  t + i) > nMax ) 
1b500 62 72 65 61 6b 3b 0a 20 20 20 20 72 65 74 20 2b  break;.    ret +
1b510 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
1b520 6e 20 72 65 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e  n ret;.}..#defin
1b530 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65  e fts5BufferSafe
1b540 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
1b550 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b   pBlob, nBlob) {
1b560 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 42 75   \.  assert( pBu
1b570 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66  f->nSpace>=(pBuf
1b580 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20  ->n+nBlob) );   
1b590 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d 65            \.  me
1b5a0 6d 63 70 79 28 26 70 42 75 66 2d 3e 70 5b 70 42  mcpy(&pBuf->p[pB
1b5b0 75 66 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e  uf->n], pBlob, n
1b5c0 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20 20  Blob);          
1b5d0 20 20 20 5c 0a 20 20 70 42 75 66 2d 3e 6e 20 2b     \.  pBuf->n +
1b5e0 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20  = nBlob;        
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
1b610 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65  ./*.** Flush the
1b620 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d   contents of in-
1b630 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1b640 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77  e iHash to a new
1b650 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67   level-0 .** seg
1b660 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c  ment on disk. Al
1b670 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f  so update the co
1b680 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75  rresponding stru
1b690 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a  cture record..**
1b6a0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1b6b0 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
1b6c0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
1b6d0 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
1b6e0 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
1b6f0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
1b700 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1b710 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1b720 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73  ic void fts5Flus
1b730 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64  hOneHash(Fts5Ind
1b740 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61  ex *p){.  Fts5Ha
1b750 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70  sh *pHash = p->p
1b760 48 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75  Hash;.  Fts5Stru
1b770 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
1b780 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
1b790 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
1b7a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b7b0 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70    /* Last leaf p
1b7c0 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
1b7d0 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  gment */..  /* O
1b7e0 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
1b7f0 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73  e to the index s
1b800 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
1b810 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d  ocate a new segm
1b820 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20  ent-id.  ** for 
1b830 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20  the new level-0 
1b840 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70  segment.  */.  p
1b850 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1b860 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
1b870 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c   iSegid = fts5Al
1b880 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70  locateSegid(p, p
1b890 53 74 72 75 63 74 29 3b 0a 0a 20 20 69 66 28 20  Struct);..  if( 
1b8a0 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f  iSegid ){.    co
1b8b0 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  nst int pgsz = p
1b8c0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b  ->pConfig->pgsz;
1b8d0 0a 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  ..    Fts5Struct
1b8e0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
1b8f0 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65  ;   /* New segme
1b900 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72 75 63  nt within pStruc
1b910 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 48 65  t */.    int nHe
1b920 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
1b930 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74         /* Height
1b940 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20   of new segment 
1b950 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 46 74  b-tree */.    Ft
1b960 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
1b970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1b980 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
1b990 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20  o assemble leaf 
1b9a0 70 61 67 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  page */.    cons
1b9b0 74 20 75 38 20 2a 7a 50 72 65 76 20 3d 20 30 3b  t u8 *zPrev = 0;
1b9c0 0a 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69  ..    Fts5SegWri
1b9d0 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20  ter writer;.    
1b9e0 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c  fts5WriteInit(p,
1b9f0 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64   &writer, iSegid
1ba00 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 2d 61  );..    /* Pre-a
1ba10 6c 6c 6f 63 61 74 65 20 74 68 65 20 62 75 66 66  llocate the buff
1ba20 65 72 20 75 73 65 64 20 74 6f 20 61 73 73 65 6d  er used to assem
1ba30 62 6c 65 20 6c 65 61 66 20 70 61 67 65 73 20 74  ble leaf pages t
1ba40 6f 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20  o the target.   
1ba50 20 2a 2a 20 70 61 67 65 20 73 69 7a 65 2e 20 20   ** page size.  
1ba60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1ba70 67 73 7a 3e 30 20 29 3b 0a 20 20 20 20 70 42 75  gsz>0 );.    pBu
1ba80 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72 69  f = &writer.aWri
1ba90 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20  ter[0].buf;.    
1baa0 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
1bab0 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 67 73  p->rc, pBuf, pgs
1bac0 7a 20 2b 20 32 30 29 3b 0a 0a 20 20 20 20 2f 2a  z + 20);..    /*
1bad0 20 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20   Begin scanning 
1bae0 74 68 72 6f 75 67 68 20 68 61 73 68 20 74 61 62  through hash tab
1baf0 6c 65 20 65 6e 74 72 69 65 73 2e 20 2a 2f 0a 20  le entries. */. 
1bb00 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1bb10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bb20 20 6d 65 6d 73 65 74 28 70 42 75 66 2d 3e 70 2c   memset(pBuf->p,
1bb30 20 30 2c 20 34 29 3b 0a 20 20 20 20 20 20 70 42   0, 4);.      pB
1bb40 75 66 2d 3e 6e 20 3d 20 34 3b 0a 20 20 20 20 20  uf->n = 4;.     
1bb50 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1bb60 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74  Fts5HashScanInit
1bb70 28 70 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20  (pHash, 0, 0);. 
1bb80 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28     }..    while(
1bb90 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1bba0 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46  K && 0==sqlite3F
1bbb0 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70  ts5HashScanEof(p
1bbc0 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63  Hash) ){.      c
1bbd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
1bbe0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  ;.      int nTer
1bbf0 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  m;.      const u
1bc00 38 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20  8 *pDoclist;.   
1bc10 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b     int nDoclist;
1bc20 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 75 66 66  .      int nSuff
1bc30 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
1bc40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
1bc50 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20  rm suffix */..  
1bc60 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
1bc70 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61  ashScanEntry(pHa
1bc80 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f  sh, &zTerm, &pDo
1bc90 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74  clist, &nDoclist
1bca0 29 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 3d  );.      nTerm =
1bcb0 20 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 3b 0a   strlen(zTerm);.
1bcc0 0a 20 20 20 20 20 20 2f 2a 20 44 65 63 69 64 65  .      /* Decide
1bcd0 20 69 66 20 74 68 65 20 74 65 72 6d 20 77 69 6c   if the term wil
1bce0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72  l fit on the cur
1bcf0 72 65 6e 74 20 6c 65 61 66 2e 20 49 66 20 69 74  rent leaf. If it
1bd00 20 77 69 6c 6c 20 6e 6f 74 2c 20 0a 20 20 20 20   will not, .    
1bd10 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 6c    ** flush the l
1bd20 65 61 66 20 74 6f 20 64 69 73 6b 20 68 65 72 65  eaf to disk here
1bd30 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
1bd40 28 70 42 75 66 2d 3e 6e 20 2b 20 6e 54 65 72 6d  (pBuf->n + nTerm
1bd50 20 2b 20 32 29 20 3e 20 70 67 73 7a 20 29 7b 0a   + 2) > pgsz ){.
1bd60 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
1bd70 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77  eFlushLeaf(p, &w
1bd80 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
1bd90 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61  pBuf = &writer.a
1bda0 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20  Writer[0].buf;. 
1bdb0 20 20 20 20 20 20 20 69 66 28 20 28 6e 54 65 72         if( (nTer
1bdc0 6d 20 2b 20 33 32 29 20 3e 20 70 42 75 66 2d 3e  m + 32) > pBuf->
1bdd0 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  nSpace ){.      
1bde0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1bdf0 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ow(&p->rc, pBuf,
1be00 20 6e 54 65 72 6d 20 2b 20 33 32 20 2d 20 70 42   nTerm + 32 - pB
1be10 75 66 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  uf->n);.        
1be20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
1be30 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1be40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1be50 20 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20   Write the term 
1be60 74 6f 20 74 68 65 20 6c 65 61 66 2e 20 41 6e 64  to the leaf. And
1be70 20 70 75 73 68 20 69 74 20 75 70 20 69 6e 74 6f   push it up into
1be80 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
1be90 61 72 63 68 79 20 2a 2f 0a 20 20 20 20 20 20 69  archy */.      i
1bea0 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
1beb0 54 65 72 6d 49 6e 50 61 67 65 3d 3d 30 20 29 7b  TermInPage==0 ){
1bec0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 72  .        int nPr
1bed0 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  e = fts5PrefixCo
1bee0 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c 20 7a 50  mpress(nTerm, zP
1bef0 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e  rev, nTerm, (con
1bf00 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20  st u8*)zTerm);. 
1bf10 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
1bf20 3d 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69  = sqlite3PutVari
1bf30 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
1bf40 2d 3e 6e 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20  ->n], nPre);.   
1bf50 20 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e       nSuffix = n
1bf60 54 65 72 6d 20 2d 20 6e 50 72 65 3b 0a 20 20 20  Term - nPre;.   
1bf70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bf80 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42    fts5PutU16(&pB
1bf90 75 66 2d 3e 70 5b 32 5d 2c 20 70 42 75 66 2d 3e  uf->p[2], pBuf->
1bfa0 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74  n);.        writ
1bfb0 65 72 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  er.bFirstTermInP
1bfc0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
1bfd0 20 69 66 28 20 77 72 69 74 65 72 2e 61 57 72 69   if( writer.aWri
1bfe0 74 65 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29  ter[0].pgno!=1 )
1bff0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1c000 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65 66 69  nPre = fts5Prefi
1c010 78 43 6f 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c  xCompress(nTerm,
1c020 20 7a 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28   zPrev, nTerm, (
1c030 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29  const u8*)zTerm)
1c040 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1c050 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 70  WriteBtreeTerm(p
1c060 2c 20 26 77 72 69 74 65 72 2c 20 6e 50 72 65 2b  , &writer, nPre+
1c070 31 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54  1, (const u8*)zT
1c080 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  erm);.          
1c090 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61  pBuf = &writer.a
1c0a0 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20  Writer[0].buf;. 
1c0b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1c0c0 20 6e 50 72 65 3c 6e 54 65 72 6d 20 29 3b 0a 20   nPre<nTerm );. 
1c0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c0e0 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
1c0f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c100 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1c110 65 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  e3PutVarint(&pBu
1c120 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e  f->p[pBuf->n], n
1c130 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 66  Suffix);.      f
1c140 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1c150 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 28 63  endBlob(pBuf, (c
1c160 6f 6e 73 74 20 75 38 2a 29 26 7a 54 65 72 6d 5b  onst u8*)&zTerm[
1c170 6e 54 65 72 6d 2d 6e 53 75 66 66 69 78 5d 2c 20  nTerm-nSuffix], 
1c180 6e 53 75 66 66 69 78 29 3b 0a 0a 20 20 20 20 20  nSuffix);..     
1c190 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66   if( pgsz>=(pBuf
1c1a0 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b  ->n + nDoclist +
1c1b0 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   1) ){.        /
1c1c0 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63  * The entire doc
1c1d0 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  list will fit on
1c1e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1c1f0 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  f. */.        ft
1c200 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1c210 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f  ndBlob(pBuf, pDo
1c220 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29  clist, nDoclist)
1c230 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c240 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69         i64 iRowi
1c250 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  d = 0;.        i
1c260 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20  64 iDelta = 0;. 
1c270 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20         int iOff 
1c280 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 77 72  = 0;..        wr
1c290 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
1c2a0 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  InPage = 0;..   
1c2b0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
1c2c0 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20  re doclist will 
1c2d0 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20  not fit on this 
1c2e0 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  leaf. The follow
1c2f0 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
1c300 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74 68  loop iterates th
1c310 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73  rough the poslis
1c320 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
1c330 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20  the current .   
1c340 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e       ** doclist.
1c350 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69    */.        whi
1c360 6c 65 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73  le( iOff<nDoclis
1c370 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
1c380 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  nt nPos;.       
1c390 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20 20     int nCopy;.  
1c3a0 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d          int bDum
1c3b0 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  my;.          iO
1c3c0 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  ff += getVarint(
1c3d0 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
1c3e0 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
1c3f0 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79  .          nCopy
1c400 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73   = fts5GetPoslis
1c410 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b  tSize(&pDoclist[
1c420 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
1c430 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  Dummy);.        
1c440 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b    nCopy += nPos;
1c450 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69  .          iRowi
1c460 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
1c470 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
1c480 20 20 69 66 28 20 77 72 69 74 65 72 2e 62 46 69    if( writer.bFi
1c490 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
1c4a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
1c4b0 73 35 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e  s5PutU16(&pBuf->
1c4c0 70 5b 30 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 20  p[0], pBuf->n); 
1c4d0 20 20 2f 2a 20 66 69 72 73 74 20 64 6f 63 69 64    /* first docid
1c4e0 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   on page */.    
1c4f0 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
1c500 2b 3d 20 73 71 6c 69 74 65 33 50 75 74 56 61 72  += sqlite3PutVar
1c510 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75  int(&pBuf->p[pBu
1c520 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a  f->n], iRowid);.
1c530 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
1c540 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
1c550 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
1c560 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44        fts5WriteD
1c570 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 26 77  lidxAppend(p, &w
1c580 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a  riter, iRowid);.
1c590 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1c5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75  .            pBu
1c5b0 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 50  f->n += sqlite3P
1c5c0 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  utVarint(&pBuf->
1c5d0 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c  p[pBuf->n], iDel
1c5e0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ta);.          }
1c5f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1c600 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66  t( pBuf->n<=pBuf
1c610 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20 20  ->nSpace );..   
1c620 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66         if( (pBuf
1c630 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20  ->n + nCopy) <= 
1c640 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
1c650 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
1c660 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66  e poslist will f
1c670 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  it on the curren
1c680 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a  t leaf. So copy.
1c690 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
1c6a0 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a  t in one go. */.
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1c6c0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1c6d0 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63  Blob(pBuf, &pDoc
1c6e0 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70  list[iOff], nCop
1c6f0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  y);.          }e
1c700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1c710 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
1c720 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20  oslist will not 
1c730 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66  fit on this leaf
1c740 2e 20 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20  . So it needs.  
1c750 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
1c760 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73  be broken into s
1c770 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ections. The onl
1c780 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20  y qualification 
1c790 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  being.          
1c7a0 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20 76    ** that each v
1c7b0 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73 74  arint must be st
1c7c0 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c  ored contiguousl
1c7d0 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  y.  */.         
1c7e0 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f     const u8 *pPo
1c7f0 73 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73  slist = &pDoclis
1c800 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20  t[iOff];.       
1c810 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20       int iPos = 
1c820 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  0;.            w
1c830 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
1c840 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70           int nSp
1c850 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75  ace = pgsz - pBu
1c860 66 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  f->n;.          
1c870 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1c890 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c   (nCopy - iPos)<
1c8a0 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  =nSpace ){.     
1c8b0 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e             n = n
1c8c0 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20  Copy - iPos;.   
1c8d0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1c8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c8f0 20 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73    n = fts5Poslis
1c900 74 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73  tPrefix(&pPoslis
1c910 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29  t[iPos], nSpace)
1c920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1c930 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1c940 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20  assert( n>0 );. 
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
1c960 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1c970 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f  dBlob(pBuf, &pPo
1c980 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b  slist[iPos], n);
1c990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1c9a0 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  Pos += n;.      
1c9b0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 75 66          if( pBuf
1c9c0 2d 3e 6e 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20  ->n>=pgsz ){.   
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
1c9e0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1c9f0 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75               pBu
1ca10 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72 69  f = &writer.aWri
1ca20 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20  ter[0].buf;.    
1ca30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ca40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
1ca50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61  os>=nCopy ) brea
1ca60 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
1ca70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ca80 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
1ca90 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Copy;.        }.
1caa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
1cab0 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
1cac0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
1cad0 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c  assert( pBuf->n<
1cae0 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b  =pBuf->nSpace );
1caf0 0a 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 28  .      zPrev = (
1cb00 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 3b  const u8*)zTerm;
1cb10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1cb20 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
1cb30 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Hash);.    }.   
1cb40 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1cb50 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
1cb60 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
1cb70 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 6e  h(p, &writer, &n
1cb80 48 65 69 67 68 74 2c 20 26 70 67 6e 6f 4c 61 73  Height, &pgnoLas
1cb90 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  t);..    /* Upda
1cba0 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75 63  te the Fts5Struc
1cbb0 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69 74  ture. It is writ
1cbc0 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
1cbd0 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 0a  database by the.
1cbe0 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63      ** fts5Struc
1cbf0 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63 61  tureRelease() ca
1cc00 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ll below.  */.  
1cc10 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e    if( pStruct->n
1cc20 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Level==0 ){.    
1cc30 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41    fts5StructureA
1cc40 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ddLevel(&p->rc, 
1cc50 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d  &pStruct);.    }
1cc60 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1cc70 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
1cc80 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30  ->rc, pStruct, 0
1cc90 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
1cca0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ccb0 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20  K ){.      pSeg 
1ccc0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1ccd0 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72  el[0].aSeg[ pStr
1cce0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e  uct->aLevel[0].n
1ccf0 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70  Seg++ ];.      p
1cd00 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
1cd10 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67  egid;.      pSeg
1cd20 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
1cd30 67 68 74 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  ght;.      pSeg-
1cd40 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a  >pgnoFirst = 1;.
1cd50 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
1cd60 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b  Last = pgnoLast;
1cd70 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
1cd80 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20  nSegment++;.    
1cd90 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
1cda0 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c  urePromote(p, 0,
1cdb0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a   pStruct);.  }..
1cdc0 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f  .  fts5IndexAuto
1cdd0 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
1cde0 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  t, pgnoLast);.  
1cdf0 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d  fts5IndexCrisism
1ce00 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
1ce10 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
1ce20 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75  reWrite(p, pStru
1ce30 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ct);.  fts5Struc
1ce40 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1ce50 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  uct);.}../*.** F
1ce60 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74  lush any data st
1ce70 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
1ce80 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
1ce90 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1cea0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1ceb0 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68  d fts5IndexFlush
1cec0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1ced0 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20 69    /* Unless it i
1cee0 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20 74  s empty, flush t
1cef0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  he hash table to
1cf00 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70   disk */.  if( p
1cf10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1cf20 26 26 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  && p->nPendingDa
1cf30 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ta ){.    assert
1cf40 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20  ( p->pHash );.  
1cf50 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
1cf60 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 46  a = 0;.    fts5F
1cf70 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a  lushOneHash(p);.
1cf80 20 20 7d 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69    }.}...int sqli
1cf90 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69  te3Fts5IndexOpti
1cfa0 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a  mize(Fts5Index *
1cfb0 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
1cfc0 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
1cfd0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1cfe0 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  New = 0;.  int n
1cff0 53 65 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Seg = 0;..  asse
1d000 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
1d010 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e  E_OK );.  fts5In
1d020 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 70  dexFlush(p);.  p
1d030 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1d040 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
1d050 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
1d060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1d070 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  ruct->nSegment==
1d080 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
1d090 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75  ntSegments(pStru
1d0a0 63 74 29 20 29 3b 0a 20 20 20 20 6e 53 65 67 20  ct) );.    nSeg 
1d0b0 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  = pStruct->nSegm
1d0c0 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  ent;.    if( nSe
1d0d0 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>1 ){.      int
1d0e0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
1d0f0 46 74 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a  Fts5Structure);.
1d100 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 28        nByte += (
1d110 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
1d120 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  1) * sizeof(Fts5
1d130 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 3b  StructureLevel);
1d140 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 46  .      pNew = (F
1d150 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71  ts5Structure*)sq
1d160 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
1d170 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74  ero(&p->rc, nByt
1d180 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
1d190 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1d1a0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
1d1b0 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 69 6e  el *pLvl;.    in
1d1c0 74 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a  t nByte = nSeg *
1d1d0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1d1e0 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
1d1f0 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20     pNew->nLevel 
1d200 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  = pStruct->nLeve
1d210 6c 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  l+1;.    pNew->n
1d220 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d 20 70  WriteCounter = p
1d230 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
1d240 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76 6c 20  unter;.    pLvl 
1d250 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b  = &pNew->aLevel[
1d260 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d  pStruct->nLevel]
1d270 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67  ;.    pLvl->aSeg
1d280 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
1d290 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65  eSegment*)sqlite
1d2a0 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
1d2b0 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
1d2c0 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53      if( pLvl->aS
1d2d0 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  eg ){.      int 
1d2e0 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
1d2f0 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20 3d 20    int iSegOut = 
1d300 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76  0;.      for(iLv
1d310 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
1d320 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
1d330 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +){.        for(
1d340 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74  iSeg=0; iSeg<pSt
1d350 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1d360 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l].nSeg; iSeg++)
1d370 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c  {.          pLvl
1d380 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d 20  ->aSeg[iSegOut] 
1d390 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
1d3a0 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
1d3b0 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53  g];.          iS
1d3c0 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20  egOut++;.       
1d3d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1d3e0 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 20   pNew->nSegment 
1d3f0 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e  = pLvl->nSeg = n
1d400 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Seg;.    }else{.
1d410 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1d420 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
1d430 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pNew = 0;.    }.
1d440 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 20    }..  if( pNew 
1d450 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 20  ){.    int iLvl 
1d460 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31  = pNew->nLevel-1
1d470 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  ;.    while( p->
1d480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d490 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c   pNew->aLevel[iL
1d4a0 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20  vl].nSeg>0 ){.  
1d4b0 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46      int nRem = F
1d4c0 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49  TS5_OPT_WORK_UNI
1d4d0 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64  T;.      fts5Ind
1d4e0 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
1d4f0 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52  &pNew, iLvl, &nR
1d500 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  em);.    }..    
1d510 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
1d520 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  te(p, pNew);.   
1d530 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1d540 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d  lease(pNew);.  }
1d550 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ..  fts5Structur
1d560 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1d570 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
1d580 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20  IndexReturn(p); 
1d590 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
1d5a0 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74  ts5IndexMerge(Ft
1d5b0 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
1d5c0 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74 73 35 53  nMerge){.  Fts5S
1d5d0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1d5e0 74 3b 0a 0a 20 20 70 53 74 72 75 63 74 20 3d 20  t;..  pStruct = 
1d5f0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
1d600 64 28 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  d(p);.  fts5Inde
1d610 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  xMerge(p, &pStru
1d620 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20 20 66  ct, nMerge);.  f
1d630 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
1d640 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  e(p, pStruct);. 
1d650 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1d660 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
1d670 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
1d680 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
1d690 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
1d6a0 20 70 4d 75 6c 74 69 20 63 75 72 72 65 6e 74 6c   pMulti currentl
1d6b0 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61  y points to a va
1d6c0 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45  lid entry (not E
1d6d0 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  OF). This.** fun
1d6e0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
1d6f0 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69  copy of the posi
1d700 74 69 6f 6e 2d 6c 69 73 74 20 6f 66 20 74 68 65  tion-list of the
1d710 20 65 6e 74 72 79 20 70 4d 75 6c 74 69 20 0a 2a   entry pMulti .*
1d720 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  * currently poin
1d730 74 73 20 74 6f 20 74 6f 20 62 75 66 66 65 72 20  ts to to buffer 
1d740 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  pBuf..**.** If a
1d750 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1d760 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1d770 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20   left in p->rc. 
1d780 49 74 20 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a  It is assumed.**
1d790 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 61 6c   no error has al
1d7a0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
1d7b0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1d7c0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
1d7d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1d7e0 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74  MultiIterPoslist
1d7f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1d800 2c 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67  ,.  Fts5MultiSeg
1d810 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20  Iter *pMulti,.  
1d820 69 6e 74 20 62 53 7a 2c 0a 20 20 46 74 73 35 42  int bSz,.  Fts5B
1d830 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
1d840 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1d850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
1d860 35 43 68 75 6e 6b 49 74 65 72 20 69 74 65 72 3b  5ChunkIter iter;
1d870 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
1d880 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74 69   *pSeg = &pMulti
1d890 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e  ->aSeg[ pMulti->
1d8a0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1d8b0 20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ];.    assert( 
1d8c0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1d8d0 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29  (p, pMulti)==0 )
1d8e0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74  ;.    static int
1d8f0 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   nCall = 0;.    
1d900 6e 43 61 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 66 74  nCall++;..    ft
1d910 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74 28  s5ChunkIterInit(
1d920 70 2c 20 70 53 65 67 2c 20 26 69 74 65 72 29 3b  p, pSeg, &iter);
1d930 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35 43 68  ..    if( fts5Ch
1d940 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 69  unkIterEof(p, &i
1d950 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ter)==0 ){.     
1d960 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20 20 20   if( bSz ){.    
1d970 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
1d980 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20  ISTSIZE */.     
1d990 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1d9a0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d9b0 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e 52 65  , pBuf, iter.nRe
1d9c0 6d 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 7d 0a  m * 2);.      }.
1d9d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73        while( fts
1d9e0 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c  5ChunkIterEof(p,
1d9f0 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20   &iter)==0 ){.  
1da00 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1da10 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1da20 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e 2c  c, pBuf, iter.n,
1da30 20 69 74 65 72 2e 70 29 3b 0a 20 20 20 20 20 20   iter.p);.      
1da40 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e    fts5ChunkIterN
1da50 65 78 74 28 70 2c 20 26 69 74 65 72 29 3b 0a 20  ext(p, &iter);. 
1da60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1da70 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65   fts5ChunkIterRe
1da80 6c 65 61 73 65 28 26 69 74 65 72 29 3b 0a 20 20  lease(&iter);.  
1da90 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1daa0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
1dab0 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73 74  Next(Fts5Doclist
1dac0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1dad0 69 66 28 20 70 49 74 65 72 2d 3e 69 3c 70 49 74  if( pIter->i<pIt
1dae0 65 72 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 6e 74  er->n ){.    int
1daf0 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69 66 28   bDummy;.    if(
1db00 20 70 49 74 65 72 2d 3e 69 20 29 7b 0a 20 20 20   pIter->i ){.   
1db10 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
1db20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d       pIter->i +=
1db30 20 67 65 74 56 61 72 69 6e 74 28 26 70 49 74 65   getVarint(&pIte
1db40 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20  r->a[pIter->i], 
1db50 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
1db60 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1db70 3e 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20  >bDesc ){.      
1db80 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
1db90 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  -= iDelta;.     
1dba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dbb0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
1dbc0 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d   iDelta;.      }
1dbd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1dbe0 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65    pIter->i += ge
1dbf0 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e  tVarint(&pIter->
1dc00 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36  a[pIter->i], (u6
1dc10 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
1dc20 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  d);.    }.    pI
1dc30 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73 35 47 65  ter->i += fts5Ge
1dc40 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 0a 20 20  tPoslistSize(.  
1dc50 20 20 20 20 20 20 26 70 49 74 65 72 2d 3e 61 5b        &pIter->a[
1dc60 70 49 74 65 72 2d 3e 69 5d 2c 20 26 70 49 74 65  pIter->i], &pIte
1dc70 72 2d 3e 6e 50 6f 73 6c 69 73 74 2c 20 26 62 44  r->nPoslist, &bD
1dc80 75 6d 6d 79 0a 20 20 20 20 29 3b 0a 20 20 20 20  ummy.    );.    
1dc90 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
1dca0 3d 20 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  = &pIter->a[pIte
1dcb0 72 2d 3e 69 5d 3b 0a 20 20 20 20 70 49 74 65 72  r->i];.    pIter
1dcc0 2d 3e 69 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50  ->i += pIter->nP
1dcd0 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  oslist;.  }else{
1dce0 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73  .    pIter->aPos
1dcf0 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  list = 0;.  }.}.
1dd00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1dd10 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
1dd20 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
1dd30 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 62 44 65  pBuf, .  int bDe
1dd40 73 63 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c 69  sc, .  Fts5Docli
1dd50 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b  stIter *pIter.){
1dd60 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
1dd70 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
1dd80 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 20  r));.  pIter->a 
1dd90 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74  = pBuf->p;.  pIt
1dda0 65 72 2d 3e 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b  er->n = pBuf->n;
1ddb0 0a 20 20 70 49 74 65 72 2d 3e 62 44 65 73 63 20  .  pIter->bDesc 
1ddc0 3d 20 62 44 65 73 63 3b 0a 20 20 66 74 73 35 44  = bDesc;.  fts5D
1ddd0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
1dde0 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Iter);.}../*.** 
1ddf0 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74  Append a doclist
1de00 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
1de10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1de20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
1de30 6f 63 69 64 28 0a 20 20 69 6e 74 20 2a 70 52 63  ocid(.  int *pRc
1de40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1de50 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
1de60 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
1de70 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 0a 20 20  .  int bDesc,.  
1de80 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1de90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1dea0 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 69  /* Buffer to wri
1deb0 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a  te to */.  i64 *
1dec0 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20  piLastRowid,    
1ded0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
1dee0 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72  /OUT: Previous r
1def0 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69 66  owid written (if
1df00 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69   any) */.  i64 i
1df10 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
1df20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1df30 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  wid to append */
1df40 0a 29 7b 0a 20 20 69 66 28 20 70 42 75 66 2d 3e  .){.  if( pBuf->
1df50 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
1df60 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1df70 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52  nt(pRc, pBuf, iR
1df80 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  owid);.  }else i
1df90 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20  f( bDesc ){.    
1dfa0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1dfb0 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66  Varint(pRc, pBuf
1dfc0 2c 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 2d  , *piLastRowid -
1dfd0 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73   iRowid);.  }els
1dfe0 65 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  e{.    fts5Buffe
1dff0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 52  rAppendVarint(pR
1e000 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69 64 20  c, pBuf, iRowid 
1e010 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3b  - *piLastRowid);
1e020 0a 20 20 7d 0a 20 20 2a 70 69 4c 61 73 74 52 6f  .  }.  *piLastRo
1e030 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a  wid = iRowid;.}.
1e040 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70  ./*.** Buffers p
1e050 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e  1 and p2 contain
1e060 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20   doclists. This 
1e070 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20  function merges 
1e080 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f  the content.** o
1e090 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73  f the two doclis
1e0a0 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20  ts together and 
1e0b0 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74  sets buffer p1 t
1e0c0 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66  o the result bef
1e0d0 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
1e0e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1e0f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
1e100 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
1e110 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61  t in p->rc. If a
1e120 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61  n error has.** a
1e130 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1e140 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1e150 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1e160 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
1e170 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a  rgePrefixLists(.
1e180 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1e1b0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  d object */.  in
1e1c0 74 20 62 44 65 73 63 2c 0a 20 20 46 74 73 35 42  t bDesc,.  Fts5B
1e1d0 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20  uffer *p1,      
1e1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1e1f0 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  rst list to merg
1e200 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
1e210 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20 20  r *p2           
1e220 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64         /* Second
1e230 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
1e240 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e  /.){.  if( p2->n
1e250 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73   ){.    i64 iLas
1e260 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  tRowid = 0;.    
1e270 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
1e280 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c  i1;.    Fts5Docl
1e290 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20  istIter i2;.    
1e2a0 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a  Fts5Buffer out;.
1e2b0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
1e2c0 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  mp;.    memset(&
1e2d0 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f  out, 0, sizeof(o
1e2e0 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ut));.    memset
1e2f0 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66  (&tmp, 0, sizeof
1e300 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20 66 74 73  (tmp));..    fts
1e310 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
1e320 28 70 31 2c 20 62 44 65 73 63 2c 20 26 69 31 29  (p1, bDesc, &i1)
1e330 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ;.    fts5Doclis
1e340 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20 62 44  tIterInit(p2, bD
1e350 65 73 63 2c 20 26 69 32 29 3b 0a 20 20 20 20 77  esc, &i2);.    w
1e360 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1e370 49 54 45 5f 4f 4b 20 26 26 20 28 69 31 2e 61 50  ITE_OK && (i1.aP
1e380 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e  oslist!=0 || i2.
1e390 61 50 6f 73 6c 69 73 74 21 3d 30 29 20 29 7b 0a  aPoslist!=0) ){.
1e3a0 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f        if( i2.aPo
1e3b0 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e  slist==0 || (i1.
1e3c0 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20 20 20  aPoslist && .   
1e3d0 20 20 20 20 20 20 20 20 28 20 28 62 44 65 73 63          ( (bDesc
1e3e0 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e 69 32   && i1.iRowid>i2
1e3f0 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 21 62 44  .iRowid) || (!bD
1e400 65 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64  esc && i1.iRowid
1e410 3c 69 32 2e 69 52 6f 77 69 64 29 20 29 0a 20 20  <i2.iRowid) ).  
1e420 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20      )){.        
1e430 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72  /* Copy entry fr
1e440 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20 20  om i1 */.       
1e450 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
1e460 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 44  Docid(&p->rc, bD
1e470 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73  esc, &out, &iLas
1e480 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69  tRowid, i1.iRowi
1e490 64 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  d);.        /* W
1e4a0 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
1e4b0 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
1e4c0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1e4d0 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  t(&p->rc, &out, 
1e4e0 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2a 20 32 29  i1.nPoslist * 2)
1e4f0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1e500 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1e510 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e  p->rc, &out, i1.
1e520 6e 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 50 6f  nPoslist, i1.aPo
1e530 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  slist);.        
1e540 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
1e550 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20  ext(&i1);.      
1e560 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
1e570 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20   i1.aPoslist==0 
1e580 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31  || i2.iRowid!=i1
1e590 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  .iRowid ){.     
1e5a0 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79     /* Copy entry
1e5b0 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20   from i2 */.    
1e5c0 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
1e5d0 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c  endDocid(&p->rc,
1e5e0 20 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69   bDesc, &out, &i
1e5f0 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
1e600 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 2f  owid);.        /
1e610 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
1e620 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  ZE */.        ft
1e630 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1e640 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75  rint(&p->rc, &ou
1e650 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 20 2a  t, i2.nPoslist *
1e660 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   2);.        fts
1e670 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1e680 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  b(&p->rc, &out, 
1e690 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 32 2e  i2.nPoslist, i2.
1e6a0 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  aPoslist);.     
1e6b0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
1e6c0 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20  erNext(&i2);.   
1e6d0 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b     }.      else{
1e6e0 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73  .        Fts5Pos
1e6f0 6c 69 73 74 52 65 61 64 65 72 20 72 31 3b 0a 20  listReader r1;. 
1e700 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69         Fts5Posli
1e710 73 74 52 65 61 64 65 72 20 72 32 3b 0a 20 20 20  stReader r2;.   
1e720 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
1e730 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 0a  Writer writer;..
1e740 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
1e750 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  writer, 0, sizeo
1e760 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20 20  f(writer));..   
1e770 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68       /* Merge th
1e780 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  e two position l
1e790 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ists. */ .      
1e7a0 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
1e7b0 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62  dDocid(&p->rc, b
1e7c0 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61  Desc, &out, &iLa
1e7d0 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
1e7e0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
1e7f0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70  5BufferZero(&tmp
1e800 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e810 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
1e820 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e 61  derInit(-1, i1.a
1e830 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
1e840 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20 20  list, &r1);.    
1e850 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
1e860 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
1e870 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74  (-1, i2.aPoslist
1e880 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i2.nPoslist, &
1e890 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  r2);.        whi
1e8a0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
1e8b0 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f 66  E_OK && (r1.bEof
1e8c0 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d 3d  ==0 || r2.bEof==
1e8d0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
1e8e0 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  i64 iNew;.      
1e8f0 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66 20      if( r2.bEof 
1e900 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 26  || (r1.bEof==0 &
1e910 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50 6f  & r1.iPos<r2.iPo
1e920 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
1e930 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f 73    iNew = r1.iPos
1e940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1e950 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
1e960 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b  ReaderNext(&r1);
1e970 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1e980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e  {.            iN
1e990 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20 20  ew = r2.iPos;.  
1e9a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e9b0 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
1e9c0 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20 20  erNext(&r2);.   
1e9d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 2e           if( r1.
1e9e0 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29 20  iPos==r2.iPos ) 
1e9f0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1ea00 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31  stReaderNext(&r1
1ea10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1ea20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1ea30 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1ea40 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28  istWriterAppend(
1ea50 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20 69  &tmp, &writer, i
1ea60 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  New);.        }.
1ea70 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54  .        /* WRIT
1ea80 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
1ea90 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1eaa0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1eab0 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70  p->rc, &out, tmp
1eac0 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20  .n * 2);.       
1ead0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1eae0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f  dBlob(&p->rc, &o
1eaf0 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70  ut, tmp.n, tmp.p
1eb00 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1eb10 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
1eb20 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  i1);.        fts
1eb30 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
1eb40 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (&i2);.      }. 
1eb50 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
1eb60 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1eb70 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70  p1, out.n, out.p
1eb80 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
1eb90 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20  rFree(&tmp);.   
1eba0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1ebb0 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  &out);.  }.}..st
1ebc0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 75  atic void fts5Bu
1ebd0 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75 66  fferSwap(Fts5Buf
1ebe0 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66  fer *p1, Fts5Buf
1ebf0 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35  fer *p2){.  Fts5
1ec00 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31  Buffer tmp = *p1
1ec10 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20  ;.  *p1 = *p2;. 
1ec20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73   *p2 = tmp;.}..s
1ec30 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
1ec40 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28 0a  etupPrefixIter(.
1ec50 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65    /* Index to re
1ec80 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
1ec90 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20   bDesc,         
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ecb0 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20  True for "ORDER 
1ecc0 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a  BY rowid DESC" *
1ecd0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
1ece0 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
1ecf0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
1ed00 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20  ntaining prefix 
1ed10 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e  to match */.  in
1ed20 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20  t nToken,       
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed40 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
1ed50 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20  pToken in bytes 
1ed60 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
1ed70 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
1ed80 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
1ed90 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
1eda0 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
1edb0 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46  re *pStruct;.  F
1edc0 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b  ts5Buffer *aBuf;
1edd0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
1ede0 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66 20  f = 32;..  aBuf 
1edf0 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29 66  = (Fts5Buffer*)f
1ee00 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
1ee10 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1ee20 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72  r)*nBuf);.  pStr
1ee30 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1ee40 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69  ureRead(p);..  i
1ee50 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72 75  f( aBuf && pStru
1ee60 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ct ){.    const 
1ee70 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
1ee80 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
1ee90 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73  ;.    Fts5Doclis
1eea0 74 49 74 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b  tIter *pDoclist;
1eeb0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1eec0 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d  i64 iLastRowid =
1eed0 20 30 3b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74   0;.    Fts5Mult
1eee0 69 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 30  iSegIter *p1 = 0
1eef0 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f  ;     /* Iterato
1ef00 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72  r used to gather
1ef10 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78   data from index
1ef20 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
1ef30 65 72 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20  er doclist;..   
1ef40 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74   memset(&doclist
1ef50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c  , 0, sizeof(docl
1ef60 69 73 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66  ist));.    for(f
1ef70 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
1ef80 70 2c 20 70 53 74 72 75 63 74 2c 20 31 2c 20 66  p, pStruct, 1, f
1ef90 6c 61 67 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  lags, pToken, nT
1efa0 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31  oken, -1, 0, &p1
1efb0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
1efc0 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
1efd0 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66  1)==0;.        f
1efe0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
1eff0 28 70 2c 20 70 31 2c 20 30 2c 20 30 29 0a 20 20  (p, p1, 0, 0).  
1f000 20 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69    ){.      i64 i
1f010 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74  Rowid = fts5Mult
1f020 69 49 74 65 72 52 6f 77 69 64 28 70 31 29 3b 0a  iIterRowid(p1);.
1f030 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
1f040 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
1f050 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c  *pTerm = fts5Mul
1f060 74 69 49 74 65 72 54 65 72 6d 28 70 31 2c 20 26  tiIterTerm(p1, &
1f070 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 61 73  nTerm);.      as
1f080 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 70 54 6f  sert( memcmp(pTo
1f090 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28  ken, pTerm, MIN(
1f0a0 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c  nToken, nTerm))<
1f0b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1f0c0 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20  nTerm<nToken || 
1f0d0 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70  memcmp(pToken, p
1f0e0 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20  Term, nToken) ) 
1f0f0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66  break;..      if
1f100 28 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 0a 20  ( doclist.n>0 . 
1f110 20 20 20 20 20 20 26 26 20 28 28 21 62 44 65 73        && ((!bDes
1f120 63 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61  c && iRowid<=iLa
1f130 73 74 52 6f 77 69 64 29 20 7c 7c 20 28 62 44 65  stRowid) || (bDe
1f140 73 63 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4c  sc && iRowid>=iL
1f150 61 73 74 52 6f 77 69 64 29 29 0a 20 20 20 20 20  astRowid)).     
1f160 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72   ){..        for
1f170 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
1f180 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73  ITE_OK && doclis
1f190 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  t.n; i++){.     
1f1a0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
1f1b0 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Buf );.         
1f1c0 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d   if( aBuf[i].n==
1f1d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1f1e0 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
1f1f0 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
1f200 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
1f210 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1f220 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  &doclist);.     
1f230 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f240 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
1f250 65 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20  ePrefixLists(p, 
1f260 62 44 65 73 63 2c 20 26 64 6f 63 6c 69 73 74 2c  bDesc, &doclist,
1f270 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
1f280 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f290 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29  erZero(&aBuf[i])
1f2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f2c0 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73        if( doclis
1f2d0 74 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t.n==0 ){.      
1f2e0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1f2f0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1f300 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69   &doclist, iRowi
1f310 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  d);.      }else 
1f320 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20  if( bDesc ){.   
1f330 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f340 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1f350 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 4c  rc, &doclist, iL
1f360 61 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77 69  astRowid - iRowi
1f370 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
1f380 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f390 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1f3a0 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74  &p->rc, &doclist
1f3b0 2c 20 69 52 6f 77 69 64 20 2d 20 69 4c 61 73 74  , iRowid - iLast
1f3c0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  Rowid);.      }.
1f3d0 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64        iLastRowid
1f3e0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20   = iRowid;.     
1f3f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f   fts5MultiIterPo
1f400 73 6c 69 73 74 28 70 2c 20 70 31 2c 20 31 2c 20  slist(p, p1, 1, 
1f410 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d  &doclist);.    }
1f420 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
1f430 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nBuf; i++){.   
1f440 20 20 20 66 74 73 35 4d 65 72 67 65 50 72 65 66     fts5MergePref
1f450 69 78 4c 69 73 74 73 28 70 2c 20 62 44 65 73 63  ixLists(p, bDesc
1f460 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75  , &doclist, &aBu
1f470 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 66 74 73  f[i]);.      fts
1f480 35 42 75 66 66 65 72 46 72 65 65 28 26 61 42 75  5BufferFree(&aBu
1f490 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  f[i]);.    }.   
1f4a0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
1f4b0 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20  ee(p, p1);..    
1f4c0 70 44 6f 63 6c 69 73 74 20 3d 20 28 46 74 73 35  pDoclist = (Fts5
1f4d0 44 6f 63 6c 69 73 74 49 74 65 72 2a 29 66 74 73  DoclistIter*)fts
1f4e0 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
1f4f0 7a 65 6f 66 28 46 74 73 35 44 6f 63 6c 69 73 74  zeof(Fts5Doclist
1f500 49 74 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  Iter));.    if( 
1f510 21 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  !pDoclist ){.   
1f520 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
1f530 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20  e(&doclist);.   
1f540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1f550 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 3d 20  ter->pDoclist = 
1f560 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  pDoclist;.      
1f570 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
1f580 6e 69 74 28 26 64 6f 63 6c 69 73 74 2c 20 62 44  nit(&doclist, bD
1f590 65 73 63 2c 20 70 49 74 65 72 2d 3e 70 44 6f 63  esc, pIter->pDoc
1f5a0 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  list);.    }.  }
1f5b0 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ..  fts5Structur
1f5c0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1f5d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1f5e0 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  e(aBuf);.}.../*.
1f5f0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
1f600 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
1f610 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
1f620 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29  Fts5IndexWrite()
1f630 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74   pertain.** to t
1f640 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
1f650 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a   rowid iRowid..*
1f660 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
1f670 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65  5IndexBeginWrite
1f680 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
1f690 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73  64 iRowid){.  as
1f6a0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
1f6b0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20  ITE_OK );..  /* 
1f6c0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73  Allocate the has
1f6d0 68 20 74 61 62 6c 65 20 69 66 20 69 74 20 68 61  h table if it ha
1f6e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
1f6f0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
1f700 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d    if( p->pHash==
1f710 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 ){.    p->rc =
1f720 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1f730 4e 65 77 28 26 70 2d 3e 70 48 61 73 68 2c 20 26  New(&p->pHash, &
1f740 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 29  p->nPendingData)
1f750 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 52 6f  ;.  }..  if( iRo
1f760 77 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65 52 6f  wid<=p->iWriteRo
1f770 77 69 64 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64  wid || (p->nPend
1f780 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e 4d 61  ingData > p->nMa
1f790 78 50 65 6e 64 69 6e 67 44 61 74 61 29 20 29 7b  xPendingData) ){
1f7a0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c  .    fts5IndexFl
1f7b0 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20 70 2d  ush(p);.  }.  p-
1f7c0 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69  >iWriteRowid = i
1f7d0 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  Rowid;.  return 
1f7e0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
1f7f0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
1f800 6d 69 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b  mit data to disk
1f810 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f820 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74  Fts5IndexSync(Ft
1f830 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
1f840 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65  bCommit){.  asse
1f850 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
1f860 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e  E_OK );.  fts5In
1f870 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 69  dexFlush(p);.  i
1f880 66 28 20 62 43 6f 6d 6d 69 74 20 29 20 66 74 73  f( bCommit ) fts
1f890 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
1f8a0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
1f8b0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
1f8c0 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61  ./*.** Discard a
1f8d0 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  ny data stored i
1f8e0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1f8f0 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20  hash tables. Do 
1f900 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20  not write it.** 
1f910 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1f920 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61   Additionally, a
1f930 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63  ssume that the c
1f940 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25  ontents of the %
1f950 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d  _data.** table m
1f960 61 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  ay have changed 
1f970 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20  on disk. So any 
1f980 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73  in-memory caches
1f990 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72   of %_data .** r
1f9a0 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69  ecords must be i
1f9b0 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69  nvalidated..*/.i
1f9c0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
1f9d0 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35  dexRollback(Fts5
1f9e0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73  Index *p){.  fts
1f9f0 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
1fa00 0a 20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63  .  fts5IndexDisc
1fa10 61 72 64 44 61 74 61 28 70 29 3b 0a 20 20 61 73  ardData(p);.  as
1fa20 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
1fa30 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75  ITE_OK );.  retu
1fa40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1fa50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74  ./*.** The %_dat
1fa60 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c  a table is compl
1fa70 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e  etely empty when
1fa80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1fa90 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a  s called. This.*
1faa0 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c  * function popul
1fab0 61 74 65 73 20 69 74 20 77 69 74 68 20 74 68 65  ates it with the
1fac0 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75   initial structu
1fad0 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65  re objects for e
1fae0 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e  ach index,.** an
1faf0 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65  d the initial ve
1fb00 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76  rsion of the "av
1fb10 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 28  erages" record (
1fb20 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62  a zero-byte blob
1fb30 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1fb40 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74  3Fts5IndexReinit
1fb50 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1fb60 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1fb70 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  s;..  assert( p-
1fb80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1fb90 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
1fba0 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
1fbb0 76 65 72 61 67 65 73 28 70 2c 20 28 63 6f 6e 73  verages(p, (cons
1fbc0 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 0a 20  t u8*)"", 0);.. 
1fbd0 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
1fbe0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
1fbf0 75 72 65 29 29 3b 0a 20 20 66 74 73 35 53 74 72  ure));.  fts5Str
1fc00 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 26  uctureWrite(p, &
1fc10 73 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66 74  s);..  return ft
1fc20 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
1fc30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1fc40 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20  a new Fts5Index 
1fc50 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62  handle. If the b
1fc60 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20  Create argument 
1fc70 69 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a  is true, create.
1fc80 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
1fc90 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1fca0 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
1fcb0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1fcc0 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ul, set *pp to p
1fcd0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
1fce0 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
1fcf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
1fd00 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a  Otherwise, set *
1fd10 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72  pp to NULL and r
1fd20 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1fd30 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
1fd40 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
1fd50 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43  dexOpen(.  Fts5C
1fd60 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20  onfig *pConfig, 
1fd70 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20  .  int bCreate, 
1fd80 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70  .  Fts5Index **p
1fd90 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  p,.  char **pzEr
1fda0 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
1fdb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
1fdc0 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20  5Index *p;      
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fde0 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  New object */.. 
1fdf0 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35   *pp = p = (Fts5
1fe00 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 46 74  Index*)sqlite3Ft
1fe10 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
1fe20 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  , sizeof(Fts5Ind
1fe30 65 78 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex));.  if( rc==
1fe40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fe50 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43   p->pConfig = pC
1fe60 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57  onfig;.    p->nW
1fe70 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53 35 5f 57  orkUnit = FTS5_W
1fe80 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d  ORK_UNIT;.    p-
1fe90 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61  >nMaxPendingData
1fea0 20 3d 20 31 30 32 34 2a 31 30 32 34 3b 0a 20 20   = 1024*1024;.  
1feb0 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20    p->zDataTbl = 
1fec0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1fed0 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66  "%s_data", pConf
1fee0 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ig->zName);.    
1fef0 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d  if( p->zDataTbl=
1ff00 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1ff10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1ff20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 43 72     }else if( bCr
1ff30 65 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63  eate ){.      rc
1ff40 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72   = sqlite3Fts5Cr
1ff50 65 61 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20  eateTable(.     
1ff60 20 20 20 20 20 70 43 6f 6e 66 69 67 2c 20 22 64       pConfig, "d
1ff70 61 74 61 22 2c 20 22 69 64 20 49 4e 54 45 47 45  ata", "id INTEGE
1ff80 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
1ff90 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70  lock BLOB", 0, p
1ffa0 7a 45 72 72 0a 20 20 20 20 20 20 29 3b 0a 20 20  zErr.      );.  
1ffb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ffc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ffd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
1ffe0 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b  5IndexReinit(p);
1fff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20000 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63   }..  assert( rc
20010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
20020 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20030 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
20040 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e     sqlite3Fts5In
20050 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20  dexClose(p);.   
20060 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
20070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20080 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64  .** Close a hand
20090 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  le opened by an 
200a0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
200b0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
200c0 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Open()..*/.int s
200d0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
200e0 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  lose(Fts5Index *
200f0 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
20100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
20110 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
20120 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29   p->pReader==0 )
20130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
20140 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65  nalize(p->pWrite
20150 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
20160 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c  finalize(p->pDel
20170 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  eter);.    sqlit
20180 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70  e3Fts5HashFree(p
20190 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71  ->pHash);.    sq
201a0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
201b0 72 65 65 28 26 70 2d 3e 73 63 72 61 74 63 68 29  ree(&p->scratch)
201c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
201d0 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
201e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
201f0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
20200 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20210 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
20220 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
20230 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
20240 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
20250 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
20260 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
20270 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
20280 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
20290 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
202a0 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
202b0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
202c0 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
202d0 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
202e0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
202f0 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
20300 6e 54 6f 42 79 74 65 6c 65 6e 28 63 6f 6e 73 74  nToBytelen(const
20310 20 63 68 61 72 20 2a 70 2c 20 69 6e 74 20 6e 42   char *p, int nB
20320 79 74 65 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b  yte, int nChar){
20330 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
20340 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
20350 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b  ; i<nChar; i++){
20360 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74  .    if( n>=nByt
20370 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
20380 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74     /* Input cont
20390 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
203a0 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20  nChar chars */. 
203b0 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
203c0 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78   char)p[n++]>=0x
203d0 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  c0 ){.      whil
203e0 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29  e( (p[n] & 0xc0)
203f0 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20  ==0x80 ) n++;.  
20400 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20410 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e   n;.}../*.** pIn
20420 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
20430 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20  ded string, nIn 
20440 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52  bytes in size. R
20450 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
20460 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63   of.** unicode c
20470 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
20480 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20   string..*/.int 
20490 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
204a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e  (const char *pIn
204b0 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e  , int nIn){.  in
204c0 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20  t nChar = 0;    
204d0 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
204e0 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
204f0 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  <nIn ){.    if( 
20500 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
20510 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b  In[i++]>=0xc0 ){
20520 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c  .      while( i<
20530 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26  nIn && (pIn[i] &
20540 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69   0xc0)==0x80 ) i
20550 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  ++;.    }.    nC
20560 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  har++;.  }.  ret
20570 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a  urn nChar;.}../*
20580 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
20590 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20  move data to or 
205a0 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20  from the index. 
205b0 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75  Each time a docu
205c0 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65  ment is .** adde
205d0 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  d to or removed 
205e0 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
205f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
20600 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d   called one or m
20610 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a  ore.** times..**
20620 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72  .** For an inser
20630 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  t, it must be ca
20640 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
20650 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
20660 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a  new document..**
20670 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
20680 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
20690 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
206a0 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
206b0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69   for each.** uni
206c0 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  que token in the
206d0 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61   document with a
206e0 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73  n iCol value les
206f0 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65  s than zero. The
20700 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e   iPos.** argumen
20710 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  t is ignored for
20720 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e   a delete..*/.in
20730 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
20740 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
20750 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
20760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20770 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
20780 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
20790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207a0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
207b0 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
207c0 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
207d0 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
20800 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
20810 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
20820 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
20830 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
20840 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
20850 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
20860 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  m index */.){.  
20870 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
208a0 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
208b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
208c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
208d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
208e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
208f0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
20900 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20  = p->pConfig;.. 
20910 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
20920 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
20930 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 79  /* Add the entry
20940 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72   to the main ter
20950 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72  ms index. */.  r
20960 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
20970 61 73 68 57 72 69 74 65 28 0a 20 20 20 20 20 20  ashWrite(.      
20980 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72  p->pHash, p->iWr
20990 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  iteRowid, iCol, 
209a0 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f  iPos, FTS5_MAIN_
209b0 50 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20  PREFIX, pToken, 
209c0 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66  nToken.  );..  f
209d0 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69  or(i=0; i<pConfi
209e0 67 2d 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63  g->nPrefix && rc
209f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
20a00 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
20a10 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72   = fts5IndexChar
20a20 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f  lenToBytelen(pTo
20a30 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f  ken, nToken, pCo
20a40 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d  nfig->aPrefix[i]
20a50 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
20a60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20a70 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
20a80 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20  ite(p->pHash, . 
20a90 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69           p->iWri
20aa0 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
20ab0 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50  Pos, FTS5_MAIN_P
20ac0 52 45 46 49 58 2b 69 2b 31 2c 20 70 54 6f 6b 65  REFIX+i+1, pToke
20ad0 6e 2c 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29  n, nByte.      )
20ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
20af0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20b00 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74  ** Open a new it
20b10 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74  erator to iterat
20b20 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 64 6f 63  e though all doc
20b30 69 64 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ids that match t
20b40 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  he .** specified
20b50 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20   token or token 
20b60 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73  prefix..*/.int s
20b70 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
20b80 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65  uery(.  Fts5Inde
20b90 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
20ba0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69          /* FTS i
20bb0 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f  ndex to query */
20bc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
20bd0 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65  Token, int nToke
20be0 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20  n, /* Token (or 
20bf0 70 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79  prefix) to query
20c00 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c   for */.  int fl
20c10 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
20c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
20c30 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51  k of FTS5INDEX_Q
20c40 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a  UERY_X flags */.
20c50 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
20c60 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20  **ppIter        
20c70 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74    /* OUT: New it
20c80 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  erator object */
20c90 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  .){.  Fts5Config
20ca0 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
20cb0 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e  Config;.  Fts5In
20cc0 64 65 78 49 74 65 72 20 2a 70 52 65 74 3b 0a 20  dexIter *pRet;. 
20cd0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
20ce0 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20   Fts5Buffer buf 
20cf0 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20  = {0, 0, 0};..  
20d00 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f  /* If the QUERY_
20d10 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74  SCAN flag is set
20d20 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67  , all other flag
20d30 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e  s must be clear.
20d40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
20d50 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
20d60 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 0a  _QUERY_SCAN)==0.
20d70 20 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73         || (flags
20d80 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
20d90 52 59 5f 53 43 41 4e 29 3d 3d 46 54 53 35 49 4e  RY_SCAN)==FTS5IN
20da0 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 0a 20  DEX_QUERY_SCAN. 
20db0 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   );..  if( sqlit
20dc0 65 33 46 74 73 35 42 75 66 66 65 72 47 72 6f 77  e3Fts5BufferGrow
20dd0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e  (&p->rc, &buf, n
20de0 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20  Token+1)==0 ){. 
20df0 20 20 20 6d 65 6d 63 70 79 28 26 62 75 66 2e 70     memcpy(&buf.p
20e00 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  [1], pToken, nTo
20e10 6b 65 6e 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ken);.  }..  if(
20e20 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
20e30 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20  EX_QUERY_PREFIX 
20e40 29 7b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  ){.    if( flags
20e50 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
20e60 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 29 7b  RY_TEST_NOIDX ){
20e70 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b  .      iIdx = 1+
20e80 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
20e90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20ea0 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66     int nChar = f
20eb0 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28  ts5IndexCharlen(
20ec0 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
20ed0 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d  .      for(iIdx=
20ee0 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  1; iIdx<=pConfig
20ef0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
20f00 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
20f10 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
20f20 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20  [iIdx-1]==nChar 
20f30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
20f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52  .    }.  }..  pR
20f50 65 74 20 3d 20 28 46 74 73 35 49 6e 64 65 78 49  et = (Fts5IndexI
20f60 74 65 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ter*)sqlite3Fts5
20f70 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
20f80 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e  c, sizeof(Fts5In
20f90 64 65 78 49 74 65 72 29 29 3b 0a 20 20 69 66 28  dexIter));.  if(
20fa0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 6d 65 6d   pRet ){.    mem
20fb0 73 65 74 28 70 52 65 74 2c 20 30 2c 20 73 69 7a  set(pRet, 0, siz
20fc0 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65  eof(Fts5IndexIte
20fd0 72 29 29 3b 0a 0a 20 20 20 20 70 52 65 74 2d 3e  r));..    pRet->
20fe0 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20  pIndex = p;.    
20ff0 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69  if( iIdx<=pConfi
21000 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20  g->nPrefix ){.  
21010 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46      buf.p[0] = F
21020 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20  TS5_MAIN_PREFIX 
21030 2b 20 69 49 64 78 3b 0a 20 20 20 20 20 20 70 52  + iIdx;.      pR
21040 65 74 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74  et->pStruct = ft
21050 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
21060 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  p);.      if( pR
21070 65 74 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a 20  et->pStruct ){. 
21080 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
21090 49 74 65 72 4e 65 77 28 0a 20 20 20 20 20 20 20  IterNew(.       
210a0 20 20 20 20 20 70 2c 20 70 52 65 74 2d 3e 70 53       p, pRet->pS
210b0 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c  truct, 1, flags,
210c0 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
210d0 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 2d 3e  , -1, 0, &pRet->
210e0 70 4d 75 6c 74 69 0a 20 20 20 20 20 20 20 20 29  pMulti.        )
210f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
21100 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  lse{.      int b
21110 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20  Desc = (flags & 
21120 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
21130 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20  DESC)!=0;.      
21140 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f  buf.p[0] = FTS5_
21150 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20  MAIN_PREFIX;.   
21160 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66     fts5SetupPref
21170 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c  ixIter(p, bDesc,
21180 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
21190 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20  , pRet);.    }. 
211a0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 20   }..  if( p->rc 
211b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
211c0 73 35 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74  s5IterClose(pRet
211d0 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  );.    pRet = 0;
211e0 0a 20 20 7d 0a 20 20 2a 70 70 49 74 65 72 20 3d  .  }.  *ppIter =
211f0 20 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33   pRet;.  sqlite3
21200 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  Fts5BufferFree(&
21210 62 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  buf);.  return f
21220 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
21230 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
21240 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
21250 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
21260 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
21270 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a  ent is at EOF..*
21280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
21290 35 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  5IterEof(Fts5Ind
212a0 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
212b0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
212c0 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c  >pIndex->rc==SQL
212d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
212e0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20  pIter->pDoclist 
212f0 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
21300 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e  Iter->pDoclist->
21310 61 50 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a 20 20  aPoslist==0; .  
21320 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
21330 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  n fts5MultiIterE
21340 6f 66 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  of(pIter->pIndex
21350 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29  , pIter->pMulti)
21360 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
21370 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
21380 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20  matching rowid. 
21390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
213a0 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35  ts5IterNext(Fts5
213b0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
213c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
213d0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
213e0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
213f0 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  f( pIter->pDocli
21400 73 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f  st ){.    fts5Do
21410 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49  clistIterNext(pI
21420 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a  ter->pDoclist);.
21430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
21440 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74  5BufferZero(&pIt
21450 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
21460 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
21470 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ext(pIter->pInde
21480 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  x, pIter->pMulti
21490 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
214a0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
214b0 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
214c0 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
214d0 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
214e0 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f  matching term/ro
214f0 77 69 64 2e 20 55 73 65 64 20 62 79 20 74 68 65  wid. Used by the
21500 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c   fts5vocab modul
21510 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
21520 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63 61  3Fts5IterNextSca
21530 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  n(Fts5IndexIter 
21540 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49  *pIter){.  Fts5I
21550 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d  ndex *p = pIter-
21560 3e 70 49 6e 64 65 78 3b 0a 20 20 46 74 73 35 4d  >pIndex;.  Fts5M
21570 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75  ultiSegIter *pMu
21580 6c 74 69 20 3d 20 70 49 74 65 72 2d 3e 70 4d 75  lti = pIter->pMu
21590 6c 74 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  lti;..  assert( 
215a0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
215b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
215c0 20 20 61 73 73 65 72 74 28 20 70 4d 75 6c 74 69    assert( pMulti
215d0 20 29 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65   );..  fts5Buffe
215e0 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
215f0 73 6c 69 73 74 29 3b 0a 20 20 66 74 73 35 4d 75  slist);.  fts5Mu
21600 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
21610 4d 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20  Multi, 0, 0);.  
21620 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
21630 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
21640 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
21650 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70  &pMulti->aSeg[ p
21660 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d  Multi->aFirst[1]
21670 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69  .iFirst ];.    i
21680 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26  f( pSeg->pLeaf &
21690 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 5b 30  & pSeg->term.p[0
216a0 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  ]!=FTS5_MAIN_PRE
216b0 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66 74 73  FIX ){.      fts
216c0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 53 65  5DataRelease(pSe
216d0 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  g->pLeaf);.     
216e0 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d 20 30   pSeg->pLeaf = 0
216f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
21700 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
21710 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
21720 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
21730 6f 76 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  ove the doclist-
21740 69 74 65 72 20 70 61 73 73 65 64 20 61 73 20 74  iter passed as t
21750 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
21760 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a  t to the next .*
21770 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  * matching rowid
21780 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
21790 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e  or after iMatch.
217a0 20 54 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   The definition 
217b0 6f 66 20 22 61 74 20 0a 2a 2a 20 6f 72 20 61 66  of "at .** or af
217c0 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20  ter" depends on 
217d0 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65  whether this ite
217e0 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 20 69  rator iterates i
217f0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 0a  n ascending or .
21800 2a 2a 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  ** descending ro
21810 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  wid order..*/.st
21820 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
21830 63 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f  clistIterNextFro
21840 6d 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  m(Fts5DoclistIte
21850 72 20 2a 70 2c 20 69 36 34 20 69 4d 61 74 63 68  r *p, i64 iMatch
21860 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34  ){.  do{.    i64
21870 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e 69 52 6f   iRowid = p->iRo
21880 77 69 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  wid;.    if( p->
21890 62 44 65 73 63 3d 3d 30 20 26 26 20 69 52 6f 77  bDesc==0 && iRow
218a0 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id>=iMatch ) bre
218b0 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  ak;.    if( p->b
218c0 44 65 73 63 21 3d 30 20 26 26 20 69 52 6f 77 69  Desc!=0 && iRowi
218d0 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d<=iMatch ) brea
218e0 6b 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  k;.    fts5Docli
218f0 73 74 49 74 65 72 4e 65 78 74 28 70 29 3b 0a 20  stIterNext(p);. 
21900 20 7d 77 68 69 6c 65 28 20 70 2d 3e 61 50 6f 73   }while( p->aPos
21910 6c 69 73 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  list );.}../*.**
21920 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
21930 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
21940 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
21950 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e  or after iMatch.
21960 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69   The.** definiti
21970 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74  on of "at or aft
21980 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  er" depends on w
21990 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72  hether this iter
219a0 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a  ator iterates.**
219b0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
219c0 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
219d0 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20  d order..*/.int 
219e0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
219f0 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
21a00 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 36  xIter *pIter, i6
21a10 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 69 66 28  4 iMatch){.  if(
21a20 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
21a30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c   ){.    fts5Docl
21a40 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  istIterNextFrom(
21a50 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2c  pIter->pDoclist,
21a60 20 69 4d 61 74 63 68 29 3b 0a 20 20 7d 65 6c 73   iMatch);.  }els
21a70 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  e{.    fts5Multi
21a80 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74  IterNextFrom(pIt
21a90 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
21aa0 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61 74 63  r->pMulti, iMatc
21ab0 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
21ac0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
21ad0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
21ae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21af0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
21b00 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  id..*/.i64 sqlit
21b10 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28  e3Fts5IterRowid(
21b20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
21b30 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
21b40 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a  er->pDoclist ){.
21b50 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 72      return pIter
21b60 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 69 52 6f 77  ->pDoclist->iRow
21b70 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  id;.  }else{.   
21b80 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74   return fts5Mult
21b90 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
21ba0 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d  ->pMulti);.  }.}
21bb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21bc0 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e  he current term.
21bd0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
21be0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 54  sqlite3Fts5IterT
21bf0 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65  erm(Fts5IndexIte
21c00 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70  r *pIter, int *p
21c10 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  n){.  int n;.  c
21c20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 66  onst char *z = f
21c30 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
21c40 28 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20  (pIter->pMulti, 
21c50 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31  &n);.  *pn = n-1
21c60 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d  ;.  return &z[1]
21c70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
21c80 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
21c90 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
21ca0 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ing a copy of th
21cb0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
21cc0 66 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  for.** the curre
21cd0 6e 74 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74  nt entry. Output
21ce0 20 76 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73   variable *pn is
21cf0 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
21d00 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a   of the buffer .
21d10 2a 2a 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f  ** in bytes befo
21d20 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
21d30 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
21d40 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
21d50 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
21d60 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 62  the "number of b
21d70 79 74 65 73 22 20 76 61 72 69 6e 74 0a 2a 2a 20  ytes" varint.** 
21d80 66 69 65 6c 64 20 74 68 61 74 20 73 74 61 72 74  field that start
21d90 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
21da0 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a  ist on disk..*/.
21db0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
21dc0 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49  terPoslist(Fts5I
21dd0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
21de0 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20   const u8 **pp, 
21df0 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 61 73 73 65  int *pn){.  asse
21e00 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
21e10 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
21e20 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d   );.  if( pIter-
21e30 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  >pDoclist ){.   
21e40 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 44   *pn = pIter->pD
21e50 6f 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c 69 73 74  oclist->nPoslist
21e60 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65  ;.    *pp = pIte
21e70 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50 6f  r->pDoclist->aPo
21e80 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  slist;.  }else{.
21e90 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70      Fts5Index *p
21ea0 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
21eb0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
21ec0 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
21ed0 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 4d  list);.    fts5M
21ee0 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
21ef0 70 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  p, pIter->pMulti
21f00 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  , 0, &pIter->pos
21f10 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 6e 20 3d  list);.    *pn =
21f20 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
21f30 6e 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74  n;.    *pp = pIt
21f40 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
21f50 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35   }.  return fts5
21f60 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65  IndexReturn(pIte
21f70 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  r->pIndex);.}../
21f80 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74  *.** Close an it
21f90 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79  erator opened by
21fa0 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
21fb0 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
21fc0 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a  ndexQuery()..*/.
21fd0 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
21fe0 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e  IterClose(Fts5In
21ff0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
22000 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
22010 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
22020 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
22030 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
22040 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61  ter->pDoclist->a
22050 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22060 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f  _free(pIter->pDo
22070 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  clist);.    }els
22080 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  e{.      fts5Mul
22090 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72  tiIterFree(pIter
220a0 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d  ->pIndex, pIter-
220b0 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20  >pMulti);.      
220c0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
220d0 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72  ease(pIter->pStr
220e0 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  uct);.      fts5
220f0 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65  BufferFree(&pIte
22100 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
22110 20 7d 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65   }.    fts5Close
22120 52 65 61 64 65 72 28 70 49 74 65 72 2d 3e 70 49  Reader(pIter->pI
22130 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
22140 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
22150 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
22160 64 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  d the "averages"
22170 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
22180 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64   buffer supplied
22190 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
221a0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74  ** argument. Ret
221b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
221c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
221d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
221e0 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72  code.** if an er
221f0 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  ror occurs..*/.i
22200 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
22210 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
22220 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
22230 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
22240 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
22250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
22260 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
22270 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46 54  ffer(p, pBuf, FT
22280 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
22290 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  D);.  return fts
222a0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
222b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  .}../*.** Replac
222c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61  e the current "a
222d0 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
222e0 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
222f0 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
22300 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20  .** supplied as 
22310 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
22320 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
22330 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
22340 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
22350 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a  x *p, const u8 *
22360 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
22370 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
22380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
22390 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
223a0 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
223b0 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20  S_ROWID, pData, 
223c0 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  nData);.  return
223d0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
223e0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
223f0 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
22400 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20  umber of blocks 
22410 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20  this module has 
22420 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  read from the %_
22430 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69  data.** table si
22440 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74  nce it was creat
22450 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
22460 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73  e3Fts5IndexReads
22470 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
22480 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61    return p->nRea
22490 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  d;.}../*.** Set 
224a0 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69  the 32-bit cooki
224b0 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61  e value stored a
224c0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  t the start of a
224d0 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  ll structure .**
224e0 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20   records to the 
224f0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
22500 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
22510 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ent..**.** Retur
22520 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
22530 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
22540 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
22550 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
22560 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
22570 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22580 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49  xSetCookie(Fts5I
22590 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65  ndex *p, int iNe
225a0 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  w){.  int rc;   
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
225d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
225e0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
225f0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
22600 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61      /* Configura
22610 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
22620 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20   u8 aCookie[4]; 
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20        /* Binary 
22650 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
22660 66 20 69 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73  f iNew */..  ass
22670 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
22680 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71 6c 69  TE_OK );..  sqli
22690 74 65 33 46 74 73 35 50 75 74 33 32 28 61 43 6f  te3Fts5Put32(aCo
226a0 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 20 20 73  okie, iNew);.  s
226b0 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
226c0 6f 62 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  ob = 0;.  rc = s
226d0 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
226e0 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43  (pConfig->db, pC
226f0 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
22700 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20  DataTbl, .      
22710 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54  "block", FTS5_ST
22720 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31  RUCTURE_ROWID, 1
22730 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20  , &pBlob.  );.  
22740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22750 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
22760 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f  _blob_write(pBlo
22770 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30  b, aCookie, 4, 0
22780 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
22790 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
227a0 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Blob);.  }..  re
227b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
227c0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
227d0 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49  LoadConfig(Fts5I
227e0 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
227f0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
22800 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  ct;.  pStruct = 
22810 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
22820 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  d(p);.  fts5Stru
22830 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
22840 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ruct);.  return 
22850 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
22860 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  p);.}.../*******
22870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
228a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
228b0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
228c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
228d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
228e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
228f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
22900 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e   Below this poin
22910 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  t is the impleme
22920 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  ntation of the i
22930 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a  ntegrity-check .
22940 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  ** functionality
22950 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
22960 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63  rn a simple chec
22970 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64  ksum value based
22980 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   on the argument
22990 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34  s..*/.static u64
229a0 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
229b0 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77  ksum(.  i64 iRow
229c0 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  id, .  int iCol,
229d0 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20   .  int iPos, . 
229e0 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e   int iIdx,.  con
229f0 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a  st char *pTerm,.
22a00 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20    int nTerm.){. 
22a10 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65   int i;.  u64 re
22a20 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65  t = iRowid;.  re
22a30 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
22a40 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28  iCol;.  ret += (
22a50 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a  ret<<3) + iPos;.
22a60 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20    if( iIdx>=0 ) 
22a70 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
22a80 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  + (FTS5_MAIN_PRE
22a90 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66  FIX + iIdx);.  f
22aa0 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
22ab0 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65   i++) ret += (re
22ac0 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d  t<<3) + pTerm[i]
22ad0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
22ae0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
22af0 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69 74  ts5BtreeIterInit
22b00 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
22b10 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  , .  Fts5Structu
22b20 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
22b30 20 0a 20 20 46 74 73 35 42 74 72 65 65 49 74 65   .  Fts5BtreeIte
22b40 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69 6e  r *pIter.){.  in
22b50 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
22b60 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
22b70 6f 66 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  of(pIter->aLvl[0
22b80 5d 29 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65 69  ]) * (pSeg->nHei
22b90 67 68 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74  ght-1);.  memset
22ba0 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
22bb0 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 69 66  f(*pIter));.  if
22bc0 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 70  ( nByte ){.    p
22bd0 49 74 65 72 2d 3e 61 4c 76 6c 20 3d 20 28 46 74  Iter->aLvl = (Ft
22be0 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
22bf0 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
22c00 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  p, nByte);.  }. 
22c10 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
22c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74  TE_OK ){.    pIt
22c30 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65 67 2d  er->nLvl = pSeg-
22c40 3e 6e 48 65 69 67 68 74 2d 31 3b 0a 20 20 20 20  >nHeight-1;.    
22c50 70 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a 20 20  pIter->p = p;.  
22c60 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
22c70 70 53 65 67 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  pSeg;.  }.  for(
22c80 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
22c90 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72  TE_OK && i<pIter
22ca0 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nLvl; i++){.  
22cb0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
22cc0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
22cd0 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  D(pSeg->iSegid, 
22ce0 69 2b 31 2c 20 31 29 3b 0a 20 20 20 20 46 74 73  i+1, 1);.    Fts
22cf0 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20  5Data *pData;.  
22d00 20 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d    pIter->aLvl[i]
22d10 2e 70 44 61 74 61 20 3d 20 70 44 61 74 61 20 3d  .pData = pData =
22d20 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
22d30 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66   iRowid);.    if
22d40 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( pData ){.     
22d50 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69   fts5NodeIterIni
22d60 74 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74  t(pData->p, pDat
22d70 61 2d 3e 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c  a->n, &pIter->aL
22d80 76 6c 5b 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a  vl[i].s);.    }.
22d90 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72    }..  if( pIter
22da0 2d 3e 6e 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e  ->nLvl==0 || p->
22db0 72 63 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  rc ){.    pIter-
22dc0 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70  >bEof = 1;.    p
22dd0 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53  Iter->iLeaf = pS
22de0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20  eg->pgnoLast;.  
22df0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
22e00 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72  ->nEmpty = pIter
22e10 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70  ->aLvl[0].s.nEmp
22e20 74 79 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ty;.    pIter->i
22e30 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c  Leaf = pIter->aL
22e40 76 6c 5b 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a  vl[0].s.iChild;.
22e50 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64      pIter->bDlid
22e60 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  x = pIter->aLvl[
22e70 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d  0].s.bDlidx;.  }
22e80 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
22e90 66 74 73 35 42 74 72 65 65 49 74 65 72 4e 65 78  fts5BtreeIterNex
22ea0 74 28 46 74 73 35 42 74 72 65 65 49 74 65 72 20  t(Fts5BtreeIter 
22eb0 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49  *pIter){.  Fts5I
22ec0 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d  ndex *p = pIter-
22ed0 3e 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  >p;.  int i;..  
22ee0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62  assert( pIter->b
22ef0 45 6f 66 3d 3d 30 20 26 26 20 70 49 74 65 72 2d  Eof==0 && pIter-
22f00 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61  >aLvl[0].s.aData
22f10 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
22f20 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20  <pIter->nLvl && 
22f30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
22f40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
22f50 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a  BtreeIterLevel *
22f60 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
22f70 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35  Lvl[i];.    fts5
22f80 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
22f90 3e 72 63 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a  >rc, &pLvl->s);.
22fa0 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e      if( pLvl->s.
22fb0 61 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66  aData ){.      f
22fc0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
22fd0 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
22fe0 6d 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e  m, pLvl->s.term.
22ff0 6e 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e  n, pLvl->s.term.
23000 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  p);.      break;
23010 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23020 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72    fts5NodeIterFr
23030 65 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20  ee(&pLvl->s);.  
23040 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
23050 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
23060 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
23070 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ata = 0;.    }. 
23080 20 7d 0a 20 20 69 66 28 20 69 3d 3d 70 49 74 65   }.  if( i==pIte
23090 72 2d 3e 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63  r->nLvl || p->rc
230a0 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62   ){.    pIter->b
230b0 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Eof = 1;.  }else
230c0 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64  {.    int iSegid
230d0 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e   = pIter->pSeg->
230e0 69 53 65 67 69 64 3b 0a 20 20 20 20 66 6f 72 28  iSegid;.    for(
230f0 69 2d 2d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  i--; i>=0; i--){
23100 0a 20 20 20 20 20 20 46 74 73 35 42 74 72 65 65  .      Fts5Btree
23110 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  IterLevel *pLvl 
23120 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  = &pIter->aLvl[i
23130 5d 3b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ];.      i64 iRo
23140 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
23150 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
23160 20 69 2b 31 2c 20 70 4c 76 6c 5b 31 5d 2e 73 2e   i+1, pLvl[1].s.
23170 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 70  iChild);.      p
23180 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
23190 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f  5DataRead(p, iRo
231a0 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
231b0 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20  pLvl->pData ){. 
231c0 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49         fts5NodeI
231d0 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d 3e 70 44  terInit(pLvl->pD
231e0 61 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e 70 44  ata->p, pLvl->pD
231f0 61 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d 3e 73  ata->n, &pLvl->s
23200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
23210 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 6e  .  }..  pIter->n
23220 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61  Empty = pIter->a
23230 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b  Lvl[0].s.nEmpty;
23240 0a 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78  .  pIter->bDlidx
23250 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30   = pIter->aLvl[0
23260 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 70 49  ].s.bDlidx;.  pI
23270 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74  ter->iLeaf = pIt
23280 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43  er->aLvl[0].s.iC
23290 68 69 6c 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  hild;.}..static 
232a0 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74  void fts5BtreeIt
232b0 65 72 46 72 65 65 28 46 74 73 35 42 74 72 65 65  erFree(Fts5Btree
232c0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
232d0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
232e0 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
232f0 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42   i++){.    Fts5B
23300 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70  treeIterLevel *p
23310 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
23320 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e  vl[i];.    fts5N
23330 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76  odeIterFree(&pLv
23340 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70  l->s);.    if( p
23350 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20  Lvl->pData ){.  
23360 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
23370 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
23380 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
23390 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ata = 0;.    }. 
233a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
233b0 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a  e(pIter->aLvl);.
233c0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
233d0 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
233e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
233f0 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79  nction is purely
23400 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
23410 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
23420 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
23430 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
23440 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
23450 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
23460 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
23470 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74  ** Instead, it t
23480 65 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61  ests that the sa
23490 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72  me set of pgno/r
234a0 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  owid combination
234b0 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65  s are .** visite
234c0 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  d regardless of 
234d0 77 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c  whether the docl
234e0 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69  ist-index identi
234f0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
23500 72 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65  rs.** iSegid/iLe
23510 61 66 20 69 73 20 69 74 65 72 61 74 65 64 20 69  af is iterated i
23520 6e 20 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65  n forwards or re
23530 76 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a  verse order..*/.
23540 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
23550 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20  BUG.static void 
23560 66 74 73 35 44 6c 69 64 78 49 74 65 72 54 65 73  fts5DlidxIterTes
23570 74 52 65 76 65 72 73 65 28 0a 20 20 46 74 73 35  tReverse(.  Fts5
23580 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74  Index *p, .  int
23590 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20   iSegid,        
235a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
235b0 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f  Segment id to lo
235c0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
235d0 20 69 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   iLeaf          
235e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
235f0 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64  Load doclist-ind
23600 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  ex for this leaf
23610 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69   */.){.  Fts5Dli
23620 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
23630 20 30 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d 31   0;.  i64 cksum1
23640 20 3d 20 31 33 3b 0a 20 20 69 36 34 20 63 6b 73   = 13;.  i64 cks
23650 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72  um2 = 13;..  for
23660 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
23670 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20  xIterInit(p, 0, 
23680 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a  iSegid, iLeaf);.
23690 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
236a0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
236b0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
236c0 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 44  DlidxIterNext(pD
236d0 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 61  lidx).  ){.    a
236e0 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 69  ssert( pDlidx->i
236f0 4c 65 61 66 50 67 6e 6f 3e 69 4c 65 61 66 20 29  LeafPgno>iLeaf )
23700 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 3d 20 28  ;.    cksum1 = (
23710 63 6b 73 75 6d 31 20 5e 20 28 20 28 69 36 34 29  cksum1 ^ ( (i64)
23720 28 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67  (pDlidx->iLeafPg
23730 6e 6f 29 20 3c 3c 20 33 32 20 29 29 3b 0a 20 20  no) << 32 ));.  
23740 20 20 63 6b 73 75 6d 31 20 3d 20 28 63 6b 73 75    cksum1 = (cksu
23750 6d 31 20 5e 20 70 44 6c 69 64 78 2d 3e 69 52 6f  m1 ^ pDlidx->iRo
23760 77 69 64 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  wid);.  }.  fts5
23770 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44  DlidxIterFree(pD
23780 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20  lidx);.  pDlidx 
23790 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69  = 0;..  for(pDli
237a0 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
237b0 49 6e 69 74 28 70 2c 20 31 2c 20 69 53 65 67 69  Init(p, 1, iSegi
237c0 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20  d, iLeaf);.     
237d0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
237e0 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b  f(p, pDlidx)==0;
237f0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
23800 49 74 65 72 50 72 65 76 28 70 44 6c 69 64 78 29  IterPrev(pDlidx)
23810 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
23820 28 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50  ( pDlidx->iLeafP
23830 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20  gno>iLeaf );.   
23840 20 63 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d   cksum2 = (cksum
23850 32 20 5e 20 28 20 28 69 36 34 29 28 70 44 6c 69  2 ^ ( (i64)(pDli
23860 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c  dx->iLeafPgno) <
23870 3c 20 33 32 20 29 29 3b 0a 20 20 20 20 63 6b 73  < 32 ));.    cks
23880 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20  um2 = (cksum2 ^ 
23890 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b  pDlidx->iRowid);
238a0 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78  .  }.  fts5Dlidx
238b0 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
238c0 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a  ;.  pDlidx = 0;.
238d0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
238e0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d  LITE_OK && cksum
238f0 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  1!=cksum2 ) p->r
23900 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
23910 3b 20 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  ; .}.#else.# def
23920 69 6e 65 20 66 74 73 35 44 6c 69 64 78 49 74 65  ine fts5DlidxIte
23930 72 54 65 73 74 52 65 76 65 72 73 65 28 78 2c 79  rTestReverse(x,y
23940 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  ,z).#endif..stat
23950 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
23960 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
23970 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e  egment(.  Fts5In
23980 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
23990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
239a0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
239b0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
239c0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
239d0 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
239e0 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e   to check intern
239f0 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a  al consistency *
23a00 2f 0a 29 7b 0a 20 20 46 74 73 35 42 74 72 65 65  /.){.  Fts5Btree
23a10 49 74 65 72 20 69 74 65 72 3b 20 20 20 20 20 20  Iter iter;      
23a20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
23a30 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
23a40 68 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  h b-tree hierarc
23a50 68 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70 53 65  hy */..  if( pSe
23a60 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
23a70 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
23a80 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
23a90 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
23aa0 72 63 68 79 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  rchy.  */.  for(
23ab0 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69  fts5BtreeIterIni
23ac0 74 28 70 2c 20 70 53 65 67 2c 20 26 69 74 65 72  t(p, pSeg, &iter
23ad0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 3d 3d  );.      p->rc==
23ae0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65  SQLITE_OK && ite
23af0 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20  r.bEof==0;.     
23b00 20 66 74 73 35 42 74 72 65 65 49 74 65 72 4e 65   fts5BtreeIterNe
23b10 78 74 28 26 69 74 65 72 29 0a 20 20 29 7b 0a 20  xt(&iter).  ){. 
23b20 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20     i64 iRow;    
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68   /* Rowid for th
23b50 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46  is leaf */.    F
23b60 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20  ts5Data *pLeaf; 
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b80 44 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65  Data for this le
23b90 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  af */.    int iO
23ba0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
23bb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
23bc0 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20  t of first term 
23bd0 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69  on leaf */.    i
23be0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c00 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
23c10 74 68 72 6f 75 67 68 20 65 6d 70 74 79 20 6c 65  through empty le
23c20 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  aves */..    /* 
23c30 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71  If the leaf in q
23c40 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  uestion has alre
23c50 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64  ady been trimmed
23c60 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e   from the segmen
23c70 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72  t, .    ** ignor
23c80 65 20 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e  e this b-tree en
23c90 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  try. Otherwise, 
23ca0 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d  load it into mem
23cb0 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ory. */.    if( 
23cc0 69 74 65 72 2e 69 4c 65 61 66 3c 70 53 65 67 2d  iter.iLeaf<pSeg-
23cd0 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e  >pgnoFirst ) con
23ce0 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77 20  tinue;.    iRow 
23cf0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
23d00 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69  OWID(pSeg->iSegi
23d10 64 2c 20 30 2c 20 69 74 65 72 2e 69 4c 65 61 66  d, 0, iter.iLeaf
23d20 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
23d30 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
23d40 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Row);.    if( pL
23d50 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
23d60 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
23d70 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74  at the leaf cont
23d80 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
23d90 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74  e term, and that
23da0 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20   it is equal.   
23db0 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72   ** to or larger
23dc0 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d   than the split-
23dd0 6b 65 79 20 69 6e 20 69 74 65 72 2e 74 65 72 6d  key in iter.term
23de0 2e 20 20 2a 2f 0a 20 20 20 20 69 4f 66 66 20 3d  .  */.    iOff =
23df0 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
23e00 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 69  af->p[2]);.    i
23e10 66 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  f( iOff==0 ){.  
23e20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
23e30 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
23e40 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
23e50 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
23e60 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
23e70 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69  f term on leaf i
23e80 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
23e90 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23eb0 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65  Comparison of te
23ec0 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79  rm and split-key
23ed0 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b   */.      iOff +
23ee0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
23ef0 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
23f00 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  ], nTerm);.     
23f10 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70   res = memcmp(&p
23f20 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 69  Leaf->p[iOff], i
23f30 74 65 72 2e 74 65 72 6d 2e 70 2c 20 4d 49 4e 28  ter.term.p, MIN(
23f40 6e 54 65 72 6d 2c 20 69 74 65 72 2e 74 65 72 6d  nTerm, iter.term
23f50 2e 6e 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  .n));.      if( 
23f60 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e  res==0 ) res = n
23f70 54 65 72 6d 20 2d 20 69 74 65 72 2e 74 65 72 6d  Term - iter.term
23f80 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  .n;.      if( re
23f90 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  s<0 ){.        p
23fa0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
23fb0 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
23fc0 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52   }.    fts5DataR
23fd0 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
23fe0 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62     if( p->rc ) b
23ff0 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  reak;..    /* No
24000 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
24010 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61   iter.nEmpty lea
24020 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ves following th
24030 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20  e current leaf. 
24040 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20     ** (a) exist 
24050 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
24060 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20  no terms. */.   
24070 20 66 6f 72 28 69 3d 31 3b 20 70 2d 3e 72 63 3d   for(i=1; p->rc=
24080 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
24090 3d 69 74 65 72 2e 6e 45 6d 70 74 79 3b 20 69 2b  =iter.nEmpty; i+
240a0 2b 29 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 20  +){.      pLeaf 
240b0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
240c0 2c 20 69 52 6f 77 2b 69 29 3b 0a 20 20 20 20 20  , iRow+i);.     
240d0 20 69 66 28 20 70 4c 65 61 66 20 26 26 20 30 21   if( pLeaf && 0!
240e0 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65  =fts5GetU16(&pLe
240f0 61 66 2d 3e 70 5b 32 5d 29 20 29 7b 0a 20 20 20  af->p[2]) ){.   
24100 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
24110 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
24120 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44 61 74   }.      fts5Dat
24130 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
24140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
24150 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
24160 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63 68 65 63  list-index, chec
24170 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  k that it looks 
24180 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66  right. */.    if
24190 28 20 69 74 65 72 2e 62 44 6c 69 64 78 20 29 7b  ( iter.bDlidx ){
241a0 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
241b0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
241c0 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74  ;  /* For iterat
241d0 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63 6c  ing through docl
241e0 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist index */.   
241f0 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61 66     int iPrevLeaf
24200 20 3d 20 69 74 65 72 2e 69 4c 65 61 66 3b 0a 20   = iter.iLeaf;. 
24210 20 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20       int iSegid 
24220 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  = pSeg->iSegid;.
24230 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 20        int iPg;. 
24240 20 20 20 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a       i64 iKey;..
24250 20 20 20 20 20 20 66 6f 72 28 70 44 6c 69 64 78        for(pDlidx
24260 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  =fts5DlidxIterIn
24270 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c  it(p, 0, iSegid,
24280 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20   iter.iLeaf);.  
24290 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
242a0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
242b0 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  dx)==0;.        
242c0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
242d0 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 20 20  ext(pDlidx).    
242e0 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    ){..        /*
242f0 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64   Check any rowid
24300 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74  -less pages that
24310 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
24320 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
24330 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
24340 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20  Pg=iPrevLeaf+1; 
24350 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65 61  iPg<pDlidx->iLea
24360 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a 20  fPgno; iPg++){. 
24370 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20           iKey = 
24380 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
24390 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20 69 50  ID(iSegid, 0, iP
243a0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  g);.          pL
243b0 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
243c0 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
243d0 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
243e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
243f0 69 66 28 20 66 74 73 35 47 65 74 55 31 36 28 26  if( fts5GetU16(&
24400 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20  pLeaf->p[0])!=0 
24410 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
24420 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
24430 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
24440 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
24450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24460 7d 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4c  }.        iPrevL
24470 65 61 66 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c  eaf = pDlidx->iL
24480 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 20 20 20 20  eafPgno;..      
24490 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
244a0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e  the leaf page in
244b0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
244c0 74 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64  terator really d
244d0 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  oes.        ** c
244e0 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64  ontain the rowid
244f0 20 73 75 67 67 65 73 74 65 64 20 62 79 20 74 68   suggested by th
24500 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  e same. */.     
24510 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53     iKey = FTS5_S
24520 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
24530 67 69 64 2c 20 30 2c 20 70 44 6c 69 64 78 2d 3e  gid, 0, pDlidx->
24540 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20  iLeafPgno);.    
24550 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
24560 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79  DataRead(p, iKey
24570 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
24580 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
24590 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
245a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
245b0 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  idOff = fts5GetU
245c0 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29  16(&pLeaf->p[0])
245d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 56  ;.          getV
245e0 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b  arint(&pLeaf->p[
245f0 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34  iRowidOff], (u64
24600 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  *)&iRowid);.    
24610 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
24620 21 3d 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64  !=pDlidx->iRowid
24630 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
24640 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
24650 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
24660 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
24670 20 20 20 7d 0a 0a 20 20 20 20 20 20 7d 0a 0a 20     }..      }.. 
24680 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72       for(iPg=iPr
24690 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28  evLeaf+1; iPg<=(
246a0 69 74 65 72 2e 69 4c 65 61 66 20 2b 20 69 74 65  iter.iLeaf + ite
246b0 72 2e 6e 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b  r.nEmpty); iPg++
246c0 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  ){.        iKey 
246d0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
246e0 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20  OWID(iSegid, 0, 
246f0 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  iPg);.        pL
24700 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
24710 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
24720 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
24730 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
24740 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61  fts5GetU16(&pLea
24750 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d  f->p[0])!=0 ) p-
24760 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
24770 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  PT;.          ft
24780 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
24790 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eaf);.        }.
247a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
247b0 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
247c0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  (pDlidx);.      
247d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 54 65 73  fts5DlidxIterTes
247e0 74 52 65 76 65 72 73 65 28 70 2c 20 69 53 65 67  tReverse(p, iSeg
247f0 69 64 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b  id, iter.iLeaf);
24800 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
24810 20 45 69 74 68 65 72 20 69 74 65 72 2e 69 4c 65   Either iter.iLe
24820 61 66 20 6d 75 73 74 20 62 65 20 74 68 65 20 72  af must be the r
24830 69 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61  ightmost leaf-pa
24840 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  ge in the segmen
24850 74 2c 20 6f 72 20 0a 20 20 2a 2a 20 65 6c 73 65  t, or .  ** else
24860 20 74 68 65 20 73 65 67 6d 65 6e 74 20 68 61 73   the segment has
24870 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79   been completely
24880 20 65 6d 70 74 69 65 64 20 62 79 20 61 6e 20 6f   emptied by an o
24890 6e 67 6f 69 6e 67 20 6d 65 72 67 65 0a 20 20 2a  ngoing merge.  *
248a0 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a  * operation. */.
248b0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
248c0 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69 74  ITE_OK .   && it
248d0 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e  er.iLeaf!=pSeg->
248e0 70 67 6e 6f 4c 61 73 74 20 0a 20 20 20 26 26 20  pgnoLast .   && 
248f0 28 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  (pSeg->pgnoFirst
24900 20 7c 7c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61   || pSeg->pgnoLa
24910 73 74 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  st) .  ){.    p-
24920 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
24930 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42  PT;.  }..  fts5B
24940 74 72 65 65 49 74 65 72 46 72 65 65 28 26 69 74  treeIterFree(&it
24950 65 72 29 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  er);.}...static 
24960 69 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b 73  int fts5QueryCks
24970 75 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  um(.  Fts5Index 
24980 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
24990 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69 6e        /* Fts5 in
249a0 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
249b0 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73  int iIdx,.  cons
249c0 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20  t char *z,      
249d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
249e0 6e 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65 72  ndex key to quer
249f0 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  y for */.  int n
24a00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
24a20 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 20  ze of index key 
24a30 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
24a40 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24a60 20 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35 49   Flags for Fts5I
24a70 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20 75  ndexQuery */.  u
24a80 36 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20 20  64 *pCksum      
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24aa0 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73  * IN/OUT: Checks
24ab0 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  um value */.){. 
24ac0 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43   u64 cksum = *pC
24ad0 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65  ksum;.  Fts5Inde
24ae0 78 49 74 65 72 20 2a 70 49 64 78 49 74 65 72 20  xIter *pIdxIter 
24af0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
24b00 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
24b10 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66  Query(p, z, n, f
24b20 6c 61 67 73 2c 20 26 70 49 64 78 49 74 65 72 29  lags, &pIdxIter)
24b30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  ;..  while( rc==
24b40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
24b50 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
24b60 6f 66 28 70 49 64 78 49 74 65 72 29 20 29 7b 0a  of(pIdxIter) ){.
24b70 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50      const u8 *pP
24b80 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73  os;.    int nPos
24b90 3b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20  ;.    i64 rowid 
24ba0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
24bb0 72 52 6f 77 69 64 28 70 49 64 78 49 74 65 72 29  rRowid(pIdxIter)
24bc0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
24bd0 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73  e3Fts5IterPoslis
24be0 74 28 70 49 64 78 49 74 65 72 2c 20 26 70 50 6f  t(pIdxIter, &pPo
24bf0 73 2c 20 26 6e 50 6f 73 29 3b 0a 20 20 20 20 69  s, &nPos);.    i
24c00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24c10 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f   ){.      Fts5Po
24c20 73 6c 69 73 74 52 65 61 64 65 72 20 73 52 65 61  slistReader sRea
24c30 64 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 73  der;.      for(s
24c40 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
24c50 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31 2c 20  tReaderInit(-1, 
24c60 70 50 6f 73 2c 20 6e 50 6f 73 2c 20 26 73 52 65  pPos, nPos, &sRe
24c70 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ader);.         
24c80 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d 3d 30   sReader.bEof==0
24c90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
24ca0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
24cb0 61 64 65 72 4e 65 78 74 28 26 73 52 65 61 64 65  aderNext(&sReade
24cc0 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  r).      ){.    
24cd0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46      int iCol = F
24ce0 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73  TS5_POS2COLUMN(s
24cf0 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20  Reader.iPos);.  
24d00 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
24d10 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
24d20 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a  (sReader.iPos);.
24d30 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d          cksum ^=
24d40 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
24d50 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69 43 6f 6c  ksum(rowid, iCol
24d60 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c 20 7a 2c  , iOff, iIdx, z,
24d70 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
24d80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
24d90 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 64 78  ts5IterNext(pIdx
24da0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Iter);.    }.  }
24db0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  .  sqlite3Fts5It
24dc0 65 72 43 6c 6f 73 65 28 70 49 64 78 49 74 65 72  erClose(pIdxIter
24dd0 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20  );..  *pCksum = 
24de0 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20  cksum;.  return 
24df0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  rc;.}../*.** Run
24e00 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
24e10 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
24e20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 61  the FTS index (a
24e30 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ) is internally 
24e40 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61  .** consistent a
24e50 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20  nd (b) contains 
24e60 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69 63  entries for whic
24e70 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65  h the XOR of the
24e80 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73   checksums.** as
24e90 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 66   calculated by f
24ea0 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
24eb0 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a  um() is cksum..*
24ec0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
24ed0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
24ee0 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  y of the interna
24ef0 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f  l checks fail, o
24f00 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63  r if the.** chec
24f10 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ksum does not ma
24f20 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  tch. Return SQLI
24f30 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65  TE_OK if all che
24f40 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74  cks pass without
24f50 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f  .** error, or so
24f60 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
24f70 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
24f80 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67  other error (e.g
24f90 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73  . OOM).** occurs
24fa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24fb0 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
24fc0 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
24fd0 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29  x *p, u64 cksum)
24fe0 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  {.  u64 cksum2 =
24ff0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
25000 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
25010 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
25020 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
25030 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30    u64 cksum3 = 0
25040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25050 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
25060 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20  sed on contents 
25070 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  of indexes */.  
25080 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 20  Fts5Buffer term 
25090 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20  = {0,0,0};      
250a0 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
250b0 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65  o hold most rece
250c0 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73  nt term */.  Fts
250d0 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20  5Buffer poslist 
250e0 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20  = {0,0,0};   /* 
250f0 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68  Buffer used to h
25100 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f  old a poslist */
25110 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
25120 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20  ter *pIter;     
25130 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
25140 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e  erate through en
25150 74 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  tire index */.  
25160 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
25170 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20 20  Struct;         
25180 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
25190 72 65 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 4c 6f  re */.  .  /* Lo
251a0 61 64 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  ad the FTS index
251b0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
251c0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
251d0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
251e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
251f0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
25200 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d  des of each segm
25210 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65  ent match the le
25220 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53  aves */.  if( pS
25230 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74  truct ){.    int
25240 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
25250 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
25260 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
25270 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
25280 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
25290 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
252a0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
252b0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
252c0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
252d0 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53  ment *pSeg = &pS
252e0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
252f0 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
25300 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65          fts5Inde
25310 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
25320 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b  egment(p, pSeg);
25330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25340 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73   }..  /* The cks
25350 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  um argument pass
25360 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
25370 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75  ion is a checksu
25380 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a  m calculated.  *
25390 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65  * based on all e
253a0 78 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20  xpected entries 
253b0 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  in the FTS index
253c0 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66   (including pref
253d0 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e  ix index.  ** en
253e0 74 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f  tries). This blo
253f0 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61  ck checks that a
25400 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c   checksum calcul
25410 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
25420 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f  e.  ** actual co
25430 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e  ntents of FTS in
25440 64 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c  dex is identical
25450 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20  ..  **.  ** Two 
25460 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
25470 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72  same checksum ar
25480 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68  e calculated. Th
25490 65 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20  e first (stack. 
254a0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73   ** variable cks
254b0 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e  um2) based on en
254c0 74 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20  tries extracted 
254d0 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65  from the full-te
254e0 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68  xt index.  ** wh
254f0 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65  ile doing a line
25500 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20  ar scan of each 
25510 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78  individual index
25520 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a   in turn. .  **.
25530 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72    ** As each ter
25540 6d 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  m visited by the
25550 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61   linear scans, a
25560 20 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20   separate query 
25570 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
25580 65 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72  e term is perfor
25590 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63  med. cksum3 is c
255a0 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20  alculated based 
255b0 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20  on the entries. 
255c0 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79   ** extracted by
255d0 20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a   these queries..
255e0 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d    */.  for(fts5M
255f0 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
25600 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c  Struct, 0, 0, 0,
25610 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74 65   0, -1, 0, &pIte
25620 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
25630 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
25640 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
25650 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
25660 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
25670 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  .  ){.    int n;
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
256a0 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a   term in bytes *
256b0 2f 0a 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d  /.    i64 iPos =
256c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
256d0 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 72 65    /* Position re
256e0 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20  ad from poslist 
256f0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  */.    int iOff 
25700 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
25710 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 77 69 74     /* Offset wit
25720 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20  hin poslist */. 
25730 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
25740 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
25750 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 63  id(pIter);.    c
25760 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29  har *z = (char*)
25770 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
25780 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20  m(pIter, &n);.. 
25790 20 20 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30     poslist.n = 0
257a0 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
257b0 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 49  terPoslist(p, pI
257c0 74 65 72 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74  ter, 0, &poslist
257d0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 30 3d  );.    while( 0=
257e0 3d 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c  =sqlite3Fts5Posl
257f0 69 73 74 4e 65 78 74 36 34 28 70 6f 73 6c 69 73  istNext64(poslis
25800 74 2e 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20  t.p, poslist.n, 
25810 26 69 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b  &iOff, &iPos) ){
25820 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
25830 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  = FTS5_POS2COLUM
25840 4e 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 69  N(iPos);.      i
25850 6e 74 20 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53  nt iTokOff = FTS
25860 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f  5_POS2OFFSET(iPo
25870 73 29 3b 0a 20 20 20 20 20 20 63 6b 73 75 6d 32  s);.      cksum2
25880 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74   ^= fts5IndexEnt
25890 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
258a0 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d  iCol, iTokOff, -
258b0 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  1, z, n);.    }.
258c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
258d0 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20 71  is a new term, q
258e0 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70 64  uery for it. Upd
258f0 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68 20  ate cksum3 with 
25900 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a  the results. */.
25910 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
25920 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 74 65 72  QLITE_OK && (ter
25930 6d 2e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70  m.n!=n || memcmp
25940 28 74 65 72 6d 2e 70 2c 20 7a 2c 20 6e 29 29 20  (term.p, z, n)) 
25950 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
25960 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 26 7a 5b  har *zTerm = &z[
25970 31 5d 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 74  1];     /* The t
25980 65 72 6d 20 77 69 74 68 6f 75 74 20 74 68 65 20  erm without the 
25990 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20  prefix-byte */. 
259a0 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d       int nTerm =
259b0 20 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20   n-1;           
259c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
259d0 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
259e0 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
259f0 3d 20 28 7a 5b 30 5d 20 2d 20 46 54 53 35 5f 4d  = (z[0] - FTS5_M
25a00 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a 20 20 20  AIN_PREFIX);.   
25a10 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
25a20 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54  iIdx==0 ? 0 : FT
25a30 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52  S5INDEX_QUERY_PR
25a40 45 46 49 58 29 3b 0a 20 20 20 20 20 20 69 6e 74  EFIX);.      int
25a50 20 72 63 3b 0a 20 20 20 20 20 20 75 36 34 20 63   rc;.      u64 c
25a60 6b 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 36  k1 = 0;.      u6
25a70 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20  4 ck2 = 0;..    
25a80 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
25a90 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75  the results retu
25aa0 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64  rned for ASC and
25ab0 20 44 45 53 43 20 71 75 65 72 69 65 73 20 61 72   DESC queries ar
25ac0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  e.      ** the s
25ad0 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c  ame. If not, cal
25ae0 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f  l this corruptio
25af0 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  n.  */.      rc 
25b00 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
25b10 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
25b20 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26   nTerm, flags, &
25b30 63 6b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck1);.      if( 
25b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25b50 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d  .        int f =
25b60 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58   flags|FTS5INDEX
25b70 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20  _QUERY_DESC;.   
25b80 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75       rc = fts5Qu
25b90 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
25ba0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
25bb0 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20  f, &ck2);.      
25bc0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
25bd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
25be0 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
25bf0 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
25c00 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
25c10 61 20 70 72 65 66 69 78 20 71 75 65 72 79 2c 20  a prefix query, 
25c20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72  check that the r
25c30 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20  esults returned 
25c40 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
25c50 74 68 65 20 69 6e 64 65 78 20 69 73 20 64 69 73  the index is dis
25c60 61 62 6c 65 64 20 61 72 65 20 74 68 65 20 73 61  abled are the sa
25c70 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20  me. In both ASC 
25c80 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20  and DESC order. 
25c90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 49 64  */.      if( iId
25ca0 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  x>0 && rc==SQLIT
25cb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25cc0 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54  int f = flags|FT
25cd0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
25ce0 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20 20 20 20  ST_NOIDX;.      
25cf0 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20    ck2 = 0;.     
25d00 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
25d10 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
25d20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c  zTerm, nTerm, f,
25d30 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20   &ck2);.        
25d40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25d50 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
25d60 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
25d70 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
25d80 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72   if( iIdx>0 && r
25d90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25da0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
25db0 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
25dc0 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
25dd0 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
25de0 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 20 20 63  _DESC;.        c
25df0 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  k2 = 0;.        
25e00 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
25e10 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
25e20 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
25e30 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  k2);.        if(
25e40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25e50 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
25e60 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
25e70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
25e80 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20  ksum3 ^= ck1;.  
25e90 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
25ea0 74 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 2c  t(&rc, &term, n,
25eb0 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a   (const u8*)z);.
25ec0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
25ed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74  ;.    }.  }.  ft
25ee0 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
25ef0 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66  p, pIter);..  if
25f00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
25f10 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73  OK && cksum!=cks
25f20 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  um2 ) p->rc = FT
25f30 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 69 66  S5_CORRUPT;.  if
25f40 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
25f50 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73  OK && cksum!=cks
25f60 75 6d 33 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  um3 ) p->rc = FT
25f70 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66  S5_CORRUPT;..  f
25f80 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
25f90 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
25fa0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
25fb0 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66  term);.  fts5Buf
25fc0 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74  ferFree(&poslist
25fd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
25fe0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
25ff0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c  }.../*.** Calcul
26000 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
26010 20 63 68 65 63 6b 73 75 6d 20 74 68 61 74 20 69   checksum that i
26020 73 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65  s the XOR of the
26030 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
26040 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20  checksum of all 
26050 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 6f 75  entries that wou
26060 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ld be generated 
26070 62 79 20 74 68 65 20 74 6f 6b 65 6e 20 73 70 65  by the token spe
26080 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65  cified.** by the
26090 20 66 69 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e   final 5 argumen
260a0 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  ts..*/.u64 sqlit
260b0 65 33 46 74 73 35 49 6e 64 65 78 43 6b 73 75 6d  e3Fts5IndexCksum
260c0 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  (.  Fts5Config *
260d0 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20  pConfig,        
260e0 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61      /* Configura
260f0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
26100 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20   i64 iRowid,    
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26120 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20 74 65 72   /* Document ter
26130 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a  m appears in */.
26140 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d    /* Column term
26170 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20   appears in */. 
26180 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20   int iPos,      
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261a0 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 74 65 72   /* Position ter
261b0 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a  m appears in */.
261c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
261d0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20  erm, int nTerm  
261e0 20 20 2f 2a 20 54 65 72 6d 20 61 74 20 69 50 6f    /* Term at iPo
261f0 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65  s */.){.  u64 re
26200 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
26210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
26220 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  urn value */.  i
26230 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20  nt iIdx;        
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26250 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20  * For iterating 
26260 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20  through indexes 
26270 2a 2f 0a 0a 20 20 72 65 74 20 3d 20 66 74 73 35  */..  ret = fts5
26280 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
26290 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  iRowid, iCol, iP
262a0 6f 73 2c 20 30 2c 20 70 54 65 72 6d 2c 20 6e 54  os, 0, pTerm, nT
262b0 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 49 64  erm);..  for(iId
262c0 78 3d 30 3b 20 69 49 64 78 3c 70 43 6f 6e 66 69  x=0; iIdx<pConfi
262d0 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78  g->nPrefix; iIdx
262e0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  ++){.    int nBy
262f0 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68  te = fts5IndexCh
26300 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70  arlenToBytelen(p
26310 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 43 6f  Term, nTerm, pCo
26320 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49  nfig->aPrefix[iI
26330 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  dx]);.    if( nB
26340 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  yte ){.      ret
26350 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74   ^= fts5IndexEnt
26360 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
26370 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 69 49 64 78  iCol, iPos, iIdx
26380 2b 31 2c 20 70 54 65 72 6d 2c 20 6e 42 79 74 65  +1, pTerm, nByte
26390 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
263a0 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
263b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
263c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
263d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
263e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
263f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
26400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26440 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68  ****.** Below th
26450 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20  is point is the 
26460 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
26470 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
26480 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75  e() scalar.** fu
26490 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a  nction only..*/.
264a0 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
264b0 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77  segment-data row
264c0 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  id from the %_da
264d0 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  ta table. This f
264e0 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68  unction is.** th
264f0 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61  e opposite of ma
26500 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  cro FTS5_SEGMENT
26510 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61  _ROWID()..*/.sta
26520 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
26530 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20  odeRowid(.  i64 
26540 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
26550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26560 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61  owid from %_data
26570 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
26580 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  *piSegid,       
26590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
265a0 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a  UT: Segment id *
265b0 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68  /.  int *piHeigh
265c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
265d0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67      /* OUT: Heig
265e0 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50  ht */.  int *piP
265f0 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  gno             
26600 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26610 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  Page number */.)
26620 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69  {.  *piPgno = (i
26630 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
26640 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
26650 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29  TA_PAGE_B) - 1))
26660 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
26670 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b  TS5_DATA_PAGE_B;
26680 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20  ..  *piHeight = 
26690 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
266a0 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
266b0 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d  DATA_HEIGHT_B) -
266c0 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e   1));.  iRowid >
266d0 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  >= FTS5_DATA_HEI
266e0 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67  GHT_B;..  *piSeg
266f0 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  id = (int)(iRowi
26700 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
26710 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20  FTS5_DATA_ID_B) 
26720 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  - 1));.}..static
26730 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52   void fts5DebugR
26740 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46  owid(int *pRc, F
26750 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
26760 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e   i64 iKey){.  in
26770 74 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  t iSegid, iHeigh
26780 74 2c 20 69 50 67 6e 6f 3b 20 20 20 20 20 2f 2a  t, iPgno;     /*
26790 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74   Rowid compenent
267a0 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64  s */.  fts5Decod
267b0 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 53  eRowid(iKey, &iS
267c0 65 67 69 64 2c 20 26 69 48 65 69 67 68 74 2c 20  egid, &iHeight, 
267d0 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  &iPgno);..  if( 
267e0 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
267f0 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f   if( iKey==FTS5_
26800 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
26810 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
26820 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
26830 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
26840 20 22 28 61 76 65 72 61 67 65 73 29 20 22 29 3b   "(averages) ");
26850 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26860 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
26870 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
26880 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20  pRc, pBuf, .    
26890 20 20 20 20 20 20 22 7b 73 74 72 75 63 74 75 72        "{structur
268a0 65 20 69 64 78 3d 25 64 7d 22 2c 20 28 69 6e 74  e idx=%d}", (int
268b0 29 28 69 4b 65 79 2d 31 30 29 0a 20 20 20 20 20  )(iKey-10).     
268c0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
268d0 65 6c 73 65 20 69 66 28 20 69 48 65 69 67 68 74  else if( iHeight
268e0 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d  ==FTS5_SEGMENT_M
268f0 41 58 5f 48 45 49 47 48 54 20 29 7b 0a 20 20 20  AX_HEIGHT ){.   
26900 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
26910 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
26920 52 63 2c 20 70 42 75 66 2c 20 22 28 64 6c 69 64  Rc, pBuf, "(dlid
26930 78 20 73 65 67 69 64 3d 25 64 20 70 67 6e 6f 3d  x segid=%d pgno=
26940 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 69 53  %d)",.        iS
26950 65 67 69 64 2c 20 69 50 67 6e 6f 0a 20 20 20 20  egid, iPgno.    
26960 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26970 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
26980 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
26990 63 2c 20 70 42 75 66 2c 20 22 28 73 65 67 69 64  c, pBuf, "(segid
269a0 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64  =%d h=%d pgno=%d
269b0 29 22 2c 0a 20 20 20 20 20 20 20 20 69 53 65 67  )",.        iSeg
269c0 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67  id, iHeight, iPg
269d0 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  no.    );.  }.}.
269e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
269f0 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
26a00 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
26a30 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
26a40 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
26a50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
26a60 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c  *p.){.  int iLvl
26a70 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  , iSeg;         
26a80 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
26a90 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
26aa0 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a  s, segments */..
26ab0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
26ac0 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  vl<p->nLevel; iL
26ad0 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53  vl++){.    Fts5S
26ae0 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
26af0 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c  Lvl = &p->aLevel
26b00 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69  [iLvl];.    sqli
26b10 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
26b20 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
26b30 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20  Buf, .        " 
26b40 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25  {lvl=%d nMerge=%
26b50 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e  d", iLvl, pLvl->
26b60 6e 4d 65 72 67 65 0a 20 20 20 20 29 3b 0a 20 20  nMerge.    );.  
26b70 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
26b80 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
26b90 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Seg++){.      Ft
26ba0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
26bb0 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
26bc0 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
26bd0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
26be0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
26bf0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20  f(pRc, pBuf, .  
26c00 20 20 20 20 20 20 20 20 22 20 7b 69 64 3d 25 64          " {id=%d
26c10 20 68 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e   h=%d leaves=%d.
26c20 2e 25 64 7d 22 2c 20 70 53 65 67 2d 3e 69 53 65  .%d}", pSeg->iSe
26c30 67 69 64 2c 20 70 53 65 67 2d 3e 6e 48 65 69 67  gid, pSeg->nHeig
26c40 68 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  ht, .          p
26c50 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20  Seg->pgnoFirst, 
26c60 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20  pSeg->pgnoLast. 
26c70 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
26c80 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
26c90 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
26ca0 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b  pRc, pBuf, "}");
26cb0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
26cc0 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
26cd0 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
26ce0 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
26cf0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
26d00 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
26d10 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20  in a serialized 
26d20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
26d30 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ject. This.** fu
26d40 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
26d50 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
26d60 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
26d70 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63  f the same objec
26d80 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66  t.** to the buff
26d90 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
26da0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
26db0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
26dc0 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75  d fts5DecodeStru
26dd0 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
26de0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26df0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
26e00 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
26e10 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
26e20 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
26e30 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
26e40 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ob.){.  int rc; 
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26e70 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
26e80 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30  Structure *p = 0
26e90 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
26ea0 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65  ecoded structure
26eb0 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63   object */..  rc
26ec0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
26ed0 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42  Decode(pBlob, nB
26ee0 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69  lob, 0, &p);.  i
26ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26f00 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
26f10 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
26f20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53   }..  fts5DebugS
26f30 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42  tructure(pRc, pB
26f40 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74  uf, p);.  fts5St
26f50 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
26f60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66  );.}../*.** Buff
26f70 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75  er (a/n) is assu
26f80 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  med to contain a
26f90 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69   list of seriali
26fa0 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61  zed varints. Rea
26fb0 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74  d.** each varint
26fc0 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20   and append its 
26fd0 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
26fe0 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20  ation to buffer 
26ff0 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  pBuf. Return.** 
27000 61 66 74 65 72 20 65 69 74 68 65 72 20 74 68 65  after either the
27010 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73   input buffer is
27020 20 65 78 68 61 75 73 74 65 64 20 6f 72 20 61 20   exhausted or a 
27030 30 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e  0 value is read.
27040 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
27050 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
27060 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
27070 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
27080 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
27090 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
270a0 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a  odePoslist(int *
270b0 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
270c0 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
270d0 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *a, int n){.  in
270e0 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68  t iOff = 0;.  wh
270f0 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
27100 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20     int iVal;.   
27110 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
27120 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
27130 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71  ], iVal);.    sq
27140 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
27150 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
27160 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56   pBuf, " %d", iV
27170 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  al);.  }.  retur
27180 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
27190 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75   The start of bu
271a0 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61  ffer (a/n) conta
271b0 69 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66  ins the start of
271c0 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20   a doclist. The 
271d0 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f  doclist.** may o
271e0 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68  r may not finish
271f0 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
27200 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
27210 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74  n appends a text
27220 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69  .** representati
27230 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f  on of the part o
27240 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68  f the doclist th
27250 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f  at is present to
27260 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e   buffer.** pBuf.
27270 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75   .**.** The retu
27280 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
27290 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
272a0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  read from the in
272b0 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73  put buffer..*/.s
272c0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65  tatic int fts5De
272d0 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20  codeDoclist(int 
272e0 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
272f0 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38   *pBuf, const u8
27300 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *a, int n){.  i
27310 36 34 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74  64 iDocid;.  int
27320 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 4f   iOff = 0;..  iO
27330 66 66 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ff = sqlite3GetV
27340 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
27350 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a  (u64*)&iDocid);.
27360 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
27370 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
27380 70 52 63 2c 20 70 42 75 66 2c 20 22 20 72 6f 77  pRc, pBuf, " row
27390 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64  id=%lld", iDocid
273a0 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66  );.  while( iOff
273b0 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50  <n ){.    int nP
273c0 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44 75 6d  os;.    int bDum
273d0 6d 79 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  my;.    iOff += 
273e0 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
273f0 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50  ze(&a[iOff], &nP
27400 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
27410 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65    iOff += fts5De
27420 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c  codePoslist(pRc,
27430 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c   pBuf, &a[iOff],
27440 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f   MIN(n-iOff, nPo
27450 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66  s));.    if( iOf
27460 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34  f<n ){.      i64
27470 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
27480 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Off += sqlite3Ge
27490 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
274a0 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
274b0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 65 6c  ;.      if( iDel
274c0 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  ta==0 ) return i
274d0 4f 66 66 3b 0a 20 20 20 20 20 20 69 44 6f 63 69  Off;.      iDoci
274e0 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
274f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
27500 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
27510 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 72 6f  (pRc, pBuf, " ro
27520 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69  wid=%lld", iDoci
27530 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
27540 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a   return iOff;.}.
27550 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
27560 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65  mentation of use
27570 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
27580 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64   function fts5_d
27590 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ecode()..*/.stat
275a0 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
275b0 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  deFunction(.  sq
275c0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
275d0 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
275e0 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
275f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
27600 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
27610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27620 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61  umber of args (a
27630 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71  lways 2) */.  sq
27640 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
27650 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
27660 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
27670 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  nts */.){.  i64 
27680 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
27690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
276a0 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20  owid for record 
276b0 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f  being decoded */
276c0 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48  .  int iSegid,iH
276d0 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20 20 20  eight,iPgno;    
276e0 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70     /* Rowid comp
276f0 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  onents */.  cons
27700 74 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74  t u8 *aBlob; int
27710 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   n;         /* R
27720 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20  ecord to decode 
27730 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a  */.  u8 *a = 0;.
27740 20 20 46 74 73 35 42 75 66 66 65 72 20 73 3b 20    Fts5Buffer s; 
27750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27760 20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65    /* Build up te
27770 78 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72  xt to return her
27780 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
27790 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
277a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
277b0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
277c0 53 70 61 63 65 20 3d 20 30 3b 0a 0a 20 20 61 73  Space = 0;..  as
277d0 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
277e0 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c  .  memset(&s, 0,
277f0 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
27800 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d  er));.  iRowid =
27810 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
27820 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  nt64(apVal[0]);.
27830 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
27840 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b  lue_bytes(apVal[
27850 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73  1]);.  aBlob = s
27860 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
27870 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 0a 20 20  b(apVal[1]);..  
27880 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46 54 53  nSpace = n + FTS
27890 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
278a0 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29  ING;.  a = (u8*)
278b0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
278c0 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63  cZero(&rc, nSpac
278d0 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29  e);.  if( a==0 )
278e0 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
278f0 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20 61 42  ;.  memcpy(a, aB
27900 6c 6f 62 2c 20 6e 29 3b 0a 20 20 66 74 73 35 44  lob, n);.  fts5D
27910 65 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69  ecodeRowid(iRowi
27920 64 2c 20 26 69 53 65 67 69 64 2c 20 26 69 48 65  d, &iSegid, &iHe
27930 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a  ight, &iPgno);..
27940 20 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64    fts5DebugRowid
27950 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64  (&rc, &s, iRowid
27960 29 3b 0a 20 20 69 66 28 20 69 48 65 69 67 68 74  );.  if( iHeight
27970 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d  ==FTS5_SEGMENT_M
27980 41 58 5f 48 45 49 47 48 54 20 29 7b 0a 20 20 20  AX_HEIGHT ){.   
27990 20 46 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b   Fts5Data dlidx;
279a0 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74  .    Fts5DlidxIt
279b0 65 72 20 69 74 65 72 3b 0a 0a 20 20 20 20 64 6c  er iter;..    dl
279c0 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64  idx.p = a;.    d
279d0 6c 69 64 78 2e 6e 20 3d 20 6e 3b 0a 20 20 20 20  lidx.n = n;.    
279e0 64 6c 69 64 78 2e 6e 52 65 66 20 3d 20 32 3b 0a  dlidx.nRef = 2;.
279f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 74 65  .    memset(&ite
27a00 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
27a10 35 44 6c 69 64 78 49 74 65 72 29 29 3b 0a 20 20  5DlidxIter));.  
27a20 20 20 69 74 65 72 2e 70 44 61 74 61 20 3d 20 26    iter.pData = &
27a30 64 6c 69 64 78 3b 0a 20 20 20 20 69 74 65 72 2e  dlidx;.    iter.
27a40 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e  iLeafPgno = iPgn
27a50 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35  o;..    for(fts5
27a60 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 26  DlidxIterFirst(&
27a70 69 74 65 72 29 3b 20 69 74 65 72 2e 62 45 6f 66  iter); iter.bEof
27a80 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 49 74  ==0; fts5DlidxIt
27a90 65 72 4e 65 78 74 28 26 69 74 65 72 29 29 7b 0a  erNext(&iter)){.
27aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
27ab0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
27ac0 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20  ntf(&rc, &s, .  
27ad0 20 20 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c          " %d(%ll
27ae0 64 29 22 2c 20 69 74 65 72 2e 69 4c 65 61 66 50  d)", iter.iLeafP
27af0 67 6e 6f 2c 20 69 74 65 72 2e 69 52 6f 77 69 64  gno, iter.iRowid
27b00 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
27b10 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53 65 67    }else if( iSeg
27b20 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  id==0 ){.    if(
27b30 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56   iRowid==FTS5_AV
27b40 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a  ERAGES_ROWID ){.
27b50 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f        /* todo */
27b60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27b70 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75    fts5DecodeStru
27b80 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61  cture(&rc, &s, a
27b90 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , n);.    }.  }e
27ba0 6c 73 65 7b 0a 0a 20 20 20 20 46 74 73 35 42 75  lse{..    Fts5Bu
27bb0 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 20 20 6d  ffer term;.    m
27bc0 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
27bd0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
27be0 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 48  r));..    if( iH
27bf0 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eight==0 ){.    
27c00 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d    int iTermOff =
27c10 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52   0;.      int iR
27c20 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20  owidOff = 0;.   
27c30 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
27c40 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
27c50 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 3d  ;..      if( n>=
27c60 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52 6f  4 ){.        iRo
27c70 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74  widOff = fts5Get
27c80 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20  U16(&a[0]);.    
27c90 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 66      iTermOff = f
27ca0 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29  ts5GetU16(&a[2])
27cb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27cc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
27cd0 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
27ce0 20 26 73 2c 20 38 2c 20 28 63 6f 6e 73 74 20 75   &s, 8, (const u
27cf0 38 2a 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20  8*)"corrupt");. 
27d00 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f         goto deco
27d10 64 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  de_out;.      }.
27d20 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69  .      if( iRowi
27d30 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  dOff ){.        
27d40 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66  iOff = iRowidOff
27d50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
27d60 28 20 69 54 65 72 6d 4f 66 66 20 29 7b 0a 20 20  ( iTermOff ){.  
27d70 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65        iOff = iTe
27d80 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  rmOff;.      }el
27d90 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  se{.        iOff
27da0 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = n;.      }.  
27db0 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f      fts5DecodePo
27dc0 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  slist(&rc, &s, &
27dd0 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a  a[4], iOff-4);..
27de0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 52        assert( iR
27df0 6f 77 69 64 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f  owidOff==0 || iO
27e00 66 66 3d 3d 69 52 6f 77 69 64 4f 66 66 20 29 3b  ff==iRowidOff );
27e10 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69  .      if( iRowi
27e20 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  dOff ){.        
27e30 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
27e40 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
27e50 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69  s, &a[iOff], n-i
27e60 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Off);.      }.. 
27e70 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65       assert( iTe
27e80 72 6d 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66  rmOff==0 || iOff
27e90 3d 3d 69 54 65 72 6d 4f 66 66 20 29 3b 0a 20 20  ==iTermOff );.  
27ea0 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c      while( iOff<
27eb0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  n ){.        int
27ec0 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
27ed0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
27ee0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
27ef0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
27f00 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65 65 70 3b    term.n= nKeep;
27f10 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
27f20 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72  ferAppendBlob(&r
27f30 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c  c, &term, nByte,
27f40 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20   &a[iOff]);.    
27f50 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74      iOff += nByt
27f60 65 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e;..        sqli
27f70 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
27f80 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20  endPrintf(.     
27f90 20 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20         &rc, &s, 
27fa0 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65  " term=%.*s", te
27fb0 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61  rm.n, (const cha
27fc0 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20  r*)term.p.      
27fd0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66    );.        iOf
27fe0 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44  f += fts5DecodeD
27ff0 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
28000 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66  &a[iOff], n-iOff
28010 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
28020 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
28030 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
28040 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
28050 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
28060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28070 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46       fts5BufferF
28080 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 20 20  ree(&term);.    
28090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73  }else{.      Fts
280a0 35 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20  5NodeIter ss;.  
280b0 20 20 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65      for(fts5Node
280c0 49 74 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26  IterInit(a, n, &
280d0 73 73 29 3b 20 73 73 2e 61 44 61 74 61 3b 20 66  ss); ss.aData; f
280e0 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
280f0 26 72 63 2c 20 26 73 73 29 29 7b 0a 20 20 20 20  &rc, &ss)){.    
28100 20 20 20 20 69 66 28 20 73 73 2e 74 65 72 6d 2e      if( ss.term.
28110 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
28120 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
28130 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
28140 26 72 63 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d  &rc, &s, " left=
28150 25 64 22 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b  %d", ss.iChild);
28160 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
28170 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28180 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
28190 64 50 72 69 6e 74 66 28 26 72 63 2c 26 73 2c 20  dPrintf(&rc,&s, 
281a0 22 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20  " \"%.*s\"", .  
281b0 20 20 20 20 20 20 20 20 20 20 20 20 73 73 2e 74              ss.t
281c0 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70  erm.n, ss.term.p
281d0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
281e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
281f0 69 66 28 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b  if( ss.nEmpty ){
28200 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
28210 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
28220 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73  ndPrintf(&rc, &s
28230 2c 20 22 20 65 6d 70 74 79 3d 25 64 25 73 22 2c  , " empty=%d%s",
28240 20 73 73 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20   ss.nEmpty,.    
28250 20 20 20 20 20 20 20 20 20 20 73 73 2e 62 44 6c            ss.bDl
28260 69 64 78 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20  idx ? "*" : "". 
28270 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
28280 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28290 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
282a0 46 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 7d  Free(&ss);.    }
282b0 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f  .  }.  . decode_
282c0 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
282d0 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63  ree(a);.  if( rc
282e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
282f0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
28300 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f  t_text(pCtx, (co
28310 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73  nst char*)s.p, s
28320 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  .n, SQLITE_TRANS
28330 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
28340 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
28350 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
28360 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66  tx, rc);.  }.  f
28370 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73  ts5BufferFree(&s
28380 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
28390 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
283a0 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  f user-defined s
283b0 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
283c0 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a  ts5_rowid()..*/.
283d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
283e0 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20  RowidFunction(. 
283f0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
28400 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
28410 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c   /* Function cal
28420 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  l context */.  i
28430 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28450 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  * Number of args
28460 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20   (always 2) */. 
28470 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
28480 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
28490 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
284a0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
284b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
284c0 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29  .  if( nArg==0 )
284d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
284e0 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
284f0 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73   "should be: fts
28500 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c  5_rowid(subject,
28510 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20   ....)", -1);.  
28520 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20  }else{.    zArg 
28530 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
28540 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
28550 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20  t(apVal[0]);.   
28560 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
28570 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73  stricmp(zArg, "s
28580 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  egment") ){.    
28590 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
285a0 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c 20 68      int segid, h
285b0 65 69 67 68 74 2c 20 70 67 6e 6f 3b 0a 20 20 20  eight, pgno;.   
285c0 20 20 20 69 66 28 20 6e 41 72 67 21 3d 34 20 29     if( nArg!=4 )
285d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
285e0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
285f0 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Ctx, .          
28600 20 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74    "should be: ft
28610 73 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e  s5_rowid('segmen
28620 74 27 2c 20 73 65 67 69 64 2c 20 68 65 69 67 68  t', segid, heigh
28630 74 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20  t, pgno))", -1. 
28640 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
28660 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  egid = sqlite3_v
28670 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31  alue_int(apVal[1
28680 5d 29 3b 0a 20 20 20 20 20 20 20 20 68 65 69 67  ]);.        heig
28690 68 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ht = sqlite3_val
286a0 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29  ue_int(apVal[2])
286b0 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d  ;.        pgno =
286c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
286d0 6e 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 20 20  nt(apVal[3]);.  
286e0 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46        iRowid = F
286f0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
28700 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
28710 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
28720 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
28730 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69  nt64(pCtx, iRowi
28740 64 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  d);.      }.#if 
28750 30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  0.    }else if( 
28760 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
28770 6d 70 28 7a 41 72 67 2c 20 22 73 74 61 72 74 2d  mp(zArg, "start-
28780 6f 66 2d 69 6e 64 65 78 22 29 20 29 7b 0a 20 20  of-index") ){.  
28790 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
287a0 20 20 20 20 20 20 69 6e 74 20 69 64 78 3b 0a 20        int idx;. 
287b0 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32       if( nArg!=2
287c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
287d0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
287e0 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20  (pCtx, .        
287f0 20 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a 20      "should be: 
28800 66 74 73 35 5f 72 6f 77 69 64 28 27 73 74 61 72  fts5_rowid('star
28810 74 2d 6f 66 2d 69 6e 64 65 78 27 2c 20 69 64 78  t-of-index', idx
28820 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29  )", -1.        )
28830 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28840 20 20 20 20 20 20 20 69 64 78 20 3d 20 73 71 6c         idx = sql
28850 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
28860 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20  pVal[1]);.      
28870 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
28880 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 64  SEGMENT_ROWID(id
28890 78 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20  x, 1, 0, 0);.   
288a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
288b0 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
288c0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d  iRowid);.      }
288d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
288e0 65 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e {.      sqlite
288f0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
28900 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66  Ctx, .        "f
28910 69 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35  irst arg to fts5
28920 5f 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65  _rowid() must be
28930 20 27 73 65 67 6d 65 6e 74 27 20 22 0a 20 20 20   'segment' ".   
28940 20 20 20 20 20 22 6f 72 20 27 73 74 61 72 74 2d       "or 'start-
28950 6f 66 2d 69 6e 64 65 78 27 22 0a 20 20 20 20 20  of-index'".     
28960 20 20 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b     , -1.      );
28970 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
28980 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
28990 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ed as part of re
289a0 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 46 54  gistering the FT
289b0 53 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64  S5 module with d
289c0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
289d0 63 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67  ction db. It reg
289e0 69 73 74 65 72 73 20 73 65 76 65 72 61 6c 20 75  isters several u
289f0 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
28a00 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  ar functions use
28a10 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35  ful.** with FTS5
28a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
28a30 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
28a40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
28a50 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
28a60 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  , some other.** 
28a70 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
28a80 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  e is returned in
28a90 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stead..*/.int sq
28aa0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
28ab0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
28ac0 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
28ad0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
28ae0 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ion(.      db, "
28af0 66 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c  fts5_decode", 2,
28b00 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
28b10 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
28b20 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20  ion, 0, 0.  );. 
28b30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28b40 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
28b50 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
28b60 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
28b70 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22  db, "fts5_rowid"
28b80 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
28b90 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46  8, 0, fts5RowidF
28ba0 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
28bb0 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72    );.  }.  retur
28bc0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
28bd0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
28be0 5f 46 54 53 35 20 2a 2f 0a                       _FTS5 */.